diff --git a/Podfile b/Podfile index 6c7886f..80af0ba 100644 --- a/Podfile +++ b/Podfile @@ -8,10 +8,12 @@ target 'suixinkan' do pod 'UMCommon' pod 'UMDevice' pod 'UMAPM' -end + # 微信 Open SDK:仅接入分享能力,不调用支付 API。 + pod 'WechatOpenSDK-XCFramework', '~> 2.0.4' -target 'suixinkanTests' do - inherit! :search_paths + target 'suixinkanTests' do + inherit! :search_paths + end end post_install do |installer| diff --git a/Podfile.lock b/Podfile.lock index b0d0a9d..48e9e52 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -11,6 +11,7 @@ PODS: - UMCommon (7.5.11): - UMDevice - UMDevice (3.6.0) + - WechatOpenSDK-XCFramework (2.0.5) DEPENDENCIES: - AMap3DMap-NO-IDFA @@ -19,6 +20,7 @@ DEPENDENCIES: - UMAPM - UMCommon - UMDevice + - WechatOpenSDK-XCFramework (~> 2.0.4) SPEC REPOS: trunk: @@ -29,6 +31,7 @@ SPEC REPOS: - UMAPM - UMCommon - UMDevice + - WechatOpenSDK-XCFramework SPEC CHECKSUMS: AMap3DMap-NO-IDFA: f53ee0cb33db83c1a08856b5995e53a0c2096158 @@ -38,7 +41,8 @@ SPEC CHECKSUMS: UMAPM: ba9fbebe8dd2048b251c332ab0afc86e1ba5ea63 UMCommon: d652b3b372a801b36db203f5b546ab3e15676898 UMDevice: 20b7b3c37a36b2c5c7ca8b5a54386ff9ed2b3b19 + WechatOpenSDK-XCFramework: ff342ae616bb86df3d236aca38059dfd4bc4a949 -PODFILE CHECKSUM: b2f49c71df3a1aca1cf08d192e467a8be772283c +PODFILE CHECKSUM: f48a71990c19e75f00e16701179b4f160e74986f COCOAPODS: 1.16.2 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index b0d0a9d..48e9e52 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -11,6 +11,7 @@ PODS: - UMCommon (7.5.11): - UMDevice - UMDevice (3.6.0) + - WechatOpenSDK-XCFramework (2.0.5) DEPENDENCIES: - AMap3DMap-NO-IDFA @@ -19,6 +20,7 @@ DEPENDENCIES: - UMAPM - UMCommon - UMDevice + - WechatOpenSDK-XCFramework (~> 2.0.4) SPEC REPOS: trunk: @@ -29,6 +31,7 @@ SPEC REPOS: - UMAPM - UMCommon - UMDevice + - WechatOpenSDK-XCFramework SPEC CHECKSUMS: AMap3DMap-NO-IDFA: f53ee0cb33db83c1a08856b5995e53a0c2096158 @@ -38,7 +41,8 @@ SPEC CHECKSUMS: UMAPM: ba9fbebe8dd2048b251c332ab0afc86e1ba5ea63 UMCommon: d652b3b372a801b36db203f5b546ab3e15676898 UMDevice: 20b7b3c37a36b2c5c7ca8b5a54386ff9ed2b3b19 + WechatOpenSDK-XCFramework: ff342ae616bb86df3d236aca38059dfd4bc4a949 -PODFILE CHECKSUM: b2f49c71df3a1aca1cf08d192e467a8be772283c +PODFILE CHECKSUM: f48a71990c19e75f00e16701179b4f160e74986f COCOAPODS: 1.16.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 0723484..5a6dda6 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -9,12 +9,12 @@ /* Begin PBXAggregateTarget section */ 09FABB7D06BB8D3958515FB15B4E7971 /* UMCommon */ = { isa = PBXAggregateTarget; - buildConfigurationList = 48C2A83619BC707A3CCF5BE81DE24CEB /* Build configuration list for PBXAggregateTarget "UMCommon" */; + buildConfigurationList = 4BD363A7955A50B752C0F2EE46DF82FA /* Build configuration list for PBXAggregateTarget "UMCommon" */; buildPhases = ( - 94278C9AEF05D9A76DE75DA7EE2B7101 /* [CP] Copy XCFrameworks */, + EF0E3FC9B6EE1A9C908433C323228B7C /* [CP] Copy XCFrameworks */, ); dependencies = ( - A885442A3C8377F7D96C283D098D8BCD /* PBXTargetDependency */, + 21EC4402F23CC89322584C4190C64981 /* PBXTargetDependency */, ); name = UMCommon; }; @@ -24,7 +24,7 @@ buildPhases = ( ); dependencies = ( - 57BFF03A985F23A63D3A69772A021169 /* PBXTargetDependency */, + AF80A180C5B3841DFC72A45C419B14BC /* PBXTargetDependency */, ); name = "AMapLocation-NO-IDFA"; }; @@ -34,13 +34,23 @@ buildPhases = ( ); dependencies = ( - 6E91429DA52A47FA7BF0FB651314A94F /* PBXTargetDependency */, + 29F474965F0AB7D17DB4A3D89EA9E86F /* PBXTargetDependency */, ); name = "AMapSearch-NO-IDFA"; }; + 7F18C31A804695333763EEC303E265D7 /* WechatOpenSDK-XCFramework */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 96B7158D5435EB95E2DC0D0FB8F01241 /* Build configuration list for PBXAggregateTarget "WechatOpenSDK-XCFramework" */; + buildPhases = ( + 6C1F0AE00B88ED4F09755948A825C8EB /* [CP] Copy XCFrameworks */, + ); + dependencies = ( + ); + name = "WechatOpenSDK-XCFramework"; + }; 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */ = { isa = PBXAggregateTarget; - buildConfigurationList = ECDE59CD23CDA40B37AFA91EBEDBEC23 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */; + buildConfigurationList = 946C13012BDBDC56DC9D26E19BA9D129 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */; buildPhases = ( ); dependencies = ( @@ -53,15 +63,15 @@ buildPhases = ( ); dependencies = ( - 118DBC8E39021482F2E7B928B983789B /* PBXTargetDependency */, + 39E8D398FFF9E2EF5EFCC030000214A6 /* PBXTargetDependency */, ); name = "AMap3DMap-NO-IDFA"; }; CEB9AD2C3CFC208BFBE1F22F5EC3E1FC /* UMDevice */ = { isa = PBXAggregateTarget; - buildConfigurationList = 4AAF0793F66CFAFB6F677F2646CBEB54 /* Build configuration list for PBXAggregateTarget "UMDevice" */; + buildConfigurationList = B9E2AB2044DB991A9B55D980CEBF2D9A /* Build configuration list for PBXAggregateTarget "UMDevice" */; buildPhases = ( - 647C44114FEF22D16E0EB22CA7A7985F /* [CP] Copy XCFrameworks */, + EFB006F9E64CF4C9C37AA7A9DEC5BE68 /* [CP] Copy XCFrameworks */, ); dependencies = ( ); @@ -74,282 +84,533 @@ 47CF44479ABE0A5C18DEDA0F07935DF1 /* [CP] Copy XCFrameworks */, ); dependencies = ( - BC1788A6BEB4408C2B38DA7DAC054963 /* PBXTargetDependency */, + 4EB0F71C76E065029AE9C426A2B43B81 /* PBXTargetDependency */, ); name = UMAPM; }; /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2679DE061DC2B5340F8415D162B5204F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */; }; - 58366B551D12CE8C3BBF73A6310C1400 /* Pods-suixinkanTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5751A9029355D65CC754769C67D37B6A /* Pods-suixinkanTests-dummy.m */; }; - 5FD052FC538BCC103FA39B596EE4B302 /* Pods-suixinkan-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6217937D721C5627A69DFD5C31223419 /* Pods-suixinkan-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 92ABE5E274BE32067142E9ACDF442FC9 /* Pods-suixinkan-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 152FD3226D4E443D2FA757BD8D52055A /* Pods-suixinkan-dummy.m */; }; + 1B4E84392BCAE40B8D02294001544906 /* Pods-suixinkanTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 65EE9CD76EF8BD358253184A5FA8B069 /* Pods-suixinkanTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 38345B1EC1DA5F3668EE44701253E92A /* Pods-suixinkan-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BF228B17BC7260C40143BD13BD131504 /* Pods-suixinkan-dummy.m */; }; + 854C28C6CC7D858B9645ED10D409AF6C /* Pods-suixinkan-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CE36A961B0F78784EC9BFE7F48C84F82 /* Pods-suixinkan-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8AA66BD0572CCDC71153FEA95C7AB666 /* Pods-suixinkanTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BBC4E88072A58FC7DD14D5BC2316725E /* Pods-suixinkanTests-dummy.m */; }; + 914AE43A691016D126083E13CFD8919F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */; }; + 9EDCFA51CF55ABD87CD178D9700B89C7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 03CABC81F0EF30E05981B30779DCD860 /* PBXContainerItemProxy */ = { + 067A6759ACA9A549384C729E1010EEB2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; remoteInfo = "AMapFoundation-NO-IDFA"; }; - 1B322441D3420BF8297C52ECF1D5413E /* PBXContainerItemProxy */ = { + 21C4E3AF810B766F005A0D66D3AB059F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 4BD4E22D3419D68A85BDD6119CB37C6C; - remoteInfo = "AMapLocation-NO-IDFA"; + remoteGlobalIDString = 09FABB7D06BB8D3958515FB15B4E7971; + remoteInfo = UMCommon; }; - 24005C1FF0EC74F5AE07BBAB0C662A3A /* PBXContainerItemProxy */ = { + 24A06925FD6662781797D78547B19FC7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7F18C31A804695333763EEC303E265D7; + remoteInfo = "WechatOpenSDK-XCFramework"; + }; + 2F48F1B754086F0F2514AA521AB8B493 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 4F1379598302C9160590B3650C10E1A5; remoteInfo = "AMapSearch-NO-IDFA"; }; - 2494DD16B8109B1AE8CB05BBF309FB1A /* PBXContainerItemProxy */ = { + 33B5943FAAD2EDE37C3C94F327FA50BC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4BD4E22D3419D68A85BDD6119CB37C6C; + remoteInfo = "AMapLocation-NO-IDFA"; + }; + 3D12EEA2C94F5E7D1A04E3DCB8056418 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC; remoteInfo = UMDevice; }; - 2BA425E7F16B465A25B138FFBB01C9F0 /* PBXContainerItemProxy */ = { + 849BA746108EE0BE0F41CAF99BCF009C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 09FABB7D06BB8D3958515FB15B4E7971; + remoteInfo = UMCommon; + }; + 991CAE88F0A4725CB8E8F174974E5B98 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; + remoteInfo = "AMapFoundation-NO-IDFA"; + }; + A9B64CB2E1958A4EBD9D7B1E35942161 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC; remoteInfo = UMDevice; }; - 2E6078C0AE86C2252F001F14BFC8C160 /* PBXContainerItemProxy */ = { + ADE47395DAB29611CE948513B2F0F2E5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; remoteInfo = "AMapFoundation-NO-IDFA"; }; - 40CF718E505C28CD277890F5A4F829C7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 09FABB7D06BB8D3958515FB15B4E7971; - remoteInfo = UMCommon; - }; - 5BB3DFF85E7F9CC211D73DA6903B7C72 /* PBXContainerItemProxy */ = { + BD91D75C44C68F52A94B116B7D1294F4 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; remoteInfo = "AMapFoundation-NO-IDFA"; }; - 9F70C62E4FEEA257FE75373D9E3792D5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; - remoteInfo = "AMapFoundation-NO-IDFA"; - }; - B6DFCC4DF7A833C21B49A33F4577A4B2 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 09FABB7D06BB8D3958515FB15B4E7971; - remoteInfo = UMCommon; - }; - C0BEBB9A080760B44BCF644F9B4DEFCE /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = F1E09035B7675D89EC69B16728E2833E; - remoteInfo = UMAPM; - }; - F00519A1BB8E3CD7DFB82DFF9CBF48B8 /* PBXContainerItemProxy */ = { + C0AB8415F3749D034999E1F84151D767 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = B44FB02BD2D3FEAD1F36808AD405A543; remoteInfo = "AMap3DMap-NO-IDFA"; }; + E0029779384156C3352043F0C3AFFE56 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F1E09035B7675D89EC69B16728E2833E; + remoteInfo = UMAPM; + }; + F7B6C2F4ACE4C28AB6488EF406B7E9D1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1DE17B7C77CD95CB67DF1197965B76AB; + remoteInfo = "Pods-suixinkan"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 00B6141D8B9E47A4A9ED83A2B569081A /* AMapLocationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationKit.h; path = AMapLocationKit.framework/Headers/AMapLocationKit.h; sourceTree = ""; }; - 0266B56D516BC1D3796FF8760B703722 /* MAAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationView.h; path = MAMapKit.framework/Headers/MAAnnotationView.h; sourceTree = ""; }; - 02990202241575B70CDB5AFF2EE8DE81 /* MAOfflineItemCommonCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemCommonCity.h; path = MAMapKit.framework/Headers/MAOfflineItemCommonCity.h; sourceTree = ""; }; - 031B2DE06F6B2634049776117B71A513 /* MAMVTTileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlay.h; path = MAMapKit.framework/Headers/MAMVTTileOverlay.h; sourceTree = ""; }; - 04CAEC1E43034458F2B81A75CEF78B78 /* AMapLocation-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapLocation-NO-IDFA.release.xcconfig"; sourceTree = ""; }; - 04CC5AD075A77037FAA57D42DADFA706 /* AMapUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapUtility.h; path = AMapFoundationKit.framework/Headers/AMapUtility.h; sourceTree = ""; }; - 06103B4491A79A8C329F59407D7B199C /* UMCommon.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMCommon.xcframework; path = UMCommon_7.5.11/UMCommon.xcframework; sourceTree = ""; }; - 073A01688C5B317E2C2A83DF1DB82751 /* MAParticleOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlay.h; path = MAMapKit.framework/Headers/MAParticleOverlay.h; sourceTree = ""; }; - 08D4547F6827F0ADEF8A222AB0A5F61E /* AMapServices.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapServices.h; path = AMapFoundationKit.framework/Headers/AMapServices.h; sourceTree = ""; }; - 091433D2446EFEAC6F073B89C4882424 /* MAMapKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapKit.h; path = MAMapKit.framework/Headers/MAMapKit.h; sourceTree = ""; }; - 09260A89A2D7F909A673270AAB86D14D /* MAHeatMapTileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapTileOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapTileOverlay.h; sourceTree = ""; }; - 097851041BAAA1CD1BDDADA6312D97DE /* AMapFoundationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationKit.h; path = AMapFoundationKit.framework/Headers/AMapFoundationKit.h; sourceTree = ""; }; - 0B5666BC0A6FA625BF3980C906811B56 /* AMapLocationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationManager.h; path = AMapLocationKit.framework/Headers/AMapLocationManager.h; sourceTree = ""; }; - 0C16D864D673B3EDA83FFB2B6D1F37A7 /* MAOfflineItemNationWide.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemNationWide.h; path = MAMapKit.framework/Headers/MAOfflineItemNationWide.h; sourceTree = ""; }; - 0C90B527958768F63FCAFE14DD169C95 /* Pods-suixinkan-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-Info.plist"; sourceTree = ""; }; - 0C9977EA53E5D167FD76B43D43DA286E /* MARouteOverlayModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlayModel.h; path = MAMapKit.framework/Headers/MARouteOverlayModel.h; sourceTree = ""; }; - 0E1E165E563A78BDAC84339A42650182 /* MAArcRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArcRenderer.h; path = MAMapKit.framework/Headers/MAArcRenderer.h; sourceTree = ""; }; - 11785DC4376F033B3EEBFE0C476EEB41 /* MAGroundOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlay.h; path = MAMapKit.framework/Headers/MAGroundOverlay.h; sourceTree = ""; }; - 12EC8F963920468FAA03D71CC3B496D2 /* MAParticleOverlayOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayOptions.h; path = MAMapKit.framework/Headers/MAParticleOverlayOptions.h; sourceTree = ""; }; - 13282EC9D188AFC53A46BE439A55B43C /* Pods-suixinkanTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.release.xcconfig"; sourceTree = ""; }; - 152FD3226D4E443D2FA757BD8D52055A /* Pods-suixinkan-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-suixinkan-dummy.m"; sourceTree = ""; }; - 156019BEBBE28E51096668CAE2C12C35 /* AMapGeoFenceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceManager.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceManager.h; sourceTree = ""; }; - 1B7465A72120AF417FD5F1F34AD33AD4 /* Pods-suixinkanTests */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "Pods-suixinkanTests"; path = "libPods-suixinkanTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F434C340EE152947804F55B6AE07219 /* UMCommon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCommon.debug.xcconfig; sourceTree = ""; }; - 1F9C8D9E5541433742FD39F384AE2B9B /* MAOfflineCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineCity.h; path = MAMapKit.framework/Headers/MAOfflineCity.h; sourceTree = ""; }; - 1FC0EEEF15C3563046CFB7D8F6D3C0A9 /* UMAPM.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMAPM.debug.xcconfig; sourceTree = ""; }; - 27709FDBE6C515AC7AA5E0790EC1622B /* MAPointAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPointAnnotation.h; path = MAMapKit.framework/Headers/MAPointAnnotation.h; sourceTree = ""; }; - 2AB66D9A11828BB1CEDA9B32C0E8D54C /* MACustomBuildingOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomBuildingOverlayRenderer.h; path = MAMapKit.framework/Headers/MACustomBuildingOverlayRenderer.h; sourceTree = ""; }; - 2B90865ABB9627D294333A5A122ADC4E /* UMCommon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCommon.release.xcconfig; sourceTree = ""; }; - 3129F26CCB5C8040FD844D2E8F28C538 /* MAUserLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAUserLocation.h; path = MAMapKit.framework/Headers/MAUserLocation.h; sourceTree = ""; }; - 37B405B9E350B2DE5799E8788BB5EB2D /* MAOfflineProvince.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineProvince.h; path = MAMapKit.framework/Headers/MAOfflineProvince.h; sourceTree = ""; }; + 03ECB029C3BA6719F3CE27704FE9866A /* AMapNearbySearchManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbySearchManager.h; path = AMapSearchKit.framework/Headers/AMapNearbySearchManager.h; sourceTree = ""; }; + 0560C72601DFB7648983A59E3A8630CF /* Pods-suixinkanTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-Info.plist"; sourceTree = ""; }; + 05E4BFEB8A5EC2DC86095F225B502975 /* MAMVTTileOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMVTTileOverlayRenderer.h; sourceTree = ""; }; + 05F51B66A225DC56F48A197D8DE3AB8E /* MAHeatMapVectorOverlayRender.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlayRender.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlayRender.h; sourceTree = ""; }; + 069E056FF5EF11FB955BE3C9637228BF /* Pods-suixinkan-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkan-acknowledgements.markdown"; sourceTree = ""; }; + 081BB8B4C329A89813BAFEFD92F278DC /* MAArc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArc.h; path = MAMapKit.framework/Headers/MAArc.h; sourceTree = ""; }; + 0CB65467D9BC6FB4CA43DBDEE8046DC8 /* MACustomCalloutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomCalloutView.h; path = MAMapKit.framework/Headers/MACustomCalloutView.h; sourceTree = ""; }; + 0D4EF6D40137F0A4CECF2C4CC617B5BA /* MAPolygon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygon.h; path = MAMapKit.framework/Headers/MAPolygon.h; sourceTree = ""; }; + 0E97FA02BDFE7464E96DDDA67672EAB8 /* MAMapStatus.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapStatus.h; path = MAMapKit.framework/Headers/MAMapStatus.h; sourceTree = ""; }; + 0F67BAD007D9313441603E8FD0C72BDE /* MAMapView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapView.h; path = MAMapKit.framework/Headers/MAMapView.h; sourceTree = ""; }; + 11E7551362FA5BAEED7A7CF2E5A5998B /* AMapLocationRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationRegionObj.h; path = AMapLocationKit.framework/Headers/AMapLocationRegionObj.h; sourceTree = ""; }; + 125064997C0EDA842FA880F67BB3D06F /* AMap3DMap-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; + 12C40249116DE0574E7DC16E3A5C4D06 /* AMapLocationCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationCommonObj.h; path = AMapLocationKit.framework/Headers/AMapLocationCommonObj.h; sourceTree = ""; }; + 1733284B424C8D089B1C8E9C6167E533 /* MAPolygonRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygonRenderer.h; path = MAMapKit.framework/Headers/MAPolygonRenderer.h; sourceTree = ""; }; + 1B7465A72120AF417FD5F1F34AD33AD4 /* Pods-suixinkanTests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-suixinkanTests"; path = Pods_suixinkanTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1BABD1E2BA172FF891B45D69723A8FA6 /* MAMapSnapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapSnapshot.h; path = MAMapKit.framework/Headers/MAMapSnapshot.h; sourceTree = ""; }; + 21F64182FA5AB6FB454C619FF610CB14 /* AMap.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = AMap.bundle; path = MAMapKit.framework/AMap.bundle; sourceTree = ""; }; + 21F8229FFC8693946D569FF6D8C1FA3F /* AMapSearchVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchVersion.h; path = AMapSearchKit.framework/Headers/AMapSearchVersion.h; sourceTree = ""; }; + 24067F4DDEF17AFA8641D4550327134F /* MAAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotation.h; path = MAMapKit.framework/Headers/MAAnnotation.h; sourceTree = ""; }; + 258B890CD915D0C02409050126A34A78 /* MAHeatMapVectorGridOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlayRenderer.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlayRenderer.h; sourceTree = ""; }; + 267A3DEBF9AF353E463F539354095601 /* AMapSearchKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapSearchKit.framework; sourceTree = ""; }; + 2695372829B2B3DE46736249F9327CB3 /* AMapFoundationConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationConst.h; path = AMapFoundationKit.framework/Headers/AMapFoundationConst.h; sourceTree = ""; }; + 2B1E1B290F1753A341C14CED0A6F3F4D /* UMAPM.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMAPM.release.xcconfig; sourceTree = ""; }; + 2B483D35C6A5C6886C8305F8655E02EB /* UMAPM.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMAPM.xcframework; path = UMAPM_2.0.7/UMAPM.xcframework; sourceTree = ""; }; + 2BC8EBA3D7E41F9EA60264E82C2C3D54 /* MAGeodesicPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeodesicPolyline.h; path = MAMapKit.framework/Headers/MAGeodesicPolyline.h; sourceTree = ""; }; + 2D9188A08F7F86FBF3EBB3CD93699D53 /* Pods-suixinkan.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.release.xcconfig"; sourceTree = ""; }; + 2EC3D8175A3DC6341FD9BA09E1108BD1 /* MAMultiTexturePolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiTexturePolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiTexturePolylineRenderer.h; sourceTree = ""; }; + 308336B8D46677C30433D2DCCD115731 /* AMapURLSearchConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearchConfig.h; path = AMapFoundationKit.framework/Headers/AMapURLSearchConfig.h; sourceTree = ""; }; + 311EEA5B46D1D7FAAA7E30958EBFE969 /* MAOfflineMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMap.h; path = MAMapKit.framework/Headers/MAOfflineMap.h; sourceTree = ""; }; + 380659BF8742AC4FF0E4359B7E02FBEC /* MAOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlay.h; path = MAMapKit.framework/Headers/MAOverlay.h; sourceTree = ""; }; 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 3B45F0C05BA389A6BD05B5D88823DCE3 /* Pods-suixinkan.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkan.modulemap"; sourceTree = ""; }; - 3CCBB317847E992AC63FB7FD596E3979 /* MATouchPoi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATouchPoi.h; path = MAMapKit.framework/Headers/MATouchPoi.h; sourceTree = ""; }; - 3E21626C6A57F4A608DC6791B3FECA90 /* Pods-suixinkan-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-acknowledgements.plist"; sourceTree = ""; }; - 44D9997FC4C41C04A96A560BCC0966CC /* AMapURLSearchConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearchConfig.h; path = AMapFoundationKit.framework/Headers/AMapURLSearchConfig.h; sourceTree = ""; }; - 474132026A03DAD67D4268D220818837 /* MATerrainOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlayRenderer.h; path = MAMapKit.framework/Headers/MATerrainOverlayRenderer.h; sourceTree = ""; }; - 4930D33BD830768CC42D00FF626DFFB6 /* AMapNearbyUploadInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbyUploadInfo.h; path = AMapSearchKit.framework/Headers/AMapNearbyUploadInfo.h; sourceTree = ""; }; - 4994797E0DE9173DEE54C040E8E7FB42 /* MAOfflineMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMap.h; path = MAMapKit.framework/Headers/MAOfflineMap.h; sourceTree = ""; }; - 49D4CBF2C1A637182BFECB5CE2FAAACE /* MAHeatMapVectorOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlay.h; sourceTree = ""; }; - 4AA674D62AF616A0CFA187129B0AC6A9 /* AMapSearchObjV1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObjV1.h; path = AMapSearchKit.framework/Headers/AMapSearchObjV1.h; sourceTree = ""; }; - 505594E5041E52B2A5DA9C508C97170E /* MALineDrawType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MALineDrawType.h; path = MAMapKit.framework/Headers/MALineDrawType.h; sourceTree = ""; }; - 5245F4EAAB08EDA40AD9067E8FABC79D /* AMapGeoFenceError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceError.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceError.h; sourceTree = ""; }; - 5284B7E1A914039C3E2614B06F371EE1 /* MAOverlayPathRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayPathRenderer.h; path = MAMapKit.framework/Headers/MAOverlayPathRenderer.h; sourceTree = ""; }; - 533984F7B44BF7ADDAE82AA6A9781C34 /* MACustomCalloutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomCalloutView.h; path = MAMapKit.framework/Headers/MACustomCalloutView.h; sourceTree = ""; }; - 536C97B8F3C900DF780545FDF81CFD5D /* MAMVTTileOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMVTTileOverlayRenderer.h; sourceTree = ""; }; - 53F4822C85EE470453AB1B7FEDF791E5 /* MAMultiPointOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlay.h; path = MAMapKit.framework/Headers/MAMultiPointOverlay.h; sourceTree = ""; }; - 54356B35640D6CD8108AE95EF1787EBF /* UMDevice.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMDevice.debug.xcconfig; sourceTree = ""; }; - 55216DCF8A433E77D4B0F1BA3111CD89 /* UMAPM-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMAPM-xcframeworks.sh"; sourceTree = ""; }; - 562FD061ADDAF8444BA8350FA84AAD99 /* MAParticleOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayRenderer.h; path = MAMapKit.framework/Headers/MAParticleOverlayRenderer.h; sourceTree = ""; }; - 566483E2F39FBFEF5D205B6FC589F7AD /* MAAnimatedAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnimatedAnnotation.h; path = MAMapKit.framework/Headers/MAAnimatedAnnotation.h; sourceTree = ""; }; - 56C9C66B0D24B40636D6F41354B90769 /* MACircleRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircleRenderer.h; path = MAMapKit.framework/Headers/MACircleRenderer.h; sourceTree = ""; }; - 5751A9029355D65CC754769C67D37B6A /* Pods-suixinkanTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-suixinkanTests-dummy.m"; sourceTree = ""; }; + 38F697EA154D9687F844A0F0C832E889 /* MAParticleOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayRenderer.h; path = MAMapKit.framework/Headers/MAParticleOverlayRenderer.h; sourceTree = ""; }; + 3A16DCDE527DE0F46DBB2B7A4A10C9FF /* AMapLocationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationKit.h; path = AMapLocationKit.framework/Headers/AMapLocationKit.h; sourceTree = ""; }; + 3CE7B2EE0FE95BBD834825FA4D0571C5 /* Pods-suixinkanTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.debug.xcconfig"; sourceTree = ""; }; + 3D27E75D0D982BBB14DF16A6604AF8CD /* AMapSearch-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.release.xcconfig"; sourceTree = ""; }; + 3F4A6FE6F5896BC28D894A3C56F4458B /* MAMapView+Resource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MAMapView+Resource.h"; path = "MAMapKit.framework/Headers/MAMapView+Resource.h"; sourceTree = ""; }; + 3F6E024A4BC8B4F7C84F62B453336C6B /* MAOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayRenderer.h; path = MAMapKit.framework/Headers/MAOverlayRenderer.h; sourceTree = ""; }; + 3F99AF4BEDBB1A46A1B2DDA808C60C8A /* MAOfflineItemMunicipality.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemMunicipality.h; path = MAMapKit.framework/Headers/MAOfflineItemMunicipality.h; sourceTree = ""; }; + 44674EC1944BB8CC20D1FB811A28DA3F /* Pods-suixinkan-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-acknowledgements.plist"; sourceTree = ""; }; + 45AB9E4A609CD01DF5027D580BD33218 /* MAMapCustomStyleOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapCustomStyleOptions.h; path = MAMapKit.framework/Headers/MAMapCustomStyleOptions.h; sourceTree = ""; }; + 47DAF61B95087ADC814BD2F6DFD04D32 /* MAMultiPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPoint.h; path = MAMapKit.framework/Headers/MAMultiPoint.h; sourceTree = ""; }; + 495C8FA8FA1E743C3D041B5066D249A1 /* MAParticleOverlayOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayOptions.h; path = MAMapKit.framework/Headers/MAParticleOverlayOptions.h; sourceTree = ""; }; + 49D1A8B85287979271F3D66B8968FAAD /* AMapSearchKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchKit.h; path = AMapSearchKit.framework/Headers/AMapSearchKit.h; sourceTree = ""; }; + 4F88C9D2A26698191E3F0BAB6E73C1D6 /* MAUserLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAUserLocation.h; path = MAMapKit.framework/Headers/MAUserLocation.h; sourceTree = ""; }; + 505E9C4F754A74BBF0BF433A1ABAB2D3 /* WechatOpenSDK-XCFramework.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "WechatOpenSDK-XCFramework.release.xcconfig"; sourceTree = ""; }; + 511E223F968C9463398F92B7634AA4C1 /* MAOfflineItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItem.h; path = MAMapKit.framework/Headers/MAOfflineItem.h; sourceTree = ""; }; + 514765B300FD9BCBE77BA16182363311 /* AMapFoundationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapFoundationKit.framework; sourceTree = ""; }; + 56845156741368511567C6ED67855FBE /* MAOfflineItemNationWide.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemNationWide.h; path = MAMapKit.framework/Headers/MAOfflineItemNationWide.h; sourceTree = ""; }; + 57EF70D81C78649244E4B0F2BD22C385 /* MAOfflineProvince.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineProvince.h; path = MAMapKit.framework/Headers/MAOfflineProvince.h; sourceTree = ""; }; + 58447B69191400A703B8F1AA0E907906 /* AMapUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapUtility.h; path = AMapFoundationKit.framework/Headers/AMapUtility.h; sourceTree = ""; }; + 5AE4ED04FC4934C3CFE1803544F7E599 /* WechatOpenSDK.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; path = WechatOpenSDK.xcframework; sourceTree = ""; }; + 5B9FB578C59C2D6A42E4137C2BF6F3F4 /* MATerrainOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlayRenderer.h; path = MAMapKit.framework/Headers/MATerrainOverlayRenderer.h; sourceTree = ""; }; 5BD109278933E8C2F269E5DCEC3A5376 /* Pods-suixinkan */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-suixinkan"; path = Pods_suixinkan.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5CBAF14B34BA404F4445714F67884B94 /* MAOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlay.h; path = MAMapKit.framework/Headers/MAOverlay.h; sourceTree = ""; }; - 5F615AE1876330A95AB31D614B6AF521 /* MAAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotation.h; path = MAMapKit.framework/Headers/MAAnnotation.h; sourceTree = ""; }; - 5F6F4BFA651FF8E271612E296471B8C1 /* AMapSearchAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchAPI.h; path = AMapSearchKit.framework/Headers/AMapSearchAPI.h; sourceTree = ""; }; - 60E7CA113B43A5A2D0B1418206FBA9A8 /* AMapCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapCommonObj.h; path = AMapSearchKit.framework/Headers/AMapCommonObj.h; sourceTree = ""; }; - 60F4A5AF1D010D7E966BEEC384582AAE /* AMapFoundationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationVersion.h; path = AMapFoundationKit.framework/Headers/AMapFoundationVersion.h; sourceTree = ""; }; - 6217937D721C5627A69DFD5C31223419 /* Pods-suixinkan-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-suixinkan-umbrella.h"; sourceTree = ""; }; - 639847CA0DD08F98F16B9539C3772927 /* MAPathShowRange.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPathShowRange.h; path = MAMapKit.framework/Headers/MAPathShowRange.h; sourceTree = ""; }; - 640C1C6FF073CF6BDF32A98299CC8B26 /* MATileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATileOverlay.h; path = MAMapKit.framework/Headers/MATileOverlay.h; sourceTree = ""; }; - 65AB21D863615A6A59E6C7F152C8912E /* UMDevice-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMDevice-xcframeworks.sh"; sourceTree = ""; }; - 6668C1B4F8D624B8AA2F9A5A3519E4F1 /* MAOfflineItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItem.h; path = MAMapKit.framework/Headers/MAOfflineItem.h; sourceTree = ""; }; - 6831B314F45EB77FB7BBA52758001C23 /* AMapSearch-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.release.xcconfig"; sourceTree = ""; }; - 69D972EC0D2130742023356B0B668D9D /* AMapSearchError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchError.h; path = AMapSearchKit.framework/Headers/AMapSearchError.h; sourceTree = ""; }; - 6CB05FF4490FB9F75B6C53D8C13DFFF2 /* AMapLocation-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapLocation-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; - 6D5ECB5AB29F05C16FFA1428CBBAE729 /* MAMultiPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPolyline.h; path = MAMapKit.framework/Headers/MAMultiPolyline.h; sourceTree = ""; }; - 6D788A0FE380A691B79995264AA0FCB3 /* MAPolygonRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygonRenderer.h; path = MAMapKit.framework/Headers/MAPolygonRenderer.h; sourceTree = ""; }; - 6D803B5ADF7C51FBED92392BFF26A801 /* AMapFoundationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapFoundationKit.framework; sourceTree = ""; }; - 6E30647781C1277088E9F767E5324F93 /* UMDevice.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMDevice.release.xcconfig; sourceTree = ""; }; - 6F06A0B48AE05BAF86BDE766CEBB7E39 /* AMapNearbySearchManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbySearchManager.h; path = AMapSearchKit.framework/Headers/AMapNearbySearchManager.h; sourceTree = ""; }; - 6F31495AF08ABD9129D86C3CA8BA9D26 /* AMapFoundation-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapFoundation-NO-IDFA.release.xcconfig"; sourceTree = ""; }; - 6F9281D9C3A604258A466E61ABC3CD2A /* MAIndoorInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAIndoorInfo.h; path = MAMapKit.framework/Headers/MAIndoorInfo.h; sourceTree = ""; }; - 723120B072CFE42872B403185FEF3480 /* MAAnnotationMoveAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationMoveAnimation.h; path = MAMapKit.framework/Headers/MAAnnotationMoveAnimation.h; sourceTree = ""; }; - 72D4237878A7AEB36C50F21B2E47E0C0 /* Pods-suixinkanTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-acknowledgements.plist"; sourceTree = ""; }; - 72D9F37AD28C464FC9E4C647C035D78D /* AMapSearch-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; - 75EB2D6FB4EE88BC1048838C179EEF4D /* MAGroundOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlayRenderer.h; path = MAMapKit.framework/Headers/MAGroundOverlayRenderer.h; sourceTree = ""; }; - 788A9B3C4C49A7E038EB940CADFB95B3 /* MAShape.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAShape.h; path = MAMapKit.framework/Headers/MAShape.h; sourceTree = ""; }; - 7BDF2E8F09ACEE3D8A741F23C976A9AB /* UMAPM.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMAPM.release.xcconfig; sourceTree = ""; }; - 7CE4B53A879766A65A2D9D04B4047721 /* MAUserLocationRepresentation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAUserLocationRepresentation.h; path = MAMapKit.framework/Headers/MAUserLocationRepresentation.h; sourceTree = ""; }; - 7EDAE378C1569DD3368C0624FDE2113D /* AMapLocationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapLocationKit.framework; sourceTree = ""; }; - 80FE6640DC269829CB27B57AA19AC78A /* AMapSearchVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchVersion.h; path = AMapSearchKit.framework/Headers/AMapSearchVersion.h; sourceTree = ""; }; - 822D66077D2425E53D801DA303BC3F1E /* MAMapSnapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapSnapshot.h; path = MAMapKit.framework/Headers/MAMapSnapshot.h; sourceTree = ""; }; - 82D8815A46B6E4F430DF6D8307FECF15 /* AMapSearchKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapSearchKit.framework; sourceTree = ""; }; - 83299514396578C1E5347F754A2998BB /* MAMultiColoredPolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiColoredPolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiColoredPolylineRenderer.h; sourceTree = ""; }; - 840B76D96208FE5DA788BBDDBC878B89 /* UMDevice.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMDevice.xcframework; path = UMDevice_3.6.0/UMDevice.xcframework; sourceTree = ""; }; - 883E38D7EB9B5A729D6F3882C8BF08B2 /* AMapLocationRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationRegionObj.h; path = AMapLocationKit.framework/Headers/AMapLocationRegionObj.h; sourceTree = ""; }; - 8ABAEFB566BE1DB03713B43D575527E7 /* MAPolygon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygon.h; path = MAMapKit.framework/Headers/MAPolygon.h; sourceTree = ""; }; - 8B46D4EDC3A56E5C07C332C0BE1E1DB9 /* AMap3DMap-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.release.xcconfig"; sourceTree = ""; }; - 8D3F4C4F65AFDE0F50C860B0E7900AD2 /* MABaseEngineOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseEngineOverlay.h; path = MAMapKit.framework/Headers/MABaseEngineOverlay.h; sourceTree = ""; }; - 8E5CE8FA1404298163AA91D2C5EB7F51 /* MATileOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATileOverlayRenderer.h; path = MAMapKit.framework/Headers/MATileOverlayRenderer.h; sourceTree = ""; }; - 91B2B63459FD6E904D20268E048C8356 /* UMCommon-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMCommon-xcframeworks.sh"; sourceTree = ""; }; - 94F440BEB3117D12F0E6811057AE7277 /* AMapFoundation-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapFoundation-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; - 9566766E05187D5C2C6E18999A7451FD /* MATerrainOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlay.h; path = MAMapKit.framework/Headers/MATerrainOverlay.h; sourceTree = ""; }; - 98A592A35178D779293675BEAE7EB81F /* UMAPM.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMAPM.xcframework; path = UMAPM_2.0.7/UMAPM.xcframework; sourceTree = ""; }; - 9A7D23872A49D797E9324E74F5DC0B1D /* AMapSearchObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObj.h; path = AMapSearchKit.framework/Headers/AMapSearchObj.h; sourceTree = ""; }; - 9AD391E9A86B644737ABE2A7D9F3F0AA /* MAPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolyline.h; path = MAMapKit.framework/Headers/MAPolyline.h; sourceTree = ""; }; - 9AD3E737F26FD1C92ABC492C32373551 /* MAMapCustomStyleOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapCustomStyleOptions.h; path = MAMapKit.framework/Headers/MAMapCustomStyleOptions.h; sourceTree = ""; }; - 9CFCD57B2B7B92D7465507CADEFB0B66 /* MAMapView+Resource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MAMapView+Resource.h"; path = "MAMapKit.framework/Headers/MAMapView+Resource.h"; sourceTree = ""; }; + 5BDBFE9A3501719BF5A45FCF0782CDBE /* AMapLocationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationManager.h; path = AMapLocationKit.framework/Headers/AMapLocationManager.h; sourceTree = ""; }; + 5D2FAE9F6CE73F35242C57FADF198A4F /* MATerrainOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlay.h; path = MAMapKit.framework/Headers/MATerrainOverlay.h; sourceTree = ""; }; + 607B12309D4BBE0A374F5681BC22567B /* MAArcRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArcRenderer.h; path = MAMapKit.framework/Headers/MAArcRenderer.h; sourceTree = ""; }; + 61B7C8006610229F8A3485704A3944CF /* Pods-suixinkan.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.debug.xcconfig"; sourceTree = ""; }; + 632CBA3F863D4B4C036343CBE79395A0 /* AMapGeoFenceRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceRegionObj.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceRegionObj.h; sourceTree = ""; }; + 64240DCE9E380E0318667593766AB4D8 /* AMapURLSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearch.h; path = AMapFoundationKit.framework/Headers/AMapURLSearch.h; sourceTree = ""; }; + 64C0BEE472E88B93EB7D366E5B2597E4 /* UMDevice.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMDevice.xcframework; path = UMDevice_3.6.0/UMDevice.xcframework; sourceTree = ""; }; + 657980EFF8962794190BFF647D3FEF24 /* AMapGeoFenceError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceError.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceError.h; sourceTree = ""; }; + 65EE9CD76EF8BD358253184A5FA8B069 /* Pods-suixinkanTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-suixinkanTests-umbrella.h"; sourceTree = ""; }; + 664E58E6DDC2966578A2C9D32D9D8FFD /* MAGroundOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlayRenderer.h; path = MAMapKit.framework/Headers/MAGroundOverlayRenderer.h; sourceTree = ""; }; + 668A9B1E2D7B1954AE52ABE25041CC36 /* Pods-suixinkanTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkanTests-acknowledgements.markdown"; sourceTree = ""; }; + 68FB23F98494515B5F635B2080AC2D74 /* MAMultiPointOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlay.h; path = MAMapKit.framework/Headers/MAMultiPointOverlay.h; sourceTree = ""; }; + 6A16CCC3A9F4BA44294C343AAA01EC6A /* MAShape.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAShape.h; path = MAMapKit.framework/Headers/MAShape.h; sourceTree = ""; }; + 6DDB0F91BAEEA431301574B316329B0D /* MATouchPoi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATouchPoi.h; path = MAMapKit.framework/Headers/MATouchPoi.h; sourceTree = ""; }; + 72424614C718027B387FB239F679271E /* WechatOpenSDK-XCFramework-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "WechatOpenSDK-XCFramework-xcframeworks.sh"; sourceTree = ""; }; + 746BFCBA1ABA7DC28009805E10F58829 /* MATileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATileOverlay.h; path = MAMapKit.framework/Headers/MATileOverlay.h; sourceTree = ""; }; + 75399BCB7E0D56E144717DDCD6C7FBBC /* MAOfflineMapViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMapViewController.h; path = MAMapKit.framework/Headers/MAOfflineMapViewController.h; sourceTree = ""; }; + 764EBFD12BB5DBE470C3B3EE75778E69 /* AMapFoundationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationKit.h; path = AMapFoundationKit.framework/Headers/AMapFoundationKit.h; sourceTree = ""; }; + 78B6815DC0004C618630DC5100B63C80 /* MAGroundOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlay.h; path = MAMapKit.framework/Headers/MAGroundOverlay.h; sourceTree = ""; }; + 79F61EDF41457CD8F6AC99EEB203BDEF /* MATraceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceManager.h; path = MAMapKit.framework/Headers/MATraceManager.h; sourceTree = ""; }; + 7A8928E3841166C87F9104F3C7257ED1 /* MAAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationView.h; path = MAMapKit.framework/Headers/MAAnnotationView.h; sourceTree = ""; }; + 7A9B9169FDEDF62E64E2DE22F85610ED /* AMapSearchAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchAPI.h; path = AMapSearchKit.framework/Headers/AMapSearchAPI.h; sourceTree = ""; }; + 7D7597DC9C40CDD0257013247AFBE4C8 /* AMapCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapCommonObj.h; path = AMapSearchKit.framework/Headers/AMapCommonObj.h; sourceTree = ""; }; + 7FA9E9DE9F0DB76774F19BF713363C1C /* UMDevice.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMDevice.debug.xcconfig; sourceTree = ""; }; + 87983C1BFF90B26765DB26FA52DC8FBE /* MAParticleOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlay.h; path = MAMapKit.framework/Headers/MAParticleOverlay.h; sourceTree = ""; }; + 8954141270608938A38FD68585BFD293 /* Pods-suixinkanTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkanTests.modulemap"; sourceTree = ""; }; + 8A2882BF8F5DC25616C1ED02D8BADE8B /* AMapSearch-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; + 8C64DEFEB1E7F2C66D9E36F704EB2EDA /* Pods-suixinkan.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkan.modulemap"; sourceTree = ""; }; + 8D804F47730C24A80564C45691D62159 /* MAMapKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapKit.h; path = MAMapKit.framework/Headers/MAMapKit.h; sourceTree = ""; }; + 8E8D9B985354179A70BB4148A96CB106 /* AMapFoundationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationVersion.h; path = AMapFoundationKit.framework/Headers/AMapFoundationVersion.h; sourceTree = ""; }; + 930BB613D93B3F0743FE520201572148 /* Pods-suixinkanTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-acknowledgements.plist"; sourceTree = ""; }; + 93364FC6486AA57E263ACEAB802CA297 /* WechatOpenSDK-XCFramework.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "WechatOpenSDK-XCFramework.debug.xcconfig"; sourceTree = ""; }; + 9392453F7B8C8EC1DBC411A28840D283 /* MACircleRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircleRenderer.h; path = MAMapKit.framework/Headers/MACircleRenderer.h; sourceTree = ""; }; + 9A4789EE651F9A3985C6652F8EF58F6B /* UMCommon-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMCommon-xcframeworks.sh"; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9D9526FE1C100309F9585E25F5EB1162 /* Pods-suixinkan.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.debug.xcconfig"; sourceTree = ""; }; - 9FBBC30095C9C263948C70D42CE3473F /* AMapSearchKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchKit.h; path = AMapSearchKit.framework/Headers/AMapSearchKit.h; sourceTree = ""; }; - A00E8E0E9CF24E1C0B24103ADF91313A /* MATraceLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceLocation.h; path = MAMapKit.framework/Headers/MATraceLocation.h; sourceTree = ""; }; - A536BD3E1F7F32A53D4099C418F325BB /* AMapLocationCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationCommonObj.h; path = AMapLocationKit.framework/Headers/AMapLocationCommonObj.h; sourceTree = ""; }; - A876C5B5A750D9833A4CD9CAF0CF2374 /* MAOfflineMapViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMapViewController.h; path = MAMapKit.framework/Headers/MAOfflineMapViewController.h; sourceTree = ""; }; - A90986704790B300427D5525BEA0277B /* MAMapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = MAMapKit.framework; sourceTree = ""; }; - AA32AFD3469DDA2C739B202301224686 /* MAPoiFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPoiFilter.h; path = MAMapKit.framework/Headers/MAPoiFilter.h; sourceTree = ""; }; - AF9C9B294BCC8B18556AEB4CE30C963D /* MAMultiPointOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMultiPointOverlayRenderer.h; sourceTree = ""; }; - B13F3025862BE8B59AC8C533E8C60E8D /* MAMapView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapView.h; path = MAMapKit.framework/Headers/MAMapView.h; sourceTree = ""; }; - B530855211CB4C4C76800A1D1767B17F /* MAMapVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapVersion.h; path = MAMapKit.framework/Headers/MAMapVersion.h; sourceTree = ""; }; - B6416396C31A7AD9044E3AF031E2884A /* MAHeatMapVectorGridOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlayRenderer.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlayRenderer.h; sourceTree = ""; }; - B79B0AA822A4C645D50FD95D9DDE2E83 /* Pods-suixinkan.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.release.xcconfig"; sourceTree = ""; }; - B8DC04361F3610E49B9968D23D51BC46 /* Pods-suixinkanTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.debug.xcconfig"; sourceTree = ""; }; - BCB2FF64B9690AAD67C63E7B370D0C81 /* AMap3DMap-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; - BD3DEDEC06AD52F466DD282D684273D3 /* AMap.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = AMap.bundle; path = MAMapKit.framework/AMap.bundle; sourceTree = ""; }; - BE0609041256854522844F8115E24667 /* AMapGeoFenceRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceRegionObj.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceRegionObj.h; sourceTree = ""; }; - C11E51B685AE8DDB2281E5515E3E7719 /* AMapFoundationConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationConst.h; path = AMapFoundationKit.framework/Headers/AMapFoundationConst.h; sourceTree = ""; }; - C321B919DB0AF5BCEB5666F717B77293 /* MAPolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolylineRenderer.h; path = MAMapKit.framework/Headers/MAPolylineRenderer.h; sourceTree = ""; }; - C3A19D52634E74D69C3618659F0D3DAB /* Pods-suixinkanTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkanTests-acknowledgements.markdown"; sourceTree = ""; }; - C596024C060092EB29453AFD36AF98AB /* MACustomBuildingOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomBuildingOverlay.h; path = MAMapKit.framework/Headers/MACustomBuildingOverlay.h; sourceTree = ""; }; - C9CEB02C95565E354CD0AE53BE395DE9 /* AMapLocationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationVersion.h; path = AMapLocationKit.framework/Headers/AMapLocationVersion.h; sourceTree = ""; }; - CA96F2C7401C88A4269A3DE4A5D50FEA /* MAGeodesicPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeodesicPolyline.h; path = MAMapKit.framework/Headers/MAGeodesicPolyline.h; sourceTree = ""; }; - CAAC857C3DE299F3DBCA6DF604190A4E /* MAHeatMapVectorOverlayRender.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlayRender.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlayRender.h; sourceTree = ""; }; - CEBE73B91B82528EE1DD2EB0801004EC /* MAPinAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPinAnnotationView.h; path = MAMapKit.framework/Headers/MAPinAnnotationView.h; sourceTree = ""; }; - CECDCE3F5358C48C05ABAE56A998BF0F /* MAHeatMapVectorGridOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlay.h; sourceTree = ""; }; - CFB9E339012A2179AA53659234ECD400 /* MABaseOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseOverlay.h; path = MAMapKit.framework/Headers/MABaseOverlay.h; sourceTree = ""; }; - D013E5FDEB4B75AE7B4CCB4CDB237B69 /* MAMapAccessibilityIdentifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapAccessibilityIdentifier.h; path = MAMapKit.framework/Headers/MAMapAccessibilityIdentifier.h; sourceTree = ""; }; - D2D66C8A79025C8BF9745CF63FEFD18C /* MACircle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircle.h; path = MAMapKit.framework/Headers/MACircle.h; sourceTree = ""; }; - D2F81E656BE107E5DDACA02118FA9BDB /* MAConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAConfig.h; path = MAMapKit.framework/Headers/MAConfig.h; sourceTree = ""; }; - D6B1070C85B6A212873D4DD810335767 /* MAGeometry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeometry.h; path = MAMapKit.framework/Headers/MAGeometry.h; sourceTree = ""; }; - DDF22DEED6E6F611C0712E0808B3756E /* MARouteOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlay.h; path = MAMapKit.framework/Headers/MARouteOverlay.h; sourceTree = ""; }; - DF4AB6BED4CBF426444B12DC46348FAE /* AMapURLSearchType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearchType.h; path = AMapFoundationKit.framework/Headers/AMapURLSearchType.h; sourceTree = ""; }; - E12F93F4C036EA2371A219B74F1F2C3E /* Pods-suixinkan-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkan-acknowledgements.markdown"; sourceTree = ""; }; - E39F1DDC7044D0F75F69CBDAF29C78FC /* MAMultiTexturePolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiTexturePolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiTexturePolylineRenderer.h; sourceTree = ""; }; - E5BC842C4FD4E15C36BA57D22F6209CC /* MAMapStatus.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapStatus.h; path = MAMapKit.framework/Headers/MAMapStatus.h; sourceTree = ""; }; - E80F8D1B4C24630B03C3F73FE97A22C6 /* MAArc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArc.h; path = MAMapKit.framework/Headers/MAArc.h; sourceTree = ""; }; - EA46FEC5B0B7CA4C6A0D6DF3FD840814 /* MAOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayRenderer.h; path = MAMapKit.framework/Headers/MAOverlayRenderer.h; sourceTree = ""; }; - EBFE1FB21EC779BC26A507BD2D269C1C /* MAOfflineItemMunicipality.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemMunicipality.h; path = MAMapKit.framework/Headers/MAOfflineItemMunicipality.h; sourceTree = ""; }; - F0BA123CC6A3B0DA81B48EBE34FFEF35 /* MATraceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceManager.h; path = MAMapKit.framework/Headers/MATraceManager.h; sourceTree = ""; }; - F3F9BE4ED2F15DAB820BA60CFFD98056 /* MAMultiPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPoint.h; path = MAMapKit.framework/Headers/MAMultiPoint.h; sourceTree = ""; }; - F4142A1999AC5449A2C74C4915B76B62 /* Pods-suixinkan-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-suixinkan-resources.sh"; sourceTree = ""; }; - FBD494EB1B87E9EBB2E17B93E70F2728 /* AMapURLSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearch.h; path = AMapFoundationKit.framework/Headers/AMapURLSearch.h; sourceTree = ""; }; + 9DAF861C234DEFE0565960A25179B328 /* MAMVTTileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlay.h; path = MAMapKit.framework/Headers/MAMVTTileOverlay.h; sourceTree = ""; }; + 9EABEC92964633D02091EEB81DAC2A28 /* Pods-suixinkan-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-suixinkan-resources.sh"; sourceTree = ""; }; + A187CDD3DB66CAE55829663F7709D099 /* MAGeometry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeometry.h; path = MAMapKit.framework/Headers/MAGeometry.h; sourceTree = ""; }; + A1C2AE0D141F894C0C841BDB91EA7784 /* Pods-suixinkanTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.release.xcconfig"; sourceTree = ""; }; + A36042A49C0F8540D18B799FFE9BAF4F /* UMCommon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCommon.debug.xcconfig; sourceTree = ""; }; + A41513919123C2DB492F2915452B99FB /* MACustomBuildingOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomBuildingOverlayRenderer.h; path = MAMapKit.framework/Headers/MACustomBuildingOverlayRenderer.h; sourceTree = ""; }; + A544FE588B3DA9A5527AB2104C1E3F6E /* UMDevice.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMDevice.release.xcconfig; sourceTree = ""; }; + A54E3FB167D0EBC2D46C20A0F3D271F1 /* MAPathShowRange.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPathShowRange.h; path = MAMapKit.framework/Headers/MAPathShowRange.h; sourceTree = ""; }; + A6363BBD4CE33059500F06D34B7147D5 /* AMapLocationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapLocationKit.framework; sourceTree = ""; }; + A64AFA54CDE002685FDDDBFF0A375A63 /* MAMultiColoredPolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiColoredPolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiColoredPolylineRenderer.h; sourceTree = ""; }; + A847712EFCA54C3CF9E1B8503AE196D0 /* MAMapAccessibilityIdentifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapAccessibilityIdentifier.h; path = MAMapKit.framework/Headers/MAMapAccessibilityIdentifier.h; sourceTree = ""; }; + B1D9E9672286630FEF14BE4CCD760A93 /* AMapSearchError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchError.h; path = AMapSearchKit.framework/Headers/AMapSearchError.h; sourceTree = ""; }; + B1DCEAC5E67DFFADA00E8D6182638950 /* UMCommon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCommon.release.xcconfig; sourceTree = ""; }; + B3ED06C9CF721AE092A9ACEA19083CAC /* MAOfflineCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineCity.h; path = MAMapKit.framework/Headers/MAOfflineCity.h; sourceTree = ""; }; + B97A4D37BDFE1DD115297273C4F4AAA7 /* AMapLocation-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapLocation-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; + BB6368DD0AABE98EED2B91B0BA922B8D /* MABaseOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseOverlay.h; path = MAMapKit.framework/Headers/MABaseOverlay.h; sourceTree = ""; }; + BBA147F6EAE0D76BC35E87FCF69C9C2D /* AMap3DMap-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.release.xcconfig"; sourceTree = ""; }; + BBC4E88072A58FC7DD14D5BC2316725E /* Pods-suixinkanTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-suixinkanTests-dummy.m"; sourceTree = ""; }; + BC6A8AE37A44303A7921B0F1E00000F0 /* MAAnnotationMoveAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationMoveAnimation.h; path = MAMapKit.framework/Headers/MAAnnotationMoveAnimation.h; sourceTree = ""; }; + BDBD995EABD877C6CF3EF8835C04E411 /* AMapNearbyUploadInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbyUploadInfo.h; path = AMapSearchKit.framework/Headers/AMapNearbyUploadInfo.h; sourceTree = ""; }; + BDED1392DCAE0A8D3D23FC81AA7DC8CA /* UMDevice-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMDevice-xcframeworks.sh"; sourceTree = ""; }; + BF228B17BC7260C40143BD13BD131504 /* Pods-suixinkan-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-suixinkan-dummy.m"; sourceTree = ""; }; + BF4E206010A80D9F4BD8AC654088FC62 /* MAAnimatedAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnimatedAnnotation.h; path = MAMapKit.framework/Headers/MAAnimatedAnnotation.h; sourceTree = ""; }; + BF6A4572B83783CEDEC1AE7ABB74B145 /* MAOverlayPathRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayPathRenderer.h; path = MAMapKit.framework/Headers/MAOverlayPathRenderer.h; sourceTree = ""; }; + C163EE9A875637E6C1F824BA08BFE21B /* MAHeatMapVectorGridOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlay.h; sourceTree = ""; }; + C1DFE81417556E6F808D1284CF137ADE /* MAIndoorInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAIndoorInfo.h; path = MAMapKit.framework/Headers/MAIndoorInfo.h; sourceTree = ""; }; + C45073FF76FBFD70DE8060643C834BEE /* MAMultiPointOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMultiPointOverlayRenderer.h; sourceTree = ""; }; + C4B9730FA8B1A82502EDF50DAEF161F7 /* MAPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolyline.h; path = MAMapKit.framework/Headers/MAPolyline.h; sourceTree = ""; }; + C7114968961138953AAE2AD902FFD2A7 /* MARouteOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlay.h; path = MAMapKit.framework/Headers/MARouteOverlay.h; sourceTree = ""; }; + C78838CD3446DBC3B6C57416E5DF1601 /* MATileOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATileOverlayRenderer.h; path = MAMapKit.framework/Headers/MATileOverlayRenderer.h; sourceTree = ""; }; + C80B7ABEF97D9D358AEC382367B8FEFE /* AMapSearchObjV1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObjV1.h; path = AMapSearchKit.framework/Headers/AMapSearchObjV1.h; sourceTree = ""; }; + C8FDFE01BACEE8807D4E8E5EBB3104AF /* AMapLocationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationVersion.h; path = AMapLocationKit.framework/Headers/AMapLocationVersion.h; sourceTree = ""; }; + CAA8F759C5471E04D0EDCFD5BAE3E1F3 /* MALineDrawType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MALineDrawType.h; path = MAMapKit.framework/Headers/MALineDrawType.h; sourceTree = ""; }; + CCCBE033D87F7E68F7F4F8A2604DB9FC /* MAHeatMapVectorOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlay.h; sourceTree = ""; }; + CCEB62137B691B96014FCE7C2963DE89 /* AMapFoundation-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapFoundation-NO-IDFA.release.xcconfig"; sourceTree = ""; }; + CE36A961B0F78784EC9BFE7F48C84F82 /* Pods-suixinkan-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-suixinkan-umbrella.h"; sourceTree = ""; }; + D0E173B83918C3601469EC66C94A97BE /* MAMapVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapVersion.h; path = MAMapKit.framework/Headers/MAMapVersion.h; sourceTree = ""; }; + D3DF0EA33F3079DDA692A775FDC514CA /* MAPointAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPointAnnotation.h; path = MAMapKit.framework/Headers/MAPointAnnotation.h; sourceTree = ""; }; + D3E4AF577ED21FFF5C6997614BE817AF /* UMAPM-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "UMAPM-xcframeworks.sh"; sourceTree = ""; }; + D49628F6F87CD3F4A82F10BBA92C44A3 /* Pods-suixinkan-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-Info.plist"; sourceTree = ""; }; + D49F2B29B08A21CE8044825FB0F690B6 /* MAMultiPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPolyline.h; path = MAMapKit.framework/Headers/MAMultiPolyline.h; sourceTree = ""; }; + D738B4EADCCC0969B2C74EDD60C54C5F /* UMAPM.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMAPM.debug.xcconfig; sourceTree = ""; }; + D886BE5A9F5F18037B49BF5843A23557 /* MATraceLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceLocation.h; path = MAMapKit.framework/Headers/MATraceLocation.h; sourceTree = ""; }; + DAB1615CF37670F70B385FD315D74635 /* MAPinAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPinAnnotationView.h; path = MAMapKit.framework/Headers/MAPinAnnotationView.h; sourceTree = ""; }; + DC5BC1CE33C0778D3DF37DD68AF6A540 /* MAConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAConfig.h; path = MAMapKit.framework/Headers/MAConfig.h; sourceTree = ""; }; + DE563497DD3BB9A6B51060C88124B030 /* MAUserLocationRepresentation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAUserLocationRepresentation.h; path = MAMapKit.framework/Headers/MAUserLocationRepresentation.h; sourceTree = ""; }; + DE9CCDAE04DBF0C5163DC000763E8F22 /* MACustomBuildingOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomBuildingOverlay.h; path = MAMapKit.framework/Headers/MACustomBuildingOverlay.h; sourceTree = ""; }; + DEBCCADE7DDBA90A395DEF6DA0DB1549 /* MACircle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircle.h; path = MAMapKit.framework/Headers/MACircle.h; sourceTree = ""; }; + DED06228F2ED3100A01944BF056F3316 /* AMapFoundation-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapFoundation-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; + E326873DD4D64984A558D4FDE649FB4A /* MAHeatMapTileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapTileOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapTileOverlay.h; sourceTree = ""; }; + E5B7CC2B4D07007A9C53EDC66CCD5799 /* MAPolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolylineRenderer.h; path = MAMapKit.framework/Headers/MAPolylineRenderer.h; sourceTree = ""; }; + E6D4DE3793D4AB549D9078053FA2DE6D /* AMapServices.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapServices.h; path = AMapFoundationKit.framework/Headers/AMapServices.h; sourceTree = ""; }; + E715DDE336E4E382EFE238BD6C30978D /* MARouteOverlayModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlayModel.h; path = MAMapKit.framework/Headers/MARouteOverlayModel.h; sourceTree = ""; }; + EB4D968F4833DBC93E946E6496A71A4C /* UMCommon.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = UMCommon.xcframework; path = UMCommon_7.5.11/UMCommon.xcframework; sourceTree = ""; }; + EC84D11EB46B7B391B31CD492CD597E3 /* MAMapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = MAMapKit.framework; sourceTree = ""; }; + F399B851B018264B878AB2159250B7E9 /* AMapSearchObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObj.h; path = AMapSearchKit.framework/Headers/AMapSearchObj.h; sourceTree = ""; }; + F64961F52A461A351D3C2CF5AA5AB687 /* MAOfflineItemCommonCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemCommonCity.h; path = MAMapKit.framework/Headers/MAOfflineItemCommonCity.h; sourceTree = ""; }; + F66C83E664848DC373508F2C5D874901 /* MAPoiFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPoiFilter.h; path = MAMapKit.framework/Headers/MAPoiFilter.h; sourceTree = ""; }; + F68AE8892469CEEAB0C81AB0EF8E8A00 /* AMapGeoFenceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceManager.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceManager.h; sourceTree = ""; }; + F9EEA82DDCF0523711748E2553B7E441 /* AMapURLSearchType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearchType.h; path = AMapFoundationKit.framework/Headers/AMapURLSearchType.h; sourceTree = ""; }; + FA44E234FE67D2FC43874714AB8D64CE /* AMapLocation-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapLocation-NO-IDFA.release.xcconfig"; sourceTree = ""; }; + FDCF5C554E9F565E7A081E7D2D4D4267 /* MABaseEngineOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseEngineOverlay.h; path = MAMapKit.framework/Headers/MABaseEngineOverlay.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - D4D527249F0450377180344C717E09F3 /* Frameworks */ = { + 8BD4903F809FAA786A7E5E69F62F63A5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 9EDCFA51CF55ABD87CD178D9700B89C7 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - FCD94875AC737B1FBBFB67DEE3875789 /* Frameworks */ = { + FE8D20F9B4D47B2212CF065B7D507950 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2679DE061DC2B5340F8415D162B5204F /* Foundation.framework in Frameworks */, + 914AE43A691016D126083E13CFD8919F /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0AA04EEFD33302440FC6FCFF2534644E /* Support Files */ = { + 053E8796D73C515403774DEA87827B53 /* Frameworks */ = { isa = PBXGroup; children = ( - 72D9F37AD28C464FC9E4C647C035D78D /* AMapSearch-NO-IDFA.debug.xcconfig */, - 6831B314F45EB77FB7BBA52758001C23 /* AMapSearch-NO-IDFA.release.xcconfig */, + EB4D968F4833DBC93E946E6496A71A4C /* UMCommon.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 0EB9DC8EDC65D038B7A52C7C29794547 /* AMapLocation-NO-IDFA */ = { + isa = PBXGroup; + children = ( + 657980EFF8962794190BFF647D3FEF24 /* AMapGeoFenceError.h */, + F68AE8892469CEEAB0C81AB0EF8E8A00 /* AMapGeoFenceManager.h */, + 632CBA3F863D4B4C036343CBE79395A0 /* AMapGeoFenceRegionObj.h */, + 12C40249116DE0574E7DC16E3A5C4D06 /* AMapLocationCommonObj.h */, + 3A16DCDE527DE0F46DBB2B7A4A10C9FF /* AMapLocationKit.h */, + 5BDBFE9A3501719BF5A45FCF0782CDBE /* AMapLocationManager.h */, + 11E7551362FA5BAEED7A7CF2E5A5998B /* AMapLocationRegionObj.h */, + C8FDFE01BACEE8807D4E8E5EBB3104AF /* AMapLocationVersion.h */, + AE2DE37A81CF7653F81DB5D38581B5D1 /* Frameworks */, + 3C5798CC5D19A96879E36CB2577FC15D /* Support Files */, + ); + name = "AMapLocation-NO-IDFA"; + path = "AMapLocation-NO-IDFA"; + sourceTree = ""; + }; + 11095F35AEC13106E58B88986E038FA8 /* Support Files */ = { + isa = PBXGroup; + children = ( + 72424614C718027B387FB239F679271E /* WechatOpenSDK-XCFramework-xcframeworks.sh */, + 93364FC6486AA57E263ACEAB802CA297 /* WechatOpenSDK-XCFramework.debug.xcconfig */, + 505E9C4F754A74BBF0BF433A1ABAB2D3 /* WechatOpenSDK-XCFramework.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/WechatOpenSDK-XCFramework"; + sourceTree = ""; + }; + 172D1E47595F1B6E3E0082400A5D8802 /* UMAPM */ = { + isa = PBXGroup; + children = ( + 5D575D3B0023734E1E033B0FABF2A0AC /* Frameworks */, + DFDAD4C6E0E87D50276AF58AF0CC7A7B /* Support Files */, + ); + name = UMAPM; + path = UMAPM; + sourceTree = ""; + }; + 2490E4390BCF4C97C395FCA7A4170CFF /* Support Files */ = { + isa = PBXGroup; + children = ( + 9A4789EE651F9A3985C6652F8EF58F6B /* UMCommon-xcframeworks.sh */, + A36042A49C0F8540D18B799FFE9BAF4F /* UMCommon.debug.xcconfig */, + B1DCEAC5E67DFFADA00E8D6182638950 /* UMCommon.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/UMCommon"; + sourceTree = ""; + }; + 361D40936B8C5C5A2B21F0585E7861FC /* Frameworks */ = { + isa = PBXGroup; + children = ( + 514765B300FD9BCBE77BA16182363311 /* AMapFoundationKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 3C5798CC5D19A96879E36CB2577FC15D /* Support Files */ = { + isa = PBXGroup; + children = ( + B97A4D37BDFE1DD115297273C4F4AAA7 /* AMapLocation-NO-IDFA.debug.xcconfig */, + FA44E234FE67D2FC43874714AB8D64CE /* AMapLocation-NO-IDFA.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/AMapLocation-NO-IDFA"; + sourceTree = ""; + }; + 3DD794182C921E59A62953E67C6E7BAD /* Frameworks */ = { + isa = PBXGroup; + children = ( + EC84D11EB46B7B391B31CD492CD597E3 /* MAMapKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 3E3C4F70A9DBD6C79C11F6EF6188D65C /* Frameworks */ = { + isa = PBXGroup; + children = ( + 64C0BEE472E88B93EB7D366E5B2597E4 /* UMDevice.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 5AD6A3E6076595DC159E4BBD5C7D733C /* Support Files */ = { + isa = PBXGroup; + children = ( + 8A2882BF8F5DC25616C1ED02D8BADE8B /* AMapSearch-NO-IDFA.debug.xcconfig */, + 3D27E75D0D982BBB14DF16A6604AF8CD /* AMapSearch-NO-IDFA.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/AMapSearch-NO-IDFA"; sourceTree = ""; }; - 0C9DD1E4D8065565DC14E24533C93CA9 /* Products */ = { + 5D575D3B0023734E1E033B0FABF2A0AC /* Frameworks */ = { + isa = PBXGroup; + children = ( + 2B483D35C6A5C6886C8305F8655E02EB /* UMAPM.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 5F5330AD7D2861B5B163FE8656FB11B0 /* UMDevice */ = { + isa = PBXGroup; + children = ( + 3E3C4F70A9DBD6C79C11F6EF6188D65C /* Frameworks */, + BE72718C7BD5CACDC996D04779E9ABD5 /* Support Files */, + ); + name = UMDevice; + path = UMDevice; + sourceTree = ""; + }; + 6325EA2815A018AA2EC65A94FA84F1F5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 267A3DEBF9AF353E463F539354095601 /* AMapSearchKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 701DD2AA6C7160AE06B46DD62ABCC15F /* Resources */ = { + isa = PBXGroup; + children = ( + 21F64182FA5AB6FB454C619FF610CB14 /* AMap.bundle */, + ); + name = Resources; + sourceTree = ""; + }; + 722A96E82AADDB8FB7925DD99D0A68DE /* AMapFoundation-NO-IDFA */ = { + isa = PBXGroup; + children = ( + 2695372829B2B3DE46736249F9327CB3 /* AMapFoundationConst.h */, + 764EBFD12BB5DBE470C3B3EE75778E69 /* AMapFoundationKit.h */, + 8E8D9B985354179A70BB4148A96CB106 /* AMapFoundationVersion.h */, + E6D4DE3793D4AB549D9078053FA2DE6D /* AMapServices.h */, + 64240DCE9E380E0318667593766AB4D8 /* AMapURLSearch.h */, + 308336B8D46677C30433D2DCCD115731 /* AMapURLSearchConfig.h */, + F9EEA82DDCF0523711748E2553B7E441 /* AMapURLSearchType.h */, + 58447B69191400A703B8F1AA0E907906 /* AMapUtility.h */, + 361D40936B8C5C5A2B21F0585E7861FC /* Frameworks */, + A5AD942536C37F3EF1CD33B6D5F144D2 /* Support Files */, + ); + name = "AMapFoundation-NO-IDFA"; + path = "AMapFoundation-NO-IDFA"; + sourceTree = ""; + }; + 73BCF1C0312B0B71003D7FAD6EABE384 /* UMCommon */ = { + isa = PBXGroup; + children = ( + 053E8796D73C515403774DEA87827B53 /* Frameworks */, + 2490E4390BCF4C97C395FCA7A4170CFF /* Support Files */, + ); + name = UMCommon; + path = UMCommon; + sourceTree = ""; + }; + 73F803CD52D81A3DCE3CA16B75828CF8 /* Pods */ = { + isa = PBXGroup; + children = ( + D33759C7A54882359A0F550EB233BDEE /* AMap3DMap-NO-IDFA */, + 722A96E82AADDB8FB7925DD99D0A68DE /* AMapFoundation-NO-IDFA */, + 0EB9DC8EDC65D038B7A52C7C29794547 /* AMapLocation-NO-IDFA */, + 911D4B15F2F8C3819D9DAD4F207148C2 /* AMapSearch-NO-IDFA */, + 172D1E47595F1B6E3E0082400A5D8802 /* UMAPM */, + 73BCF1C0312B0B71003D7FAD6EABE384 /* UMCommon */, + 5F5330AD7D2861B5B163FE8656FB11B0 /* UMDevice */, + 91BC9F43AB22703B4944A1985F883E63 /* WechatOpenSDK-XCFramework */, + ); + name = Pods; + sourceTree = ""; + }; + 911D4B15F2F8C3819D9DAD4F207148C2 /* AMapSearch-NO-IDFA */ = { + isa = PBXGroup; + children = ( + 7D7597DC9C40CDD0257013247AFBE4C8 /* AMapCommonObj.h */, + 03ECB029C3BA6719F3CE27704FE9866A /* AMapNearbySearchManager.h */, + BDBD995EABD877C6CF3EF8835C04E411 /* AMapNearbyUploadInfo.h */, + 7A9B9169FDEDF62E64E2DE22F85610ED /* AMapSearchAPI.h */, + B1D9E9672286630FEF14BE4CCD760A93 /* AMapSearchError.h */, + 49D1A8B85287979271F3D66B8968FAAD /* AMapSearchKit.h */, + F399B851B018264B878AB2159250B7E9 /* AMapSearchObj.h */, + C80B7ABEF97D9D358AEC382367B8FEFE /* AMapSearchObjV1.h */, + 21F8229FFC8693946D569FF6D8C1FA3F /* AMapSearchVersion.h */, + 6325EA2815A018AA2EC65A94FA84F1F5 /* Frameworks */, + 5AD6A3E6076595DC159E4BBD5C7D733C /* Support Files */, + ); + name = "AMapSearch-NO-IDFA"; + path = "AMapSearch-NO-IDFA"; + sourceTree = ""; + }; + 91BC9F43AB22703B4944A1985F883E63 /* WechatOpenSDK-XCFramework */ = { + isa = PBXGroup; + children = ( + E9F17ABFD66E8A4813CAB917573983D8 /* Frameworks */, + 11095F35AEC13106E58B88986E038FA8 /* Support Files */, + ); + name = "WechatOpenSDK-XCFramework"; + path = "WechatOpenSDK-XCFramework"; + sourceTree = ""; + }; + A5AD942536C37F3EF1CD33B6D5F144D2 /* Support Files */ = { + isa = PBXGroup; + children = ( + DED06228F2ED3100A01944BF056F3316 /* AMapFoundation-NO-IDFA.debug.xcconfig */, + CCEB62137B691B96014FCE7C2963DE89 /* AMapFoundation-NO-IDFA.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/AMapFoundation-NO-IDFA"; + sourceTree = ""; + }; + AE2DE37A81CF7653F81DB5D38581B5D1 /* Frameworks */ = { + isa = PBXGroup; + children = ( + A6363BBD4CE33059500F06D34B7147D5 /* AMapLocationKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + BE72718C7BD5CACDC996D04779E9ABD5 /* Support Files */ = { + isa = PBXGroup; + children = ( + BDED1392DCAE0A8D3D23FC81AA7DC8CA /* UMDevice-xcframeworks.sh */, + 7FA9E9DE9F0DB76774F19BF713363C1C /* UMDevice.debug.xcconfig */, + A544FE588B3DA9A5527AB2104C1E3F6E /* UMDevice.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/UMDevice"; + sourceTree = ""; + }; + C0A54D8DDA8ED18D016C2F971E3440BD /* Products */ = { isa = PBXGroup; children = ( 5BD109278933E8C2F269E5DCEC3A5376 /* Pods-suixinkan */, @@ -358,342 +619,30 @@ name = Products; sourceTree = ""; }; - 0D24B464AEA883F3676E8C73EA4BA88E /* Support Files */ = { + C111D316B9ED9498A7739F61CB9C3958 /* Targets Support Files */ = { isa = PBXGroup; children = ( - 6CB05FF4490FB9F75B6C53D8C13DFFF2 /* AMapLocation-NO-IDFA.debug.xcconfig */, - 04CAEC1E43034458F2B81A75CEF78B78 /* AMapLocation-NO-IDFA.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/AMapLocation-NO-IDFA"; - sourceTree = ""; - }; - 172203E8B3F4E43EB737CABA7F20FA89 /* Support Files */ = { - isa = PBXGroup; - children = ( - 65AB21D863615A6A59E6C7F152C8912E /* UMDevice-xcframeworks.sh */, - 54356B35640D6CD8108AE95EF1787EBF /* UMDevice.debug.xcconfig */, - 6E30647781C1277088E9F767E5324F93 /* UMDevice.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/UMDevice"; - sourceTree = ""; - }; - 1ACBDC3D9BAF8753C574C82B98A0ACAC /* Pods */ = { - isa = PBXGroup; - children = ( - 682A8901A6A640C5A9CA9594B993291E /* AMap3DMap-NO-IDFA */, - 497B90CD216D49CDFC9635F2A70C842A /* AMapFoundation-NO-IDFA */, - 2BD212EDBE9910DB16705CE55D46E765 /* AMapLocation-NO-IDFA */, - C1DC607AB7D37ECAABFED887C7630A90 /* AMapSearch-NO-IDFA */, - 326FA3BC7BC1D8F13334C2A043D09034 /* UMAPM */, - 4DA788C4690E2014739F562723B40DC5 /* UMCommon */, - A1BDA38916479C4F874A78415E279392 /* UMDevice */, - ); - name = Pods; - sourceTree = ""; - }; - 278223951A755801A36858EC7285F017 /* Support Files */ = { - isa = PBXGroup; - children = ( - BCB2FF64B9690AAD67C63E7B370D0C81 /* AMap3DMap-NO-IDFA.debug.xcconfig */, - 8B46D4EDC3A56E5C07C332C0BE1E1DB9 /* AMap3DMap-NO-IDFA.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/AMap3DMap-NO-IDFA"; - sourceTree = ""; - }; - 2BD212EDBE9910DB16705CE55D46E765 /* AMapLocation-NO-IDFA */ = { - isa = PBXGroup; - children = ( - 5245F4EAAB08EDA40AD9067E8FABC79D /* AMapGeoFenceError.h */, - 156019BEBBE28E51096668CAE2C12C35 /* AMapGeoFenceManager.h */, - BE0609041256854522844F8115E24667 /* AMapGeoFenceRegionObj.h */, - A536BD3E1F7F32A53D4099C418F325BB /* AMapLocationCommonObj.h */, - 00B6141D8B9E47A4A9ED83A2B569081A /* AMapLocationKit.h */, - 0B5666BC0A6FA625BF3980C906811B56 /* AMapLocationManager.h */, - 883E38D7EB9B5A729D6F3882C8BF08B2 /* AMapLocationRegionObj.h */, - C9CEB02C95565E354CD0AE53BE395DE9 /* AMapLocationVersion.h */, - BD468CEDE1301AE70B5CA9FD9F7CD826 /* Frameworks */, - 0D24B464AEA883F3676E8C73EA4BA88E /* Support Files */, - ); - name = "AMapLocation-NO-IDFA"; - path = "AMapLocation-NO-IDFA"; - sourceTree = ""; - }; - 2C2B786BA75ED1D814796A78FB2654DF /* Frameworks */ = { - isa = PBXGroup; - children = ( - A90986704790B300427D5525BEA0277B /* MAMapKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 326FA3BC7BC1D8F13334C2A043D09034 /* UMAPM */ = { - isa = PBXGroup; - children = ( - C4660840E721590828564584B1B19000 /* Frameworks */, - 9E20B445C82E769F9DF8E0360DB99B96 /* Support Files */, - ); - name = UMAPM; - path = UMAPM; - sourceTree = ""; - }; - 497B90CD216D49CDFC9635F2A70C842A /* AMapFoundation-NO-IDFA */ = { - isa = PBXGroup; - children = ( - C11E51B685AE8DDB2281E5515E3E7719 /* AMapFoundationConst.h */, - 097851041BAAA1CD1BDDADA6312D97DE /* AMapFoundationKit.h */, - 60F4A5AF1D010D7E966BEEC384582AAE /* AMapFoundationVersion.h */, - 08D4547F6827F0ADEF8A222AB0A5F61E /* AMapServices.h */, - FBD494EB1B87E9EBB2E17B93E70F2728 /* AMapURLSearch.h */, - 44D9997FC4C41C04A96A560BCC0966CC /* AMapURLSearchConfig.h */, - DF4AB6BED4CBF426444B12DC46348FAE /* AMapURLSearchType.h */, - 04CC5AD075A77037FAA57D42DADFA706 /* AMapUtility.h */, - 83D79278E721D15FE42DCF86D908633D /* Frameworks */, - B0BF3A30F49DA16EA8185104F91484BC /* Support Files */, - ); - name = "AMapFoundation-NO-IDFA"; - path = "AMapFoundation-NO-IDFA"; - sourceTree = ""; - }; - 4DA788C4690E2014739F562723B40DC5 /* UMCommon */ = { - isa = PBXGroup; - children = ( - AE2D790B6D762F4067D47D57A19A1A1A /* Frameworks */, - 579A9DC62E1D45235976D764DF577539 /* Support Files */, - ); - name = UMCommon; - path = UMCommon; - sourceTree = ""; - }; - 579A9DC62E1D45235976D764DF577539 /* Support Files */ = { - isa = PBXGroup; - children = ( - 91B2B63459FD6E904D20268E048C8356 /* UMCommon-xcframeworks.sh */, - 1F434C340EE152947804F55B6AE07219 /* UMCommon.debug.xcconfig */, - 2B90865ABB9627D294333A5A122ADC4E /* UMCommon.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/UMCommon"; - sourceTree = ""; - }; - 682A8901A6A640C5A9CA9594B993291E /* AMap3DMap-NO-IDFA */ = { - isa = PBXGroup; - children = ( - 566483E2F39FBFEF5D205B6FC589F7AD /* MAAnimatedAnnotation.h */, - 5F615AE1876330A95AB31D614B6AF521 /* MAAnnotation.h */, - 723120B072CFE42872B403185FEF3480 /* MAAnnotationMoveAnimation.h */, - 0266B56D516BC1D3796FF8760B703722 /* MAAnnotationView.h */, - E80F8D1B4C24630B03C3F73FE97A22C6 /* MAArc.h */, - 0E1E165E563A78BDAC84339A42650182 /* MAArcRenderer.h */, - 8D3F4C4F65AFDE0F50C860B0E7900AD2 /* MABaseEngineOverlay.h */, - CFB9E339012A2179AA53659234ECD400 /* MABaseOverlay.h */, - D2D66C8A79025C8BF9745CF63FEFD18C /* MACircle.h */, - 56C9C66B0D24B40636D6F41354B90769 /* MACircleRenderer.h */, - D2F81E656BE107E5DDACA02118FA9BDB /* MAConfig.h */, - C596024C060092EB29453AFD36AF98AB /* MACustomBuildingOverlay.h */, - 2AB66D9A11828BB1CEDA9B32C0E8D54C /* MACustomBuildingOverlayRenderer.h */, - 533984F7B44BF7ADDAE82AA6A9781C34 /* MACustomCalloutView.h */, - CA96F2C7401C88A4269A3DE4A5D50FEA /* MAGeodesicPolyline.h */, - D6B1070C85B6A212873D4DD810335767 /* MAGeometry.h */, - 11785DC4376F033B3EEBFE0C476EEB41 /* MAGroundOverlay.h */, - 75EB2D6FB4EE88BC1048838C179EEF4D /* MAGroundOverlayRenderer.h */, - 09260A89A2D7F909A673270AAB86D14D /* MAHeatMapTileOverlay.h */, - CECDCE3F5358C48C05ABAE56A998BF0F /* MAHeatMapVectorGridOverlay.h */, - B6416396C31A7AD9044E3AF031E2884A /* MAHeatMapVectorGridOverlayRenderer.h */, - 49D4CBF2C1A637182BFECB5CE2FAAACE /* MAHeatMapVectorOverlay.h */, - CAAC857C3DE299F3DBCA6DF604190A4E /* MAHeatMapVectorOverlayRender.h */, - 6F9281D9C3A604258A466E61ABC3CD2A /* MAIndoorInfo.h */, - 505594E5041E52B2A5DA9C508C97170E /* MALineDrawType.h */, - D013E5FDEB4B75AE7B4CCB4CDB237B69 /* MAMapAccessibilityIdentifier.h */, - 9AD3E737F26FD1C92ABC492C32373551 /* MAMapCustomStyleOptions.h */, - 091433D2446EFEAC6F073B89C4882424 /* MAMapKit.h */, - 822D66077D2425E53D801DA303BC3F1E /* MAMapSnapshot.h */, - E5BC842C4FD4E15C36BA57D22F6209CC /* MAMapStatus.h */, - B530855211CB4C4C76800A1D1767B17F /* MAMapVersion.h */, - B13F3025862BE8B59AC8C533E8C60E8D /* MAMapView.h */, - 9CFCD57B2B7B92D7465507CADEFB0B66 /* MAMapView+Resource.h */, - 83299514396578C1E5347F754A2998BB /* MAMultiColoredPolylineRenderer.h */, - F3F9BE4ED2F15DAB820BA60CFFD98056 /* MAMultiPoint.h */, - 53F4822C85EE470453AB1B7FEDF791E5 /* MAMultiPointOverlay.h */, - AF9C9B294BCC8B18556AEB4CE30C963D /* MAMultiPointOverlayRenderer.h */, - 6D5ECB5AB29F05C16FFA1428CBBAE729 /* MAMultiPolyline.h */, - E39F1DDC7044D0F75F69CBDAF29C78FC /* MAMultiTexturePolylineRenderer.h */, - 031B2DE06F6B2634049776117B71A513 /* MAMVTTileOverlay.h */, - 536C97B8F3C900DF780545FDF81CFD5D /* MAMVTTileOverlayRenderer.h */, - 1F9C8D9E5541433742FD39F384AE2B9B /* MAOfflineCity.h */, - 6668C1B4F8D624B8AA2F9A5A3519E4F1 /* MAOfflineItem.h */, - 02990202241575B70CDB5AFF2EE8DE81 /* MAOfflineItemCommonCity.h */, - EBFE1FB21EC779BC26A507BD2D269C1C /* MAOfflineItemMunicipality.h */, - 0C16D864D673B3EDA83FFB2B6D1F37A7 /* MAOfflineItemNationWide.h */, - 4994797E0DE9173DEE54C040E8E7FB42 /* MAOfflineMap.h */, - A876C5B5A750D9833A4CD9CAF0CF2374 /* MAOfflineMapViewController.h */, - 37B405B9E350B2DE5799E8788BB5EB2D /* MAOfflineProvince.h */, - 5CBAF14B34BA404F4445714F67884B94 /* MAOverlay.h */, - 5284B7E1A914039C3E2614B06F371EE1 /* MAOverlayPathRenderer.h */, - EA46FEC5B0B7CA4C6A0D6DF3FD840814 /* MAOverlayRenderer.h */, - 073A01688C5B317E2C2A83DF1DB82751 /* MAParticleOverlay.h */, - 12EC8F963920468FAA03D71CC3B496D2 /* MAParticleOverlayOptions.h */, - 562FD061ADDAF8444BA8350FA84AAD99 /* MAParticleOverlayRenderer.h */, - 639847CA0DD08F98F16B9539C3772927 /* MAPathShowRange.h */, - CEBE73B91B82528EE1DD2EB0801004EC /* MAPinAnnotationView.h */, - AA32AFD3469DDA2C739B202301224686 /* MAPoiFilter.h */, - 27709FDBE6C515AC7AA5E0790EC1622B /* MAPointAnnotation.h */, - 8ABAEFB566BE1DB03713B43D575527E7 /* MAPolygon.h */, - 6D788A0FE380A691B79995264AA0FCB3 /* MAPolygonRenderer.h */, - 9AD391E9A86B644737ABE2A7D9F3F0AA /* MAPolyline.h */, - C321B919DB0AF5BCEB5666F717B77293 /* MAPolylineRenderer.h */, - DDF22DEED6E6F611C0712E0808B3756E /* MARouteOverlay.h */, - 0C9977EA53E5D167FD76B43D43DA286E /* MARouteOverlayModel.h */, - 788A9B3C4C49A7E038EB940CADFB95B3 /* MAShape.h */, - 9566766E05187D5C2C6E18999A7451FD /* MATerrainOverlay.h */, - 474132026A03DAD67D4268D220818837 /* MATerrainOverlayRenderer.h */, - 640C1C6FF073CF6BDF32A98299CC8B26 /* MATileOverlay.h */, - 8E5CE8FA1404298163AA91D2C5EB7F51 /* MATileOverlayRenderer.h */, - 3CCBB317847E992AC63FB7FD596E3979 /* MATouchPoi.h */, - A00E8E0E9CF24E1C0B24103ADF91313A /* MATraceLocation.h */, - F0BA123CC6A3B0DA81B48EBE34FFEF35 /* MATraceManager.h */, - 3129F26CCB5C8040FD844D2E8F28C538 /* MAUserLocation.h */, - 7CE4B53A879766A65A2D9D04B4047721 /* MAUserLocationRepresentation.h */, - 2C2B786BA75ED1D814796A78FB2654DF /* Frameworks */, - C75636D4F2A1248602E2A8D1BDE138E8 /* Resources */, - 278223951A755801A36858EC7285F017 /* Support Files */, - ); - name = "AMap3DMap-NO-IDFA"; - path = "AMap3DMap-NO-IDFA"; - sourceTree = ""; - }; - 73BCB93E3E9696172DA561D742366942 /* Pods-suixinkan */ = { - isa = PBXGroup; - children = ( - 3B45F0C05BA389A6BD05B5D88823DCE3 /* Pods-suixinkan.modulemap */, - E12F93F4C036EA2371A219B74F1F2C3E /* Pods-suixinkan-acknowledgements.markdown */, - 3E21626C6A57F4A608DC6791B3FECA90 /* Pods-suixinkan-acknowledgements.plist */, - 152FD3226D4E443D2FA757BD8D52055A /* Pods-suixinkan-dummy.m */, - 0C90B527958768F63FCAFE14DD169C95 /* Pods-suixinkan-Info.plist */, - F4142A1999AC5449A2C74C4915B76B62 /* Pods-suixinkan-resources.sh */, - 6217937D721C5627A69DFD5C31223419 /* Pods-suixinkan-umbrella.h */, - 9D9526FE1C100309F9585E25F5EB1162 /* Pods-suixinkan.debug.xcconfig */, - B79B0AA822A4C645D50FD95D9DDE2E83 /* Pods-suixinkan.release.xcconfig */, - ); - name = "Pods-suixinkan"; - path = "Target Support Files/Pods-suixinkan"; - sourceTree = ""; - }; - 78782CF4C37401EE8318261C25624BF4 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 82D8815A46B6E4F430DF6D8307FECF15 /* AMapSearchKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 83D79278E721D15FE42DCF86D908633D /* Frameworks */ = { - isa = PBXGroup; - children = ( - 6D803B5ADF7C51FBED92392BFF26A801 /* AMapFoundationKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 950E5BB3B2DCDC674191843B7BBB1ABF /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - 73BCB93E3E9696172DA561D742366942 /* Pods-suixinkan */, - EFE4F44022406CE70DA6B996F0E66702 /* Pods-suixinkanTests */, + C7D8EE410ED114D2A14E9F97869A8B54 /* Pods-suixinkan */, + DD51156B35FBCA6A32E3B025718A7857 /* Pods-suixinkanTests */, ); name = "Targets Support Files"; sourceTree = ""; }; - 9E20B445C82E769F9DF8E0360DB99B96 /* Support Files */ = { + C7D8EE410ED114D2A14E9F97869A8B54 /* Pods-suixinkan */ = { isa = PBXGroup; children = ( - 55216DCF8A433E77D4B0F1BA3111CD89 /* UMAPM-xcframeworks.sh */, - 1FC0EEEF15C3563046CFB7D8F6D3C0A9 /* UMAPM.debug.xcconfig */, - 7BDF2E8F09ACEE3D8A741F23C976A9AB /* UMAPM.release.xcconfig */, + 8C64DEFEB1E7F2C66D9E36F704EB2EDA /* Pods-suixinkan.modulemap */, + 069E056FF5EF11FB955BE3C9637228BF /* Pods-suixinkan-acknowledgements.markdown */, + 44674EC1944BB8CC20D1FB811A28DA3F /* Pods-suixinkan-acknowledgements.plist */, + BF228B17BC7260C40143BD13BD131504 /* Pods-suixinkan-dummy.m */, + D49628F6F87CD3F4A82F10BBA92C44A3 /* Pods-suixinkan-Info.plist */, + 9EABEC92964633D02091EEB81DAC2A28 /* Pods-suixinkan-resources.sh */, + CE36A961B0F78784EC9BFE7F48C84F82 /* Pods-suixinkan-umbrella.h */, + 61B7C8006610229F8A3485704A3944CF /* Pods-suixinkan.debug.xcconfig */, + 2D9188A08F7F86FBF3EBB3CD93699D53 /* Pods-suixinkan.release.xcconfig */, ); - name = "Support Files"; - path = "../Target Support Files/UMAPM"; - sourceTree = ""; - }; - A1BDA38916479C4F874A78415E279392 /* UMDevice */ = { - isa = PBXGroup; - children = ( - AFF36E998F757E3163662B0F4A9AF9B7 /* Frameworks */, - 172203E8B3F4E43EB737CABA7F20FA89 /* Support Files */, - ); - name = UMDevice; - path = UMDevice; - sourceTree = ""; - }; - AE2D790B6D762F4067D47D57A19A1A1A /* Frameworks */ = { - isa = PBXGroup; - children = ( - 06103B4491A79A8C329F59407D7B199C /* UMCommon.xcframework */, - ); - name = Frameworks; - sourceTree = ""; - }; - AFF36E998F757E3163662B0F4A9AF9B7 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 840B76D96208FE5DA788BBDDBC878B89 /* UMDevice.xcframework */, - ); - name = Frameworks; - sourceTree = ""; - }; - B0BF3A30F49DA16EA8185104F91484BC /* Support Files */ = { - isa = PBXGroup; - children = ( - 94F440BEB3117D12F0E6811057AE7277 /* AMapFoundation-NO-IDFA.debug.xcconfig */, - 6F31495AF08ABD9129D86C3CA8BA9D26 /* AMapFoundation-NO-IDFA.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/AMapFoundation-NO-IDFA"; - sourceTree = ""; - }; - BD468CEDE1301AE70B5CA9FD9F7CD826 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 7EDAE378C1569DD3368C0624FDE2113D /* AMapLocationKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - C1DC607AB7D37ECAABFED887C7630A90 /* AMapSearch-NO-IDFA */ = { - isa = PBXGroup; - children = ( - 60E7CA113B43A5A2D0B1418206FBA9A8 /* AMapCommonObj.h */, - 6F06A0B48AE05BAF86BDE766CEBB7E39 /* AMapNearbySearchManager.h */, - 4930D33BD830768CC42D00FF626DFFB6 /* AMapNearbyUploadInfo.h */, - 5F6F4BFA651FF8E271612E296471B8C1 /* AMapSearchAPI.h */, - 69D972EC0D2130742023356B0B668D9D /* AMapSearchError.h */, - 9FBBC30095C9C263948C70D42CE3473F /* AMapSearchKit.h */, - 9A7D23872A49D797E9324E74F5DC0B1D /* AMapSearchObj.h */, - 4AA674D62AF616A0CFA187129B0AC6A9 /* AMapSearchObjV1.h */, - 80FE6640DC269829CB27B57AA19AC78A /* AMapSearchVersion.h */, - 78782CF4C37401EE8318261C25624BF4 /* Frameworks */, - 0AA04EEFD33302440FC6FCFF2534644E /* Support Files */, - ); - name = "AMapSearch-NO-IDFA"; - path = "AMapSearch-NO-IDFA"; - sourceTree = ""; - }; - C4660840E721590828564584B1B19000 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 98A592A35178D779293675BEAE7EB81F /* UMAPM.xcframework */, - ); - name = Frameworks; - sourceTree = ""; - }; - C75636D4F2A1248602E2A8D1BDE138E8 /* Resources */ = { - isa = PBXGroup; - children = ( - BD3DEDEC06AD52F466DD282D684273D3 /* AMap.bundle */, - ); - name = Resources; + name = "Pods-suixinkan"; + path = "Target Support Files/Pods-suixinkan"; sourceTree = ""; }; CF1408CF629C7361332E53B88F7BD30C = { @@ -701,9 +650,9 @@ children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, - 1ACBDC3D9BAF8753C574C82B98A0ACAC /* Pods */, - 0C9DD1E4D8065565DC14E24533C93CA9 /* Products */, - 950E5BB3B2DCDC674191843B7BBB1ABF /* Targets Support Files */, + 73F803CD52D81A3DCE3CA16B75828CF8 /* Pods */, + C0A54D8DDA8ED18D016C2F971E3440BD /* Products */, + C111D316B9ED9498A7739F61CB9C3958 /* Targets Support Files */, ); sourceTree = ""; }; @@ -715,6 +664,119 @@ name = Frameworks; sourceTree = ""; }; + D33759C7A54882359A0F550EB233BDEE /* AMap3DMap-NO-IDFA */ = { + isa = PBXGroup; + children = ( + BF4E206010A80D9F4BD8AC654088FC62 /* MAAnimatedAnnotation.h */, + 24067F4DDEF17AFA8641D4550327134F /* MAAnnotation.h */, + BC6A8AE37A44303A7921B0F1E00000F0 /* MAAnnotationMoveAnimation.h */, + 7A8928E3841166C87F9104F3C7257ED1 /* MAAnnotationView.h */, + 081BB8B4C329A89813BAFEFD92F278DC /* MAArc.h */, + 607B12309D4BBE0A374F5681BC22567B /* MAArcRenderer.h */, + FDCF5C554E9F565E7A081E7D2D4D4267 /* MABaseEngineOverlay.h */, + BB6368DD0AABE98EED2B91B0BA922B8D /* MABaseOverlay.h */, + DEBCCADE7DDBA90A395DEF6DA0DB1549 /* MACircle.h */, + 9392453F7B8C8EC1DBC411A28840D283 /* MACircleRenderer.h */, + DC5BC1CE33C0778D3DF37DD68AF6A540 /* MAConfig.h */, + DE9CCDAE04DBF0C5163DC000763E8F22 /* MACustomBuildingOverlay.h */, + A41513919123C2DB492F2915452B99FB /* MACustomBuildingOverlayRenderer.h */, + 0CB65467D9BC6FB4CA43DBDEE8046DC8 /* MACustomCalloutView.h */, + 2BC8EBA3D7E41F9EA60264E82C2C3D54 /* MAGeodesicPolyline.h */, + A187CDD3DB66CAE55829663F7709D099 /* MAGeometry.h */, + 78B6815DC0004C618630DC5100B63C80 /* MAGroundOverlay.h */, + 664E58E6DDC2966578A2C9D32D9D8FFD /* MAGroundOverlayRenderer.h */, + E326873DD4D64984A558D4FDE649FB4A /* MAHeatMapTileOverlay.h */, + C163EE9A875637E6C1F824BA08BFE21B /* MAHeatMapVectorGridOverlay.h */, + 258B890CD915D0C02409050126A34A78 /* MAHeatMapVectorGridOverlayRenderer.h */, + CCCBE033D87F7E68F7F4F8A2604DB9FC /* MAHeatMapVectorOverlay.h */, + 05F51B66A225DC56F48A197D8DE3AB8E /* MAHeatMapVectorOverlayRender.h */, + C1DFE81417556E6F808D1284CF137ADE /* MAIndoorInfo.h */, + CAA8F759C5471E04D0EDCFD5BAE3E1F3 /* MALineDrawType.h */, + A847712EFCA54C3CF9E1B8503AE196D0 /* MAMapAccessibilityIdentifier.h */, + 45AB9E4A609CD01DF5027D580BD33218 /* MAMapCustomStyleOptions.h */, + 8D804F47730C24A80564C45691D62159 /* MAMapKit.h */, + 1BABD1E2BA172FF891B45D69723A8FA6 /* MAMapSnapshot.h */, + 0E97FA02BDFE7464E96DDDA67672EAB8 /* MAMapStatus.h */, + D0E173B83918C3601469EC66C94A97BE /* MAMapVersion.h */, + 0F67BAD007D9313441603E8FD0C72BDE /* MAMapView.h */, + 3F4A6FE6F5896BC28D894A3C56F4458B /* MAMapView+Resource.h */, + A64AFA54CDE002685FDDDBFF0A375A63 /* MAMultiColoredPolylineRenderer.h */, + 47DAF61B95087ADC814BD2F6DFD04D32 /* MAMultiPoint.h */, + 68FB23F98494515B5F635B2080AC2D74 /* MAMultiPointOverlay.h */, + C45073FF76FBFD70DE8060643C834BEE /* MAMultiPointOverlayRenderer.h */, + D49F2B29B08A21CE8044825FB0F690B6 /* MAMultiPolyline.h */, + 2EC3D8175A3DC6341FD9BA09E1108BD1 /* MAMultiTexturePolylineRenderer.h */, + 9DAF861C234DEFE0565960A25179B328 /* MAMVTTileOverlay.h */, + 05E4BFEB8A5EC2DC86095F225B502975 /* MAMVTTileOverlayRenderer.h */, + B3ED06C9CF721AE092A9ACEA19083CAC /* MAOfflineCity.h */, + 511E223F968C9463398F92B7634AA4C1 /* MAOfflineItem.h */, + F64961F52A461A351D3C2CF5AA5AB687 /* MAOfflineItemCommonCity.h */, + 3F99AF4BEDBB1A46A1B2DDA808C60C8A /* MAOfflineItemMunicipality.h */, + 56845156741368511567C6ED67855FBE /* MAOfflineItemNationWide.h */, + 311EEA5B46D1D7FAAA7E30958EBFE969 /* MAOfflineMap.h */, + 75399BCB7E0D56E144717DDCD6C7FBBC /* MAOfflineMapViewController.h */, + 57EF70D81C78649244E4B0F2BD22C385 /* MAOfflineProvince.h */, + 380659BF8742AC4FF0E4359B7E02FBEC /* MAOverlay.h */, + BF6A4572B83783CEDEC1AE7ABB74B145 /* MAOverlayPathRenderer.h */, + 3F6E024A4BC8B4F7C84F62B453336C6B /* MAOverlayRenderer.h */, + 87983C1BFF90B26765DB26FA52DC8FBE /* MAParticleOverlay.h */, + 495C8FA8FA1E743C3D041B5066D249A1 /* MAParticleOverlayOptions.h */, + 38F697EA154D9687F844A0F0C832E889 /* MAParticleOverlayRenderer.h */, + A54E3FB167D0EBC2D46C20A0F3D271F1 /* MAPathShowRange.h */, + DAB1615CF37670F70B385FD315D74635 /* MAPinAnnotationView.h */, + F66C83E664848DC373508F2C5D874901 /* MAPoiFilter.h */, + D3DF0EA33F3079DDA692A775FDC514CA /* MAPointAnnotation.h */, + 0D4EF6D40137F0A4CECF2C4CC617B5BA /* MAPolygon.h */, + 1733284B424C8D089B1C8E9C6167E533 /* MAPolygonRenderer.h */, + C4B9730FA8B1A82502EDF50DAEF161F7 /* MAPolyline.h */, + E5B7CC2B4D07007A9C53EDC66CCD5799 /* MAPolylineRenderer.h */, + C7114968961138953AAE2AD902FFD2A7 /* MARouteOverlay.h */, + E715DDE336E4E382EFE238BD6C30978D /* MARouteOverlayModel.h */, + 6A16CCC3A9F4BA44294C343AAA01EC6A /* MAShape.h */, + 5D2FAE9F6CE73F35242C57FADF198A4F /* MATerrainOverlay.h */, + 5B9FB578C59C2D6A42E4137C2BF6F3F4 /* MATerrainOverlayRenderer.h */, + 746BFCBA1ABA7DC28009805E10F58829 /* MATileOverlay.h */, + C78838CD3446DBC3B6C57416E5DF1601 /* MATileOverlayRenderer.h */, + 6DDB0F91BAEEA431301574B316329B0D /* MATouchPoi.h */, + D886BE5A9F5F18037B49BF5843A23557 /* MATraceLocation.h */, + 79F61EDF41457CD8F6AC99EEB203BDEF /* MATraceManager.h */, + 4F88C9D2A26698191E3F0BAB6E73C1D6 /* MAUserLocation.h */, + DE563497DD3BB9A6B51060C88124B030 /* MAUserLocationRepresentation.h */, + 3DD794182C921E59A62953E67C6E7BAD /* Frameworks */, + 701DD2AA6C7160AE06B46DD62ABCC15F /* Resources */, + EBB6A3C458125F3933DC713CFEBE57FA /* Support Files */, + ); + name = "AMap3DMap-NO-IDFA"; + path = "AMap3DMap-NO-IDFA"; + sourceTree = ""; + }; + DD51156B35FBCA6A32E3B025718A7857 /* Pods-suixinkanTests */ = { + isa = PBXGroup; + children = ( + 8954141270608938A38FD68585BFD293 /* Pods-suixinkanTests.modulemap */, + 668A9B1E2D7B1954AE52ABE25041CC36 /* Pods-suixinkanTests-acknowledgements.markdown */, + 930BB613D93B3F0743FE520201572148 /* Pods-suixinkanTests-acknowledgements.plist */, + BBC4E88072A58FC7DD14D5BC2316725E /* Pods-suixinkanTests-dummy.m */, + 0560C72601DFB7648983A59E3A8630CF /* Pods-suixinkanTests-Info.plist */, + 65EE9CD76EF8BD358253184A5FA8B069 /* Pods-suixinkanTests-umbrella.h */, + 3CE7B2EE0FE95BBD834825FA4D0571C5 /* Pods-suixinkanTests.debug.xcconfig */, + A1C2AE0D141F894C0C841BDB91EA7784 /* Pods-suixinkanTests.release.xcconfig */, + ); + name = "Pods-suixinkanTests"; + path = "Target Support Files/Pods-suixinkanTests"; + sourceTree = ""; + }; + DFDAD4C6E0E87D50276AF58AF0CC7A7B /* Support Files */ = { + isa = PBXGroup; + children = ( + D3E4AF577ED21FFF5C6997614BE817AF /* UMAPM-xcframeworks.sh */, + D738B4EADCCC0969B2C74EDD60C54C5F /* UMAPM.debug.xcconfig */, + 2B1E1B290F1753A341C14CED0A6F3F4D /* UMAPM.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/UMAPM"; + sourceTree = ""; + }; E4801F62A6B08CD9B5410329F1A18FDE /* iOS */ = { isa = PBXGroup; children = ( @@ -723,34 +785,40 @@ name = iOS; sourceTree = ""; }; - EFE4F44022406CE70DA6B996F0E66702 /* Pods-suixinkanTests */ = { + E9F17ABFD66E8A4813CAB917573983D8 /* Frameworks */ = { isa = PBXGroup; children = ( - C3A19D52634E74D69C3618659F0D3DAB /* Pods-suixinkanTests-acknowledgements.markdown */, - 72D4237878A7AEB36C50F21B2E47E0C0 /* Pods-suixinkanTests-acknowledgements.plist */, - 5751A9029355D65CC754769C67D37B6A /* Pods-suixinkanTests-dummy.m */, - B8DC04361F3610E49B9968D23D51BC46 /* Pods-suixinkanTests.debug.xcconfig */, - 13282EC9D188AFC53A46BE439A55B43C /* Pods-suixinkanTests.release.xcconfig */, + 5AE4ED04FC4934C3CFE1803544F7E599 /* WechatOpenSDK.xcframework */, ); - name = "Pods-suixinkanTests"; - path = "Target Support Files/Pods-suixinkanTests"; + name = Frameworks; + sourceTree = ""; + }; + EBB6A3C458125F3933DC713CFEBE57FA /* Support Files */ = { + isa = PBXGroup; + children = ( + 125064997C0EDA842FA880F67BB3D06F /* AMap3DMap-NO-IDFA.debug.xcconfig */, + BBA147F6EAE0D76BC35E87FCF69C9C2D /* AMap3DMap-NO-IDFA.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/AMap3DMap-NO-IDFA"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 32686F6E53E7347EA019261795E26FA5 /* Headers */ = { + 0B5772B23F4B6EB865EC392C56E09638 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 1B4E84392BCAE40B8D02294001544906 /* Pods-suixinkanTests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - BC72B692AD8FEDD7A0CAFF84E7CA648A /* Headers */ = { + BDD4D0D2F378A1FF6B69A4B7B9541A62 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 5FD052FC538BCC103FA39B596EE4B302 /* Pods-suixinkan-umbrella.h in Headers */, + 854C28C6CC7D858B9645ED10D409AF6C /* Pods-suixinkan-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -759,23 +827,24 @@ /* Begin PBXNativeTarget section */ 1DE17B7C77CD95CB67DF1197965B76AB /* Pods-suixinkan */ = { isa = PBXNativeTarget; - buildConfigurationList = 1040C509C316D42F5C4BB9D1C0F7D325 /* Build configuration list for PBXNativeTarget "Pods-suixinkan" */; + buildConfigurationList = 5D641A103C53ABF7AC3FDE4F6A159F62 /* Build configuration list for PBXNativeTarget "Pods-suixinkan" */; buildPhases = ( - BC72B692AD8FEDD7A0CAFF84E7CA648A /* Headers */, - 2AF351B4D20B5F346A8BF54A926BCC5C /* Sources */, - FCD94875AC737B1FBBFB67DEE3875789 /* Frameworks */, - D940493CB5219A9C45159EA2A6E33FE6 /* Resources */, + BDD4D0D2F378A1FF6B69A4B7B9541A62 /* Headers */, + F172A1B95C32954AA711E8EDD4DFF06B /* Sources */, + 8BD4903F809FAA786A7E5E69F62F63A5 /* Frameworks */, + 7C0E1A48BE53B1C311D97C652550C606 /* Resources */, ); buildRules = ( ); dependencies = ( - CFD7866CC8CDC4985B1F6F4A05F7890A /* PBXTargetDependency */, - 454B40AB3A05638466BDB0F255E4591B /* PBXTargetDependency */, - D013717606280ECE6B455E4E661B3427 /* PBXTargetDependency */, - 60845C8CD7D8E54F663CCA5A4D39513E /* PBXTargetDependency */, - A73E2D91F1D8BE1010ED0B784AB36AC9 /* PBXTargetDependency */, - A9F8329D01785F08B295CED0E053DBBB /* PBXTargetDependency */, - 6781B51D36CCCA4231182D1C7A53E779 /* PBXTargetDependency */, + 508BD9C74804FE09340D00029BA50402 /* PBXTargetDependency */, + 893469686E4BE480A26EDDA676C20422 /* PBXTargetDependency */, + 6C611DCC8170518F6D15BAF902FE9B3D /* PBXTargetDependency */, + 038C0F12DF18397FE75654A4A58EBFE1 /* PBXTargetDependency */, + C6207D906EF379F51AC9781645A73427 /* PBXTargetDependency */, + F41C3FE4AEBBE63D38E5D265A2DADB36 /* PBXTargetDependency */, + 42BC71A6B6E92FCA93067788C3AD6162 /* PBXTargetDependency */, + 928C950BECCEBEC3AA0B042EAA907D8D /* PBXTargetDependency */, ); name = "Pods-suixinkan"; productName = Pods_suixinkan; @@ -784,20 +853,22 @@ }; 508CB5D3E96E222654C51F13079FC2CD /* Pods-suixinkanTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 0FF5442420383DC8A85474A5B4249859 /* Build configuration list for PBXNativeTarget "Pods-suixinkanTests" */; + buildConfigurationList = 9D12533D25351890E8822DC48F49289E /* Build configuration list for PBXNativeTarget "Pods-suixinkanTests" */; buildPhases = ( - 32686F6E53E7347EA019261795E26FA5 /* Headers */, - 8D4E8F0FE3F64EBAAF0036431C314A0B /* Sources */, - D4D527249F0450377180344C717E09F3 /* Frameworks */, + 0B5772B23F4B6EB865EC392C56E09638 /* Headers */, + A4CA8592159F27EC0C6DAAF8D354D51C /* Sources */, + FE8D20F9B4D47B2212CF065B7D507950 /* Frameworks */, + 4995BF6BC2129E05D351581B0A223B59 /* Resources */, ); buildRules = ( ); dependencies = ( + B26EEB93D2DA6C57FF71DBE337CF2E85 /* PBXTargetDependency */, ); name = "Pods-suixinkanTests"; - productName = "Pods-suixinkanTests"; + productName = Pods_suixinkanTests; productReference = 1B7465A72120AF417FD5F1F34AD33AD4 /* Pods-suixinkanTests */; - productType = "com.apple.product-type.library.static"; + productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -819,7 +890,7 @@ mainGroup = CF1408CF629C7361332E53B88F7BD30C; minimizedProjectReferenceProxies = 0; preferredProjectObjectVersion = 77; - productRefGroup = 0C9DD1E4D8065565DC14E24533C93CA9 /* Products */; + productRefGroup = C0A54D8DDA8ED18D016C2F971E3440BD /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( @@ -832,12 +903,20 @@ F1E09035B7675D89EC69B16728E2833E /* UMAPM */, 09FABB7D06BB8D3958515FB15B4E7971 /* UMCommon */, CEB9AD2C3CFC208BFBE1F22F5EC3E1FC /* UMDevice */, + 7F18C31A804695333763EEC303E265D7 /* WechatOpenSDK-XCFramework */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - D940493CB5219A9C45159EA2A6E33FE6 /* Resources */ = { + 4995BF6BC2129E05D351581B0A223B59 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7C0E1A48BE53B1C311D97C652550C606 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -864,24 +943,24 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/UMAPM/UMAPM-xcframeworks.sh\"\n"; showEnvVarsInLog = 0; }; - 647C44114FEF22D16E0EB22CA7A7985F /* [CP] Copy XCFrameworks */ = { + 6C1F0AE00B88ED4F09755948A825C8EB /* [CP] Copy XCFrameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/UMDevice/UMDevice-xcframeworks-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks-input-files.xcfilelist", ); name = "[CP] Copy XCFrameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/UMDevice/UMDevice-xcframeworks-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/UMDevice/UMDevice-xcframeworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks.sh\"\n"; showEnvVarsInLog = 0; }; - 94278C9AEF05D9A76DE75DA7EE2B7101 /* [CP] Copy XCFrameworks */ = { + EF0E3FC9B6EE1A9C908433C323228B7C /* [CP] Copy XCFrameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -898,106 +977,213 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/UMCommon/UMCommon-xcframeworks.sh\"\n"; showEnvVarsInLog = 0; }; + EFB006F9E64CF4C9C37AA7A9DEC5BE68 /* [CP] Copy XCFrameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/UMDevice/UMDevice-xcframeworks-input-files.xcfilelist", + ); + name = "[CP] Copy XCFrameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/UMDevice/UMDevice-xcframeworks-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/UMDevice/UMDevice-xcframeworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 2AF351B4D20B5F346A8BF54A926BCC5C /* Sources */ = { + A4CA8592159F27EC0C6DAAF8D354D51C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 92ABE5E274BE32067142E9ACDF442FC9 /* Pods-suixinkan-dummy.m in Sources */, + 8AA66BD0572CCDC71153FEA95C7AB666 /* Pods-suixinkanTests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8D4E8F0FE3F64EBAAF0036431C314A0B /* Sources */ = { + F172A1B95C32954AA711E8EDD4DFF06B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 58366B551D12CE8C3BBF73A6310C1400 /* Pods-suixinkanTests-dummy.m in Sources */, + 38345B1EC1DA5F3668EE44701253E92A /* Pods-suixinkan-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 118DBC8E39021482F2E7B928B983789B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "AMapFoundation-NO-IDFA"; - target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; - targetProxy = 03CABC81F0EF30E05981B30779DCD860 /* PBXContainerItemProxy */; - }; - 454B40AB3A05638466BDB0F255E4591B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "AMapFoundation-NO-IDFA"; - target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; - targetProxy = 5BB3DFF85E7F9CC211D73DA6903B7C72 /* PBXContainerItemProxy */; - }; - 57BFF03A985F23A63D3A69772A021169 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "AMapFoundation-NO-IDFA"; - target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; - targetProxy = 2E6078C0AE86C2252F001F14BFC8C160 /* PBXContainerItemProxy */; - }; - 60845C8CD7D8E54F663CCA5A4D39513E /* PBXTargetDependency */ = { + 038C0F12DF18397FE75654A4A58EBFE1 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "AMapSearch-NO-IDFA"; target = 4F1379598302C9160590B3650C10E1A5 /* AMapSearch-NO-IDFA */; - targetProxy = 24005C1FF0EC74F5AE07BBAB0C662A3A /* PBXContainerItemProxy */; + targetProxy = 2F48F1B754086F0F2514AA521AB8B493 /* PBXContainerItemProxy */; }; - 6781B51D36CCCA4231182D1C7A53E779 /* PBXTargetDependency */ = { + 21EC4402F23CC89322584C4190C64981 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = UMDevice; target = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC /* UMDevice */; - targetProxy = 2BA425E7F16B465A25B138FFBB01C9F0 /* PBXContainerItemProxy */; + targetProxy = 3D12EEA2C94F5E7D1A04E3DCB8056418 /* PBXContainerItemProxy */; }; - 6E91429DA52A47FA7BF0FB651314A94F /* PBXTargetDependency */ = { + 29F474965F0AB7D17DB4A3D89EA9E86F /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "AMapFoundation-NO-IDFA"; target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; - targetProxy = 9F70C62E4FEEA257FE75373D9E3792D5 /* PBXContainerItemProxy */; + targetProxy = 067A6759ACA9A549384C729E1010EEB2 /* PBXContainerItemProxy */; }; - A73E2D91F1D8BE1010ED0B784AB36AC9 /* PBXTargetDependency */ = { + 39E8D398FFF9E2EF5EFCC030000214A6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = UMAPM; - target = F1E09035B7675D89EC69B16728E2833E /* UMAPM */; - targetProxy = C0BEBB9A080760B44BCF644F9B4DEFCE /* PBXContainerItemProxy */; + name = "AMapFoundation-NO-IDFA"; + target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; + targetProxy = ADE47395DAB29611CE948513B2F0F2E5 /* PBXContainerItemProxy */; }; - A885442A3C8377F7D96C283D098D8BCD /* PBXTargetDependency */ = { + 42BC71A6B6E92FCA93067788C3AD6162 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = UMDevice; target = CEB9AD2C3CFC208BFBE1F22F5EC3E1FC /* UMDevice */; - targetProxy = 2494DD16B8109B1AE8CB05BBF309FB1A /* PBXContainerItemProxy */; + targetProxy = A9B64CB2E1958A4EBD9D7B1E35942161 /* PBXContainerItemProxy */; }; - A9F8329D01785F08B295CED0E053DBBB /* PBXTargetDependency */ = { + 4EB0F71C76E065029AE9C426A2B43B81 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = UMCommon; target = 09FABB7D06BB8D3958515FB15B4E7971 /* UMCommon */; - targetProxy = B6DFCC4DF7A833C21B49A33F4577A4B2 /* PBXContainerItemProxy */; + targetProxy = 849BA746108EE0BE0F41CAF99BCF009C /* PBXContainerItemProxy */; }; - BC1788A6BEB4408C2B38DA7DAC054963 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = UMCommon; - target = 09FABB7D06BB8D3958515FB15B4E7971 /* UMCommon */; - targetProxy = 40CF718E505C28CD277890F5A4F829C7 /* PBXContainerItemProxy */; - }; - CFD7866CC8CDC4985B1F6F4A05F7890A /* PBXTargetDependency */ = { + 508BD9C74804FE09340D00029BA50402 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "AMap3DMap-NO-IDFA"; target = B44FB02BD2D3FEAD1F36808AD405A543 /* AMap3DMap-NO-IDFA */; - targetProxy = F00519A1BB8E3CD7DFB82DFF9CBF48B8 /* PBXContainerItemProxy */; + targetProxy = C0AB8415F3749D034999E1F84151D767 /* PBXContainerItemProxy */; }; - D013717606280ECE6B455E4E661B3427 /* PBXTargetDependency */ = { + 6C611DCC8170518F6D15BAF902FE9B3D /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "AMapLocation-NO-IDFA"; target = 4BD4E22D3419D68A85BDD6119CB37C6C /* AMapLocation-NO-IDFA */; - targetProxy = 1B322441D3420BF8297C52ECF1D5413E /* PBXContainerItemProxy */; + targetProxy = 33B5943FAAD2EDE37C3C94F327FA50BC /* PBXContainerItemProxy */; + }; + 893469686E4BE480A26EDDA676C20422 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "AMapFoundation-NO-IDFA"; + target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; + targetProxy = BD91D75C44C68F52A94B116B7D1294F4 /* PBXContainerItemProxy */; + }; + 928C950BECCEBEC3AA0B042EAA907D8D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "WechatOpenSDK-XCFramework"; + target = 7F18C31A804695333763EEC303E265D7 /* WechatOpenSDK-XCFramework */; + targetProxy = 24A06925FD6662781797D78547B19FC7 /* PBXContainerItemProxy */; + }; + AF80A180C5B3841DFC72A45C419B14BC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "AMapFoundation-NO-IDFA"; + target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; + targetProxy = 991CAE88F0A4725CB8E8F174974E5B98 /* PBXContainerItemProxy */; + }; + B26EEB93D2DA6C57FF71DBE337CF2E85 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-suixinkan"; + target = 1DE17B7C77CD95CB67DF1197965B76AB /* Pods-suixinkan */; + targetProxy = F7B6C2F4ACE4C28AB6488EF406B7E9D1 /* PBXContainerItemProxy */; + }; + C6207D906EF379F51AC9781645A73427 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = UMAPM; + target = F1E09035B7675D89EC69B16728E2833E /* UMAPM */; + targetProxy = E0029779384156C3352043F0C3AFFE56 /* PBXContainerItemProxy */; + }; + F41C3FE4AEBBE63D38E5D265A2DADB36 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = UMCommon; + target = 09FABB7D06BB8D3958515FB15B4E7971 /* UMCommon */; + targetProxy = 21C4E3AF810B766F005A0D66D3AB059F /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ + 0606EC124017CF52B54FEB3096BC7E75 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3CE7B2EE0FE95BBD834825FA4D0571C5 /* Pods-suixinkanTests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + INFOPLIST_FILE = "Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 0BCAF1F8602AC6A8045A87C66CB12623 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 61B7C8006610229F8A3485704A3944CF /* Pods-suixinkan.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + INFOPLIST_FILE = "Target Support Files/Pods-suixinkan/Pods-suixinkan-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-suixinkan/Pods-suixinkan.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; 1896DE7FDF20E26D5F5B8876A51159FD /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1FC0EEEF15C3563046CFB7D8F6D3C0A9 /* UMAPM.debug.xcconfig */; + baseConfigurationReference = D738B4EADCCC0969B2C74EDD60C54C5F /* UMAPM.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1012,9 +1198,9 @@ }; name = Debug; }; - 2EB87552564DBF881F69D2C9E65C8BD1 /* Release */ = { + 238D81937753E4FF6C917AC763D81E11 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6E30647781C1277088E9F767E5324F93 /* UMDevice.release.xcconfig */; + baseConfigurationReference = B1DCEAC5E67DFFADA00E8D6182638950 /* UMCommon.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1030,9 +1216,9 @@ }; name = Release; }; - 2F8E5F6950BFC977191086B6F8718D0B /* Debug */ = { + 27D4292B09C0A48EBA7BA9E64B9FB2A0 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1F434C340EE152947804F55B6AE07219 /* UMCommon.debug.xcconfig */; + baseConfigurationReference = 7FA9E9DE9F0DB76774F19BF713363C1C /* UMDevice.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1109,9 +1295,44 @@ }; name = Release; }; + 344DE8D74E5226AF919F633EE4D55104 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DED06228F2ED3100A01944BF056F3316 /* AMapFoundation-NO-IDFA.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 37EB5EC7458274F33279CFB41B6EF232 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A544FE588B3DA9A5527AB2104C1E3F6E /* UMDevice.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; 4211ACC895D2325D62E504C88FDE52F4 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7BDF2E8F09ACEE3D8A741F23C976A9AB /* UMAPM.release.xcconfig */; + baseConfigurationReference = 2B1E1B290F1753A341C14CED0A6F3F4D /* UMAPM.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1129,7 +1350,7 @@ }; 49EBBE60492138920A951F8BD7CD4013 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8B46D4EDC3A56E5C07C332C0BE1E1DB9 /* AMap3DMap-NO-IDFA.release.xcconfig */; + baseConfigurationReference = BBA147F6EAE0D76BC35E87FCF69C9C2D /* AMap3DMap-NO-IDFA.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1147,7 +1368,7 @@ }; 535F4FAD82A3C67D930C230498439B31 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 72D9F37AD28C464FC9E4C647C035D78D /* AMapSearch-NO-IDFA.debug.xcconfig */; + baseConfigurationReference = 8A2882BF8F5DC25616C1ED02D8BADE8B /* AMapSearch-NO-IDFA.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1162,9 +1383,49 @@ }; name = Debug; }; - 5A4D929AD92A223581DCE82855B4667D /* Debug */ = { + 59C25D381C381A4E53F13543611D1E41 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 54356B35640D6CD8108AE95EF1787EBF /* UMDevice.debug.xcconfig */; + baseConfigurationReference = A1C2AE0D141F894C0C841BDB91EA7784 /* Pods-suixinkanTests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + INFOPLIST_FILE = "Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 67242DEBED91BA1150976B291F8587A1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A36042A49C0F8540D18B799FFE9BAF4F /* UMCommon.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1179,9 +1440,9 @@ }; name = Debug; }; - 67DCAF77E27AFA5D95B6472FFBFC2138 /* Release */ = { + 6E2DE0211827AD4360DBA1170B0EA537 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2B90865ABB9627D294333A5A122ADC4E /* UMCommon.release.xcconfig */; + baseConfigurationReference = CCEB62137B691B96014FCE7C2963DE89 /* AMapFoundation-NO-IDFA.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1197,48 +1458,28 @@ }; name = Release; }; - 7525F006E62A757723957D59BCE67E69 /* Debug */ = { + 7082C84E9F4F3C5661F4397D14D70B1D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9D9526FE1C100309F9585E25F5EB1162 /* Pods-suixinkan.debug.xcconfig */; + baseConfigurationReference = 505E9C4F754A74BBF0BF433A1ABAB2D3 /* WechatOpenSDK-XCFramework.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; - INFOPLIST_FILE = "Target Support Files/Pods-suixinkan/Pods-suixinkan-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", - "@loader_path/Frameworks", ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-suixinkan/Pods-suixinkan.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; - SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; + VALIDATE_PRODUCT = YES; }; - name = Debug; + name = Release; }; - 75889A592F7C343A79F317069388FC95 /* Release */ = { + 750746DE9BF3773A59287F9A50E97153 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B79B0AA822A4C645D50FD95D9DDE2E83 /* Pods-suixinkan.release.xcconfig */; + baseConfigurationReference = 2D9188A08F7F86FBF3EBB3CD93699D53 /* Pods-suixinkan.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -1276,32 +1517,9 @@ }; name = Release; }; - 97DB4CDBC529E1117044EA1C572C3ADF /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B8DC04361F3610E49B9968D23D51BC46 /* Pods-suixinkanTests.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; A5889394557E95B280BBA784CBC27862 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6CB05FF4490FB9F75B6C53D8C13DFFF2 /* AMapLocation-NO-IDFA.debug.xcconfig */; + baseConfigurationReference = B97A4D37BDFE1DD115297273C4F4AAA7 /* AMapLocation-NO-IDFA.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1316,33 +1534,27 @@ }; name = Debug; }; - C9EB22AE30AD0D73483B9E95B9BE3138 /* Release */ = { + A8894230A204E1888695F3677A130967 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 13282EC9D188AFC53A46BE439A55B43C /* Pods-suixinkanTests.release.xcconfig */; + baseConfigurationReference = 93364FC6486AA57E263ACEAB802CA297 /* WechatOpenSDK-XCFramework.debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - ENABLE_MODULE_VERIFIER = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; IPHONEOS_DEPLOYMENT_TARGET = 16.0; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); SDKROOT = iphoneos; - SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; }; - name = Release; + name = Debug; }; CA5F2D3465D7CF173F604FC5D9E07ED5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6831B314F45EB77FB7BBA52758001C23 /* AMapSearch-NO-IDFA.release.xcconfig */; + baseConfigurationReference = 3D27E75D0D982BBB14DF16A6604AF8CD /* AMapSearch-NO-IDFA.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1360,7 +1572,7 @@ }; D80C09B5C3E12110BB1B81C6C2F5466A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 04CAEC1E43034458F2B81A75CEF78B78 /* AMapLocation-NO-IDFA.release.xcconfig */; + baseConfigurationReference = FA44E234FE67D2FC43874714AB8D64CE /* AMapLocation-NO-IDFA.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1376,26 +1588,9 @@ }; name = Release; }; - DACC382E212927FD5B3702ED6A612FBC /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 94F440BEB3117D12F0E6811057AE7277 /* AMapFoundation-NO-IDFA.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; DD7C8FFCC688D270EB22589A35ABBC73 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BCB2FF64B9690AAD67C63E7B370D0C81 /* AMap3DMap-NO-IDFA.debug.xcconfig */; + baseConfigurationReference = 125064997C0EDA842FA880F67BB3D06F /* AMap3DMap-NO-IDFA.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1410,24 +1605,6 @@ }; name = Debug; }; - E7B5AEB3601FA2902C454693FD7A3780 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6F31495AF08ABD9129D86C3CA8BA9D26 /* AMapFoundation-NO-IDFA.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; F4FF6A0D1970CA9705974E3CB2134802 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1497,24 +1674,6 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 0FF5442420383DC8A85474A5B4249859 /* Build configuration list for PBXNativeTarget "Pods-suixinkanTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97DB4CDBC529E1117044EA1C572C3ADF /* Debug */, - C9EB22AE30AD0D73483B9E95B9BE3138 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 1040C509C316D42F5C4BB9D1C0F7D325 /* Build configuration list for PBXNativeTarget "Pods-suixinkan" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7525F006E62A757723957D59BCE67E69 /* Debug */, - 75889A592F7C343A79F317069388FC95 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1524,24 +1683,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 48C2A83619BC707A3CCF5BE81DE24CEB /* Build configuration list for PBXAggregateTarget "UMCommon" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2F8E5F6950BFC977191086B6F8718D0B /* Debug */, - 67DCAF77E27AFA5D95B6472FFBFC2138 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4AAF0793F66CFAFB6F677F2646CBEB54 /* Build configuration list for PBXAggregateTarget "UMDevice" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5A4D929AD92A223581DCE82855B4667D /* Debug */, - 2EB87552564DBF881F69D2C9E65C8BD1 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 4BB6DBB059282CDC5130B3610AC32982 /* Build configuration list for PBXAggregateTarget "AMapLocation-NO-IDFA" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1551,6 +1692,24 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 4BD363A7955A50B752C0F2EE46DF82FA /* Build configuration list for PBXAggregateTarget "UMCommon" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 67242DEBED91BA1150976B291F8587A1 /* Debug */, + 238D81937753E4FF6C917AC763D81E11 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5D641A103C53ABF7AC3FDE4F6A159F62 /* Build configuration list for PBXNativeTarget "Pods-suixinkan" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0BCAF1F8602AC6A8045A87C66CB12623 /* Debug */, + 750746DE9BF3773A59287F9A50E97153 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 74F8BC6869B879C9A4487377E57EA717 /* Build configuration list for PBXAggregateTarget "AMapSearch-NO-IDFA" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1569,6 +1728,24 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 946C13012BDBDC56DC9D26E19BA9D129 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 344DE8D74E5226AF919F633EE4D55104 /* Debug */, + 6E2DE0211827AD4360DBA1170B0EA537 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 96B7158D5435EB95E2DC0D0FB8F01241 /* Build configuration list for PBXAggregateTarget "WechatOpenSDK-XCFramework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A8894230A204E1888695F3677A130967 /* Debug */, + 7082C84E9F4F3C5661F4397D14D70B1D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 9CA117AC0BCD26718BF9BD3A972FB596 /* Build configuration list for PBXAggregateTarget "AMap3DMap-NO-IDFA" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1578,11 +1755,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - ECDE59CD23CDA40B37AFA91EBEDBEC23 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */ = { + 9D12533D25351890E8822DC48F49289E /* Build configuration list for PBXNativeTarget "Pods-suixinkanTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - DACC382E212927FD5B3702ED6A612FBC /* Debug */, - E7B5AEB3601FA2902C454693FD7A3780 /* Release */, + 0606EC124017CF52B54FEB3096BC7E75 /* Debug */, + 59C25D381C381A4E53F13543611D1E41 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B9E2AB2044DB991A9B55D980CEBF2D9A /* Build configuration list for PBXAggregateTarget "UMDevice" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 27D4292B09C0A48EBA7BA9E64B9FB2A0 /* Debug */, + 37EB5EC7458274F33279CFB41B6EF232 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.markdown b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.markdown index 7ff25e6..8ad71de 100644 --- a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.markdown @@ -35,4 +35,9 @@ Copyright 2011 - 2021 umeng.com. All rights reserved. Copyright 2011 - 2021 umeng.com. All rights reserved. + +## WechatOpenSDK-XCFramework + +Copyright 2020 tencent.com. All rights reserved. + Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.plist b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.plist index 1671646..a36acfe 100644 --- a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.plist @@ -89,6 +89,17 @@ Type PSGroupSpecifier + + FooterText + Copyright 2020 tencent.com. All rights reserved. + + License + Copyright + Title + WechatOpenSDK-XCFramework + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.debug.xcconfig b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.debug.xcconfig index 97fb4ce..04645a4 100644 --- a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.debug.xcconfig +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.debug.xcconfig @@ -1,14 +1,15 @@ ARCHS = $(ARCHS_STANDARD) CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64 -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UMAPM" -framework "UMCommon" -framework "UMDevice" -OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AMap3DMap-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapFoundation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapLocation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapSearch-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMAPM" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMCommon" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMDevice" +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMAPM" -framework "UMCommon" -framework "UMDevice" -framework "WebKit" -framework "WechatOpenSDK" +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AMap3DMap-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapFoundation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapLocation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapSearch-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMAPM" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMCommon" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMDevice" "-F${PODS_CONFIGURATION_BUILD_DIR}/WechatOpenSDK-XCFramework" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES +VALID_ARCHS = arm64 x86_64 diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.release.xcconfig b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.release.xcconfig index 97fb4ce..04645a4 100644 --- a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.release.xcconfig +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.release.xcconfig @@ -1,14 +1,15 @@ ARCHS = $(ARCHS_STANDARD) CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64 -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UMAPM" -framework "UMCommon" -framework "UMDevice" -OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AMap3DMap-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapFoundation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapLocation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapSearch-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMAPM" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMCommon" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMDevice" +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMAPM" -framework "UMCommon" -framework "UMDevice" -framework "WebKit" -framework "WechatOpenSDK" +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AMap3DMap-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapFoundation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapLocation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapSearch-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMAPM" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMCommon" "-F${PODS_CONFIGURATION_BUILD_DIR}/UMDevice" "-F${PODS_CONFIGURATION_BUILD_DIR}/WechatOpenSDK-XCFramework" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES +VALID_ARCHS = arm64 x86_64 diff --git a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests-Info.plist b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests-Info.plist new file mode 100644 index 0000000..19cf209 --- /dev/null +++ b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests-umbrella.h b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests-umbrella.h new file mode 100644 index 0000000..a2ce7f7 --- /dev/null +++ b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_suixinkanTestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_suixinkanTestsVersionString[]; + diff --git a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.debug.xcconfig b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.debug.xcconfig index 26f2c77..c07427f 100644 --- a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.debug.xcconfig +++ b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.debug.xcconfig @@ -1,8 +1,13 @@ +ARCHS = $(ARCHS_STANDARD) CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64 +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES +VALID_ARCHS = arm64 x86_64 diff --git a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.modulemap b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.modulemap new file mode 100644 index 0000000..29dac89 --- /dev/null +++ b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_suixinkanTests { + umbrella header "Pods-suixinkanTests-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.release.xcconfig b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.release.xcconfig index 26f2c77..c07427f 100644 --- a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.release.xcconfig +++ b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.release.xcconfig @@ -1,8 +1,13 @@ +ARCHS = $(ARCHS_STANDARD) CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64 +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/UMAPM/UMAPM_2.0.7" "${PODS_ROOT}/UMCommon/UMCommon_7.5.11" "${PODS_ROOT}/UMDevice/UMDevice_3.6.0" "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMAPM" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMCommon" "${PODS_XCFRAMEWORKS_BUILD_DIR}/UMDevice" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES +VALID_ARCHS = arm64 x86_64 diff --git a/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks-input-files.xcfilelist b/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks-input-files.xcfilelist new file mode 100644 index 0000000..756669a --- /dev/null +++ b/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks.sh +${PODS_ROOT}/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework \ No newline at end of file diff --git a/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks-output-files.xcfilelist b/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks-output-files.xcfilelist new file mode 100644 index 0000000..e974475 --- /dev/null +++ b/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks-output-files.xcfilelist @@ -0,0 +1 @@ +${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework/WechatOpenSDK.framework \ No newline at end of file diff --git a/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks.sh b/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks.sh new file mode 100755 index 0000000..51b1780 --- /dev/null +++ b/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework-xcframeworks.sh @@ -0,0 +1,121 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + + +variant_for_slice() +{ + case "$1" in + "WechatOpenSDK.xcframework/ios-arm64") + echo "" + ;; + "WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator") + echo "simulator" + ;; + esac +} + +archs_for_slice() +{ + case "$1" in + "WechatOpenSDK.xcframework/ios-arm64") + echo "arm64" + ;; + "WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator") + echo "arm64 x86_64" + ;; + esac +} + +copy_dir() +{ + local source="$1" + local destination="$2" + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" \"${source}*\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" "${source}"/* "${destination}" +} + +SELECT_SLICE_RETVAL="" + +select_slice() { + local xcframework_name="$1" + xcframework_name="${xcframework_name##*/}" + local paths=("${@:2}") + # Locate the correct slice of the .xcframework for the current architectures + local target_path="" + + # Split archs on space so we can find a slice that has all the needed archs + local target_archs=$(echo $ARCHS | tr " " "\n") + + local target_variant="" + if [[ "$PLATFORM_NAME" == *"simulator" ]]; then + target_variant="simulator" + fi + if [[ ! -z ${EFFECTIVE_PLATFORM_NAME+x} && "$EFFECTIVE_PLATFORM_NAME" == *"maccatalyst" ]]; then + target_variant="maccatalyst" + fi + for i in ${!paths[@]}; do + local matched_all_archs="1" + local slice_archs="$(archs_for_slice "${xcframework_name}/${paths[$i]}")" + local slice_variant="$(variant_for_slice "${xcframework_name}/${paths[$i]}")" + for target_arch in $target_archs; do + if ! [[ "${slice_variant}" == "$target_variant" ]]; then + matched_all_archs="0" + break + fi + + if ! echo "${slice_archs}" | tr " " "\n" | grep -F -q -x "$target_arch"; then + matched_all_archs="0" + break + fi + done + + if [[ "$matched_all_archs" == "1" ]]; then + # Found a matching slice + echo "Selected xcframework slice ${paths[$i]}" + SELECT_SLICE_RETVAL=${paths[$i]} + break + fi + done +} + +install_xcframework() { + local basepath="$1" + local name="$2" + local package_type="$3" + local paths=("${@:4}") + + # Locate the correct slice of the .xcframework for the current architectures + select_slice "${basepath}" "${paths[@]}" + local target_path="$SELECT_SLICE_RETVAL" + if [[ -z "$target_path" ]]; then + echo "warning: [CP] $(basename ${basepath}): Unable to find matching slice in '${paths[@]}' for the current build architectures ($ARCHS) and platform (${EFFECTIVE_PLATFORM_NAME-${PLATFORM_NAME}})." + return + fi + local source="$basepath/$target_path" + + local destination="${PODS_XCFRAMEWORKS_BUILD_DIR}/${name}" + + if [ ! -d "$destination" ]; then + mkdir -p "$destination" + fi + + copy_dir "$source/" "$destination" + echo "Copied $source to $destination" +} + +install_xcframework "${PODS_ROOT}/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework" "WechatOpenSDK-XCFramework" "framework" "ios-arm64" "ios-arm64_x86_64-simulator" + diff --git a/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework.debug.xcconfig b/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework.debug.xcconfig new file mode 100644 index 0000000..37376da --- /dev/null +++ b/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework.debug.xcconfig @@ -0,0 +1,15 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/WechatOpenSDK-XCFramework +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3.0" -l"z" -framework "CoreGraphics" -framework "Security" -framework "UIKit" -framework "WebKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/WechatOpenSDK-XCFramework +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES +VALID_ARCHS = arm64 x86_64 diff --git a/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework.release.xcconfig b/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework.release.xcconfig new file mode 100644 index 0000000..37376da --- /dev/null +++ b/Pods/Target Support Files/WechatOpenSDK-XCFramework/WechatOpenSDK-XCFramework.release.xcconfig @@ -0,0 +1,15 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/WechatOpenSDK-XCFramework +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/WechatOpenSDK-XCFramework" "${PODS_XCFRAMEWORKS_BUILD_DIR}/WechatOpenSDK-XCFramework" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3.0" -l"z" -framework "CoreGraphics" -framework "Security" -framework "UIKit" -framework "WebKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/WechatOpenSDK-XCFramework +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES +VALID_ARCHS = arm64 x86_64 diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/Info.plist b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/Info.plist new file mode 100644 index 0000000..c6a49d5 --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/Info.plist @@ -0,0 +1,44 @@ + + + + + AvailableLibraries + + + BinaryPath + WechatOpenSDK.framework/WechatOpenSDK + LibraryIdentifier + ios-arm64_x86_64-simulator + LibraryPath + WechatOpenSDK.framework + SupportedArchitectures + + arm64 + x86_64 + + SupportedPlatform + ios + SupportedPlatformVariant + simulator + + + BinaryPath + WechatOpenSDK.framework/WechatOpenSDK + LibraryIdentifier + ios-arm64 + LibraryPath + WechatOpenSDK.framework + SupportedArchitectures + + arm64 + + SupportedPlatform + ios + + + CFBundlePackageType + XFWK + XCFrameworkFormatVersion + 1.0 + + diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/PrivacyInfo.xcprivacy b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..79bc9e2 --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/PrivacyInfo.xcprivacy @@ -0,0 +1,17 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + + diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/README.txt b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/README.txt new file mode 100644 index 0000000..3f2aab0 --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/README.txt @@ -0,0 +1,167 @@ +重要! +SDK2.0.5 +1. 支持模块化集成​:XCFramework 头文件引用改为标准化格式 #import ,解决路径冲突并支持 Swift/ObjC 混合开发 +2. 修复openWXApp偶现失败的问题 + +SDK2.0.4 +1.增加privacy manifest文件 +2.修复跳微信时可能卡顿的问题 + +SDK2.0.2 +1. 优化XCFramework打包方式 + +SDK2.0.1 +1. SDK支持XCFramework + +SDK2.0.0 +1. 分享能力支持内容防篡改校验 + +SDK1.9.9 +1. 授权登录支持关闭自动授权 +2. 分享支持添加签名,防止篡改 + +SDK1.9.7 +1. 适配CocoaPods + +SDK1.9.6 +1. 适配iOS 16,减少读写剪切板 + +SDK1.9.4 +1. 修复授权登录取消/拒绝时state字段没有带回 + +SDK1.9.3 +1. 新增发起二维码支付能力 + +SDK1.9.2 +1. 新增发起企微客服会话能力 + +SDK1.9.1 +1. 音乐视频分享类型增加运营H5字段 + +SDK1.8.9 +1. 增加音乐视频分享类型 + +SDK1.8.8 +1. 增加游戏直播消息类型 + +SDK1.8.7.1 +1. 修复Xcode11以下编译不通过 + +SDK1.8.7 +1. 修复iPadOS,未安装微信的情况下,因为UA问题无法授权登录 +2. 修复未安装微信的情况下, 适配了UIScene的App因为UIAlertView Crash +3. 增加Universal Link检测函数 + +SDK1.8.6.2 +1. 修改包含"UIWebView"字符的类名 + +SDK1.8.6.1 +1.短信授权登录使用的UIWebview切换成WKWebview + +SDK1.8.6 +1. 支持Universal Link拉起微信以及返回App +2. SDK移除MTA库 + +SDK1.8.5 +1. 更换MTA库:取消对剪切板的访问, 防止和其他SDK竞争导致crash +2. NSMutableArray的MTA分类方法改名,减少命名冲突 +3. 不含支付功能版本移除非税支付和医保支付接口 +4. 分享音乐支持填写歌词和高清封面图 + +SDK1.8.4 +1. 调整分享图片大小限制 +2. 新增openBusinessView接口 + +SDK1.8.3 +1. SDK增加调起微信刷卡支付接口 +2. SDK增加小程序订阅消息接口 +3. 修复小程序订阅消息接口没有resp的问题 + +SDK1.8.2 +1. SDK增加开发票授权 WXInvoiceAuthInsert +2. SDK增加非税接口 WXNontaxPay +3. SDK增加医保接口 WXPayInsurance +4. 更换MTA库 + +SDK1.8.1 +1. SDK打开小程序支持指定版本(体验,开发,正式版) +2. SDK分享小程序支持指定版本(体验,开发,正式版) +3. SDK支持输出log日志 + +SDK1.8.0 +1. SDK支持打开小程序 +2. SDK分享小程序支持shareTicket + +SDK1.7.9 +1. SDK订阅一次性消息 + +SDK1.7.8 +1 SDK分享小程序支持大图 + +SDK1.7.7 +1 增加SDK分享小程序 +2 增加选择发票接口 + +SDK1.7.6 +1. 提高稳定性 +1 修复mta崩溃 +2 新增接口支持开发者关闭mta数据统计上报 + +SDK1.7.5 +1. 提高稳定性 +2. 加快registerApp接口启动速度 + +SDK1.7.4 +1. 更新支持iOS启用 ATS(App Transport Security) +2. 需要在工程中链接CFNetwork.framework +3. 在工程配置中的”Other Linker Flags”中加入”-Objc -all_load” + +SDK1.7.3 +1. 增强稳定性,适配iOS10 +2. 修复小于32K的jpg格式缩略图设置失败的问题 + +SDK1.7.2 +1. 修复因CTTeleponyNetworkInfo引起的崩溃问题 + +SDK1.7.1 +1. 支持兼容ipv6(提升稳定性) +2. xCode Version 7.3.1 (7D1014) 编译 + +SDK1.7 +1. 支持兼容ipv6 +2. 修复若干问题增强稳定性 + +SDK1.6.3 +1. xCode7.2 构建的sdk包。 +2. 请使用xCode7.2进行编译。 +3. 需要在Build Phases中Link Security.framework +4. 修复若干小问题。 + +SDK1.6.2 +1、xCode7.1 构建的sdk包 +2、请使用xCode7.1进行编译 + +SDK1.6.1 +1、修复armv7s下,bitcode可能编译不过 +2、解决warning + +SDK1.6 +1、iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。 +受此影响,当你的应用在iOS 9中需要使用微信SDK的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里增加如下代码: +LSApplicationQueriesSchemes + +weixin + +NSAppTransportSecurity + +NSAllowsArbitraryLoads + + +2、开发者需要在工程中链接上 CoreTelephony.framework +3、解决bitcode编译不过问题 + +SDK1.5 +1、废弃safeSendReq:接口,使用sendReq:即可。 +2、新增+(BOOL) sendAuthReq:(SendAuthReq*) req viewController : (UIViewController*) viewController delegate:(id) delegate; +支持未安装微信情况下Auth,具体见WXApi.h接口描述 +3、微信开放平台新增了微信模块用户统计功能,便于开发者统计微信功能模块的用户使用和活跃情况。开发者需要在工程中链接上:SystemConfiguration.framework,libz.dylib,libsqlite3.0.dylib。 diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Headers/WXApi.h b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Headers/WXApi.h new file mode 100644 index 0000000..879c505 --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Headers/WXApi.h @@ -0,0 +1,231 @@ +// +// WXApi.h +// 所有Api接口 +// +// Created by Wechat on 12-2-28. +// Copyright (c) 2012年 Tencent. All rights reserved. +// + +#import +#import "WXApiObject.h" + +NS_ASSUME_NONNULL_BEGIN + + +typedef BOOL(^WXGrantReadPasteBoardPermissionCompletion)(void); + + +#pragma mark - WXApiDelegate +/*! @brief 接收并处理来自微信终端程序的事件消息 + * + * 接收并处理来自微信终端程序的事件消息,期间微信界面会切换到第三方应用程序。 + * WXApiDelegate 会在handleOpenURL:delegate:中使用并触发。 + */ +@protocol WXApiDelegate +@optional + +/*! @brief 收到一个来自微信的请求,第三方应用程序处理完后调用sendResp向微信发送结果 + * + * 收到一个来自微信的请求,异步处理完成后必须调用sendResp发送处理结果给微信。 + * 可能收到的请求有GetMessageFromWXReq、ShowMessageFromWXReq等。 + * @param req 具体请求内容,是自动释放的 + */ +- (void)onReq:(BaseReq*)req; + + + +/*! @brief 发送一个sendReq后,收到微信的回应 + * + * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。 + * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。 + * @param resp具体的回应内容,是自动释放的 + */ +- (void)onResp:(BaseResp*)resp; + +/* ! @brief 用于在iOS16以及以上系统上,控制OpenSDK是否读取剪切板中微信传递的数据以及读取的时机 + * 在iOS16以及以上系统,在SDK需要读取剪切板中微信写入的数据时,会回调该方法。没有实现默认会直接读取微信通过剪切板传递过来的数据 + * 注意: + * 1. 只在iOS16以及以上的系统版本上回调; + * 2. 不实现时,OpenSDK会直接调用读取剪切板接口,读取微信传递过来的数据; + * 3. 若实现该方法:开发者需要通过调用completion(), 支持异步,通知SDK允许读取剪切板中微信传递的数据, + * 不调用completion()则代表不授权OpenSDK读取剪切板,会导致收不到onReq:, onResp:回调,无法后续业务流程。请谨慎使用 + * 4. 不要长时间持有completion不释放,可能会导致内存泄漏。 + */ +- (void)onNeedGrantReadPasteBoardPermissionWithURL:(nonnull NSURL *)openURL completion:(nonnull WXGrantReadPasteBoardPermissionCompletion)completion; + +@end + +#pragma mark - WXApiLogDelegate + +@protocol WXApiLogDelegate + +- (void)onLog:(NSString*)log logLevel:(WXLogLevel)level; + +@end + + +#pragma mark - WXApi + +/*! @brief 微信Api接口函数类 + * + * 该类封装了微信终端SDK的所有接口 + */ +@interface WXApi : NSObject + +/*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。 + * + * 需要在每次启动第三方应用程序时调用。 + * @attention 请保证在主线程中调用此函数 + * @param appid 微信开发者ID + * @param universalLink 微信开发者Universal Link + * @return 成功返回YES,失败返回NO。 + */ ++ (BOOL)registerApp:(NSString *)appid universalLink:(NSString *)universalLink; + + +/*! @brief 处理旧版微信通过URL启动App时传递的数据 + * + * 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。 + * @param url 微信启动第三方应用时传递过来的URL + * @param delegate WXApiDelegate对象,用来接收微信触发的消息。 + * @return 成功返回YES,失败返回NO。 + */ ++ (BOOL)handleOpenURL:(NSURL *)url delegate:(nullable id)delegate; + + +/*! @brief 处理微信通过Universal Link启动App时传递的数据 + * + * 需要在 application:continueUserActivity:restorationHandler:中调用。 + * @param userActivity 微信启动第三方应用时系统API传递过来的userActivity + * @param delegate WXApiDelegate对象,用来接收微信触发的消息。 + * @return 成功返回YES,失败返回NO。 + */ ++ (BOOL)handleOpenUniversalLink:(NSUserActivity *)userActivity delegate:(nullable id)delegate; + + +/*! @brief 检查微信是否已被用户安装 + * + * @return 微信已安装返回YES,未安装返回NO。 + */ ++ (BOOL)isWXAppInstalled; + + + +/*! @brief 判断当前微信的版本是否支持OpenApi + * + * @return 支持返回YES,不支持返回NO。 + */ ++ (BOOL)isWXAppSupportApi; + + +/*! @brief 判断当前微信的版本是否支持分享微信状态功能 + * + * @attention 需在工程LSApplicationQueriesSchemes配置中添加weixinStateAPI + * @return 支持返回YES,不支持返回NO。 + */ ++ (BOOL)isWXAppSupportStateAPI; + + +#ifndef BUILD_WITHOUT_PAY +/*! @brief 判断当前微信的版本是否支持二维码拉起微信支付 + * + * @attention 需在工程LSApplicationQueriesSchemes配置中添加weixinQRCodePayAPI + * @return 支持返回YES,不支持返回NO。 + */ ++ (BOOL)isWXAppSupportQRCodePayAPI; + +#endif + + +/*! @brief 获取微信的itunes安装地址 + * + * @return 微信的安装地址字符串。 + */ ++ (NSString *)getWXAppInstallUrl; + + + +/*! @brief 获取当前微信SDK的版本号 + * + * @return 返回当前微信SDK的版本号 + */ ++ (NSString *)getApiVersion; + + + +/*! @brief 打开微信 + * + * @return 成功返回YES,失败返回NO。 + */ ++ (BOOL)openWXApp; + + + +/*! @brief 发送请求到微信,等待微信返回onResp + * + * 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持以下类型 + * SendAuthReq、SendMessageToWXReq、PayReq等。 + * @param req 具体的发送请求。 + * @param completion 调用结果回调block + */ ++ (void)sendReq:(BaseReq *)req completion:(void (^ __nullable)(BOOL success))completion; + +/*! @brief 收到微信onReq的请求,发送对应的应答给微信,并切换到微信界面 + * + * 函数调用后,会切换到微信的界面。第三方应用程序收到微信onReq的请求,异步处理该请求,完成后必须调用该函数。可能发送的相应有 + * GetMessageFromWXResp、ShowMessageFromWXResp等。 + * @param resp 具体的应答内容 + * @param completion 调用结果回调block + */ ++ (void)sendResp:(BaseResp*)resp completion:(void (^ __nullable)(BOOL success))completion; + + +/*! @brief 发送Auth请求到微信,支持用户没安装微信,等待微信返回onResp + * + * 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持SendAuthReq类型。 + * @param req 具体的发送请求。 + * @param viewController 当前界面对象。 + * @param delegate WXApiDelegate对象,用来接收微信触发的消息。 + * @param completion 调用结果回调block + */ ++ (void)sendAuthReq:(SendAuthReq *)req viewController:(UIViewController*)viewController delegate:(nullable id)delegate completion:(void (^ __nullable)(BOOL success))completion; + + +/*! @brief 测试函数,用于排查当前App通过Universal Link方式分享到微信的流程 + 注意1: 调用自检函数之前必须要先调用registerApp:universalLink接口, 并确认调用成功 + 注意2: 自检过程中会有Log产生,可以先调用startLogByLevel函数,根据Log排查问题 + 注意3: 会多次回调block + 注意4: 仅用于新接入SDK时调试使用,请勿在正式环境的调用 + * + * 当completion回调的step为WXULCheckStepFinal时,表示检测通过,Universal Link接入成功 + * @param completion 回调Block + */ ++ (void)checkUniversalLinkReady:(nonnull WXCheckULCompletion)completion; + + +/*! @brief WXApi的成员函数,接受微信的log信息。byBlock + 注意1:SDK会强引用这个block,注意不要导致内存泄漏,注意不要导致内存泄漏 + 注意2:调用过一次startLog by block之后,如果再调用一次任意方式的startLoad,会释放上一次logBlock,不再回调上一个logBlock + * + * @param level 打印log的级别 + * @param logBlock 打印log的回调block + */ + ++ (void)startLogByLevel:(WXLogLevel)level logBlock:(WXLogBolock)logBlock; + +/*! @brief WXApi的成员函数,接受微信的log信息。byDelegate + 注意1:sdk会弱引用这个delegate,这里可加任意对象为代理,不需要与WXApiDelegate同一个对象 + 注意2:调用过一次startLog by delegate之后,再调用一次任意方式的startLoad,不会再回调上一个logDelegate对象 + * @param level 打印log的级别 + * @param logDelegate 打印log的回调代理, + */ ++ (void)startLogByLevel:(WXLogLevel)level logDelegate:(id)logDelegate; + +/*! @brief 停止打印log,会清理block或者delegate为空,释放block + * @param + */ ++ (void)stopLog; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Headers/WXApiObject.h b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Headers/WXApiObject.h new file mode 100644 index 0000000..85b6457 --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Headers/WXApiObject.h @@ -0,0 +1,1410 @@ +// +// MMApiObject.h +// Api对象,包含所有接口和对象数据定义 +// +// Created by Wechat on 12-2-28. +// Copyright (c) 2012年 Tencent. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief 错误码 + * + */ +enum WXErrCode { + WXSuccess = 0, /**< 成功 */ + WXErrCodeCommon = -1, /**< 普通错误类型 */ + WXErrCodeUserCancel = -2, /**< 用户点击取消并返回 */ + WXErrCodeSentFail = -3, /**< 发送失败 */ + WXErrCodeAuthDeny = -4, /**< 授权失败 */ + WXErrCodeUnsupport = -5, /**< 微信不支持 */ +}; + + + +/*! @brief 请求发送场景 + * + */ +enum WXScene { + WXSceneSession = 0, /**< 聊天界面 */ + WXSceneTimeline = 1, /**< 朋友圈 */ + WXSceneFavorite = 2, /**< 收藏 */ + WXSceneSpecifiedSession = 3, /**< 指定联系人 */ + WXSceneState = 4, /**< 状态 */ +}; + + +enum WXAPISupport { + WXAPISupportSession = 0, +}; + + + +/*! @brief 跳转profile类型 + * + */ +enum WXBizProfileType { + WXBizProfileType_Normal = 0, //**< 普通公众号 */ + WXBizProfileType_Device = 1, //**< 硬件公众号 */ +}; + +/*! @brief 分享小程序类型 + * + */ +typedef NS_ENUM(NSUInteger, WXMiniProgramType) { + WXMiniProgramTypeRelease = 0, //**< 正式版 */ + WXMiniProgramTypeTest = 1, //**< 开发版 */ + WXMiniProgramTypePreview = 2, //**< 体验版 */ +}; + +/*! @brief 跳转mp网页类型 + * + */ +enum WXMPWebviewType { + WXMPWebviewType_Ad = 0, /**< 广告网页 **/ +}; + +/*! @brief log的级别 + * + */ +typedef NS_ENUM(NSInteger,WXLogLevel) { + WXLogLevelNormal = 0, // 打印日常的日志 + WXLogLevelDetail = 1, // 打印详细的日志 +}; + + +/*! @brief 打印回调的block + * + */ +typedef void(^WXLogBolock)(NSString *log); + +/*! @brief 微信Universal Link检查函数 (WXApi#checkUniversalLinkReady:),检查步骤枚举值 + * + * WXULCheckStepParams 参数检测 + * WXULCheckStepSystemVersion 当前系统版本检测 + * WXULCheckStepWechatVersion 微信客户端版本检测 + * WXULCheckStepSDKInnerOperation 微信SDK内部操作检测 + * WXULCheckStepLaunchWechat App拉起微信检测 + * WXULCheckStepBackToCurrentApp 由微信返回当前App检测 + * WXULCheckStepFinal 最终结果 + */ +typedef NS_ENUM(NSInteger, WXULCheckStep) +{ + WXULCheckStepParams, + WXULCheckStepSystemVersion, + WXULCheckStepWechatVersion, + WXULCheckStepSDKInnerOperation, + WXULCheckStepLaunchWechat, + WXULCheckStepBackToCurrentApp, + WXULCheckStepFinal, +}; + + +#pragma mark - WXCheckULStepResult + +/*! @brief 该类为微信Universal Link检测函数结果类 +* +*/ +@interface WXCheckULStepResult : NSObject + +/** 是否成功 */ +@property(nonatomic, assign) BOOL success; +/** 当前错误信息 */ +@property(nonatomic, strong) NSString* errorInfo; +/** 修正建议 */ +@property(nonatomic, strong) NSString* suggestion; + +- (instancetype)initWithCheckResult:(BOOL)success errorInfo:(nullable NSString*)errorInfo suggestion:(nullable NSString*)suggestion; + +@end + + +/*! @brief 微信Universal Link检查函数 (WXApi#checkUniversalLinkReady:),回调Block + * + * @param step 当前检测步骤 + * @param result 检测结果 + */ +typedef void(^WXCheckULCompletion)(WXULCheckStep step, WXCheckULStepResult* result); + + +#pragma mark - BaseReq +/*! @brief 该类为微信终端SDK所有请求类的基类 + * + */ +@interface BaseReq : NSObject + +/** 请求类型 */ +@property (nonatomic, assign) int type; +/** 由用户微信号和AppID组成的唯一标识,需要校验微信用户是否换号登录时填写*/ +@property (nonatomic, copy) NSString *openID; + +@end + + + +#pragma mark - BaseResp +/*! @brief 该类为微信终端SDK所有响应类的基类 + * + */ +@interface BaseResp : NSObject +/** 错误码 */ +@property (nonatomic, assign) int errCode; +/** 错误提示字符串 */ +@property (nonatomic, copy) NSString *errStr; +/** 响应类型 */ +@property (nonatomic, assign) int type; + +@end + + + +#pragma mark - WXMediaMessage +@class WXMediaMessage; + +#ifndef BUILD_WITHOUT_PAY + +#pragma mark - PayReq +/*! @brief 第三方向微信终端发起支付的消息结构体 + * + * 第三方向微信终端发起支付的消息结构体,微信终端处理后会向第三方返回处理结果 + * @see PayResp + */ +@interface PayReq : BaseReq + +/** 商家向财付通申请的商家id */ +@property (nonatomic, copy) NSString *partnerId; +/** 预支付订单 */ +@property (nonatomic, copy) NSString *prepayId; +/** 随机串,防重发 */ +@property (nonatomic, copy) NSString *nonceStr; +/** 时间戳,防重发 */ +@property (nonatomic, assign) UInt32 timeStamp; +/** 商家根据财付通文档填写的数据和签名 */ +@property (nonatomic, copy) NSString *package; +/** 商家根据微信开放平台文档对数据做的签名 */ +@property (nonatomic, copy) NSString *sign; + +@end + + +#pragma mark - PayResp +/*! @brief 微信终端返回给第三方的关于支付结果的结构体 + * + * 微信终端返回给第三方的关于支付结果的结构体 + */ +@interface PayResp : BaseResp + +/** 财付通返回给商家的信息 */ +@property (nonatomic, copy) NSString *returnKey; + +@end + +#pragma mark - WXOfflinePay +/*! @brief 第三方向微信终端发起离线支付 + * + * 第三方向微信终端发起离线支付的消息结构体 + */ +@interface WXOfflinePayReq : BaseReq + +@end + +/*! @brief 第三方向微信终端发起离线支付返回 + * + * 第三方向微信终端发起离线支付返回的消息结构体 + */ +@interface WXOfflinePayResp : BaseResp + +@end + + +#pragma mark - WXNontaxPayReq +@interface WXNontaxPayReq:BaseReq + +@property (nonatomic, copy) NSString *urlString; + +@end + +#pragma mark - WXNontaxPayResp +@interface WXNontaxPayResp : BaseResp + +@property (nonatomic, copy) NSString *wxOrderId; + +@end + +#pragma mark - WXPayInsuranceReq +@interface WXPayInsuranceReq : BaseReq + +@property (nonatomic, copy) NSString *urlString; + +@end + +#pragma mark - WXPayInsuranceResp +@interface WXPayInsuranceResp : BaseResp + +@property (nonatomic, copy) NSString *wxOrderId; + +@end + + +#pragma mark - WXQRCodePayReq +@interface WXQRCodePayReq : BaseReq +/** 码内容 + * @note 必填,码长度必须大于0且小于10K + */ +@property (nonatomic, copy) NSString *codeContent; +/** 额外信息 + * @note 长度必须大于0且小于10K + */ +@property (nonatomic, copy) NSString *extraMsg; + +@end + +@interface WXQRCodePayResp : BaseResp +@end + +#endif + + +#pragma mark - SendAuthReq +/*! @brief 第三方程序向微信终端请求认证的消息结构 + * + * 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数, + * 向微信终端发送一个SendAuthReq消息结构。微信终端处理完后会向第三方程序发送一个处理结果。 + * @see SendAuthResp + */ +@interface SendAuthReq : BaseReq +/** 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数,向微信终端发送一个SendAuthReq消息结构。微信终端处理完后会向第三方程序发送一个处理结果。 + * @see SendAuthResp + * @note scope字符串长度不能超过1K + */ +@property (nonatomic, copy) NSString *scope; +/** 第三方程序本身用来标识其请求的唯一性,最后跳转回第三方程序时,由微信终端回传。 + * @note state字符串长度不能超过1K + */ +@property (nonatomic, copy) NSString *state; + +@property (nonatomic, assign) BOOL isOption1; + +/** 是否关闭自动授权 + * @note YES为关闭自动授权,每次登陆都需要用户手动授权;NO为允许自动授权 + */ +@property (nonatomic, assign) BOOL nonautomatic; + +@property (nonatomic, copy) NSString *extData; + +@end + +#pragma mark - SendAuthResp +/*! @brief 微信处理完第三方程序的认证和权限申请后向第三方程序回送的处理结果。 + * + * 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数,向微信终端发送一个SendAuthReq消息结构。 + * 微信终端处理完后会向第三方程序发送一个SendAuthResp。 + * @see onResp + */ +@interface SendAuthResp : BaseResp +@property (nonatomic, copy, nullable) NSString *code; +/** 第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传 + * @note state字符串长度不能超过1K + * @note 在复杂度较高的应用程序中,可能会出现其他模块请求的响应对象被错误地回调到当前模块。 + * 为了避免影响其他模块,建议当前模块的开发者根据SendAuthResp的内容,采用白名单的方式进行处理。 + * 例如,SendAuthResp.state符合预期时,才对其进行处理。 + */ +@property (nonatomic, copy, nullable) NSString *state; +@property (nonatomic, copy, nullable) NSString *lang; +@property (nonatomic, copy, nullable) NSString *country; +@end + +#pragma mark - WXStateJumpInfo +/*! @brief 状态发表时的小尾巴跳转信息 + */ +@interface WXStateJumpInfo : NSObject + +@end + +#pragma mark - WXStateJumpUrlInfo +/*! @brief 状态小尾巴跳转指定url的信息 + */ +@interface WXStateJumpUrlInfo : WXStateJumpInfo +/** 跳转到指定的url + * @note 必填,url长度必须大于0且小于10K + */ +@property (nonatomic, copy) NSString *url; + +@end + +#pragma mark - WXStateJumpWXMiniProgramInfo +/*! @brief 状态小尾巴跳转指定小程序的信息 + */ +@interface WXStateJumpMiniProgramInfo : WXStateJumpInfo +/** 小程序username + * @note 必填 + */ +@property (nonatomic, copy) NSString *username; + +/** 小程序页面的路径 + * @attention 不填默认拉起小程序首页 + */ +@property (nonatomic, copy, nullable) NSString *path; + +/** 分享小程序的版本 + * @attention (正式,开发,体验) + */ +@property (nonatomic, assign) WXMiniProgramType miniProgramType; + +@end + + + +#pragma mark - WXStateJumpWXMiniProgramInfo +/*! @brief 状态小尾巴跳转指定视频号主页信息 + */ +@interface WXStateJumpChannelProfileInfo : WXStateJumpInfo +/** 视频号username + * @note 必填,username长度必须大于0且小于1K + */ +@property (nonatomic, copy) NSString *username; + + +@end + +#pragma mark - WXStateSceneDataObject +/*! @brief 场景类型额外参数基类 + */ +@interface WXSceneDataObject : NSObject + +@end + +#pragma mark - WXStateSceneDataObject +/*! @brief 状态场景类型 + * 用户填写WXStateSceneDataObject参数后,可以跳转到微信状态发表页 + */ +@interface WXStateSceneDataObject : WXSceneDataObject + +/** 状态标志的ID + * @note 选填,文本长度必须小于10K + */ +@property (nonatomic, copy) NSString *stateId; +/** 状态发表时附带的文本描述 + * @note 选填,文本长度必须小于10K + */ +@property (nonatomic, copy) NSString *stateTitle; +/** 后台校验token + * @note 选填,文本长度必须小于10K + */ +@property (nonatomic, copy) NSString *token; +/** 小尾巴跳转所需的信息 + * @note 必填,目前仅支持url跳转 + */ +@property (nonatomic, strong) WXStateJumpInfo *stateJumpDataInfo; + +@end + +#pragma mark - SendMessageToWXReq +/*! @brief 第三方程序发送消息至微信终端程序的消息结构体 + * + * 第三方程序向微信发送信息需要传入SendMessageToWXReq结构体,信息类型包括文本消息和多媒体消息, + * 分别对应于text和message成员。调用该方法后,微信处理完信息会向第三方程序发送一个处理结果。 + * @see SendMessageToWXResp + */ +@interface SendMessageToWXReq : BaseReq +/** 发送消息的文本内容 + * @note 文本长度必须大于0且小于10K + */ +@property (nonatomic, copy) NSString *text; +/** 发送消息的多媒体内容 + * @see WXMediaMessage + */ +@property (nonatomic, strong) WXMediaMessage *message; +/** 发送消息的类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息 */ +@property (nonatomic, assign) BOOL bText; +/** 发送的目标场景,可以选择发送到会话(WXSceneSession)或者朋友圈(WXSceneTimeline)。 默认发送到会话。 + * @see WXScene + */ +@property (nonatomic, assign) int scene; +/** 指定发送消息的人 + * @note WXSceneSpecifiedSession时有效 + */ +@property (nonatomic, copy, nullable) NSString *toUserOpenId; +/** 目标场景附带信息 + * @note 目前只针对状态场景 + */ +@property (nonatomic, strong) WXSceneDataObject *sceneDataObject; + +@end + +#pragma mark - SendMessageToWXResp +/*! @brief 微信终端向第三方程序返回的SendMessageToWXReq处理结果。 + * + * 第三方程序向微信终端发送SendMessageToWXReq后,微信发送回来的处理结果,该结果用SendMessageToWXResp表示。 + */ +@interface SendMessageToWXResp : BaseResp +@property(nonatomic, copy) NSString *lang; +@property(nonatomic, copy) NSString *country; +@end + +#pragma mark - GetMessageFromWXReq +/*! @brief 微信终端向第三方程序请求提供内容的消息结构体。 + * + * 微信终端向第三方程序请求提供内容,微信终端会向第三方程序发送GetMessageFromWXReq消息结构体, + * 需要第三方程序调用sendResp返回一个GetMessageFromWXResp消息结构体。 + */ +@interface GetMessageFromWXReq : BaseReq +@property (nonatomic, strong) NSString *lang; +@property (nonatomic, strong) NSString *country; +@end + + + +#pragma mark - GetMessageFromWXResp +/*! @brief 微信终端向第三方程序请求提供内容,第三方程序向微信终端返回的消息结构体。 + * + * 微信终端向第三方程序请求提供内容,第三方程序调用sendResp向微信终端返回一个GetMessageFromWXResp消息结构体。 + */ +@interface GetMessageFromWXResp : BaseResp +/** 向微信终端提供的文本内容 + @note 文本长度必须大于0且小于10K + */ +@property (nonatomic, strong) NSString *text; +/** 向微信终端提供的多媒体内容。 + * @see WXMediaMessage + */ +@property (nonatomic, strong) WXMediaMessage *message; +/** 向微信终端提供内容的消息类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息 */ +@property (nonatomic, assign) BOOL bText; +@end + + + +#pragma mark - ShowMessageFromWXReq +/*! @brief 微信通知第三方程序,要求第三方程序显示的消息结构体。 + * + * 微信需要通知第三方程序显示或处理某些内容时,会向第三方程序发送ShowMessageFromWXReq消息结构体。 + * 第三方程序处理完内容后调用sendResp向微信终端发送ShowMessageFromWXResp。 + */ +@interface ShowMessageFromWXReq : BaseReq +/** 微信终端向第三方程序发送的要求第三方程序处理的多媒体内容 + * @see WXMediaMessage + */ +@property (nonatomic, strong) WXMediaMessage *message; +@property (nonatomic, copy) NSString *lang; +@property (nonatomic, copy) NSString *country; +@end + + + +#pragma mark - ShowMessageFromWXResp +/*! @brief 微信通知第三方程序,要求第三方程序显示或处理某些消息,第三方程序处理完后向微信终端发送的处理结果。 + * + * 微信需要通知第三方程序显示或处理某些内容时,会向第三方程序发送ShowMessageFromWXReq消息结构体。 + * 第三方程序处理完内容后调用sendResp向微信终端发送ShowMessageFromWXResp。 + */ +@interface ShowMessageFromWXResp : BaseResp +@end + + +#pragma mark - LaunchFromWXReq +/*! @brief 微信终端打开第三方程序携带的消息结构体 + * + * 微信向第三方发送的结构体,第三方不需要返回 + */ +@interface LaunchFromWXReq : BaseReq +@property (nonatomic, strong) WXMediaMessage *message; +@property (nonatomic, copy) NSString *lang; +@property (nonatomic, copy) NSString *country; +@end + + +#pragma mark - OpenWebviewReq +/* ! @brief 第三方通知微信启动内部浏览器,打开指定网页 + * + * 第三方通知微信启动内部浏览器,打开指定Url对应的网页 + */ +@interface OpenWebviewReq : BaseReq +/** 需要打开的网页对应的Url + * @attention 长度不能超过1024 + */ +@property(nonatomic, copy) NSString *url; + +@end + +#pragma mark - OpenWebviewResp +/*! @brief 微信终端向第三方程序返回的OpenWebviewReq处理结果 + * + * 第三方程序向微信终端发送OpenWebviewReq后,微信发送回来的处理结果,该结果用OpenWebviewResp表示 + */ +@interface OpenWebviewResp : BaseResp + +@end + + + +#pragma mark - WXOpenBusinessWebViewReq +/*! @brief 第三方通知微信启动内部浏览器,打开指定业务的网页 + * + * + */ +@interface WXOpenBusinessWebViewReq : BaseReq + +/** 网页业务类型 + * @attention + */ +@property (nonatomic, assign) UInt32 businessType; + +/** 网页业务参数 + * @attention + */ +@property (nonatomic, strong, nullable) NSDictionary *queryInfoDic; + +@end + +#pragma mark - WXOpenBusinessWebViewResp +/*! @brief 微信终端向第三方程序返回的WXOpenBusinessWebViewResp处理结果。 + * + * 第三方程序向微信终端发送WXOpenBusinessWebViewReq后,微信发送回来的处理结果,该结果用WXOpenBusinessWebViewResp表示。 + */ +@interface WXOpenBusinessWebViewResp : BaseResp +/** 第三方程序自定义简单数据,微信终端会回传给第三方程序处理 + * @attention 长度不能超过2k + */ +@property (nonatomic, copy) NSString *result; + +/** 网页业务类型 + * @attention + */ +@property (nonatomic, assign) UInt32 businessType; + +@end + + +#pragma mark - OpenRankListReq +/* ! @brief 第三方通知微信,打开硬件排行榜 + * + * 第三方通知微信,打开硬件排行榜 + */ +@interface OpenRankListReq : BaseReq + +@end + +#pragma mark - OpenRanklistResp +/*! @brief 微信终端向第三方程序返回的OpenRankListReq处理结果。 + * + * 第三方程序向微信终端发送OpenRankListReq后,微信发送回来的处理结果,该结果用OpenRankListResp表示。 + */ +@interface OpenRankListResp : BaseResp + +@end + + +#pragma mark - WXCardItem + +@interface WXCardItem : NSObject +/** 卡id + * @attention 长度不能超过1024字节 + */ +@property (nonatomic, copy) NSString *cardId; +/** ext信息 + * @attention 长度不能超过2024字节 + */ +@property (nonatomic, copy, nullable) NSString *extMsg; +/** + * @attention 卡的状态,req不需要填。resp:0为未添加,1为已添加。 + */ +@property (nonatomic, assign) UInt32 cardState; +/** + * @attention req不需要填,chooseCard返回的。 + */ +@property (nonatomic, copy) NSString *encryptCode; +/** + * @attention req不需要填,chooseCard返回的。 + */ +@property (nonatomic, copy) NSString *appID; +@end; + +#pragma mark - WXInvoiceItem + +@interface WXInvoiceItem : NSObject +/** 卡id + * @attention 长度不能超过1024字节 + */ +@property (nonatomic, copy) NSString *cardId; +/** ext信息 + * @attention 长度不能超过2024字节 + */ +@property (nonatomic, copy, nullable) NSString *extMsg; +/** + * @attention 卡的状态,req不需要填。resp:0为未添加,1为已添加。 + */ +@property (nonatomic, assign) UInt32 cardState; +/** + * @attention req不需要填,chooseCard返回的。 + */ +@property (nonatomic, copy) NSString *encryptCode; +/** + * @attention req不需要填,chooseCard返回的。 + */ +@property (nonatomic, copy) NSString *appID; + +@end + +#pragma mark - AddCardToWXCardPackageReq +/* ! @brief 请求添加卡券至微信卡包 + * + */ + +@interface AddCardToWXCardPackageReq : BaseReq +/** 卡列表 + * @attention 个数不能超过40个 类型WXCardItem + */ +@property (nonatomic, strong) NSArray *cardAry; + +@end + + +#pragma mark - AddCardToWXCardPackageResp +/** ! @brief 微信返回第三方添加卡券结果 + * + */ + +@interface AddCardToWXCardPackageResp : BaseResp +/** 卡列表 + * @attention 个数不能超过40个 类型WXCardItem + */ +@property (nonatomic, strong) NSArray *cardAry; +@end + +#pragma mark - WXChooseCardReq +/* ! @brief 请求从微信选取卡券 + * + */ + +@interface WXChooseCardReq : BaseReq +@property (nonatomic, copy) NSString *appID; +@property (nonatomic, assign) UInt32 shopID; +@property (nonatomic, assign) UInt32 canMultiSelect; +@property (nonatomic, copy) NSString *cardType; +@property (nonatomic, copy) NSString *cardTpID; +@property (nonatomic, copy) NSString *signType; +@property (nonatomic, copy) NSString *cardSign; +@property (nonatomic, assign) UInt32 timeStamp; +@property (nonatomic, copy) NSString *nonceStr; +@end + + +#pragma mark - WXChooseCardResp +/** ! @brief 微信返回第三方请求选择卡券结果 + * + */ + +@interface WXChooseCardResp : BaseResp +@property (nonatomic, strong ) NSArray* cardAry; +@end + + +#pragma mark - WXChooseInvoiceReq +/* ! @brief 请求从微信选取发票 + * + */ +@interface WXChooseInvoiceReq : BaseReq +@property (nonatomic, copy) NSString *appID; +@property (nonatomic, assign) UInt32 shopID; +@property (nonatomic, copy) NSString *signType; +@property (nonatomic, copy) NSString *cardSign; +@property (nonatomic, assign) UInt32 timeStamp; +@property (nonatomic, copy) NSString *nonceStr; +@end + +#pragma mark - WXChooseInvoiceResp +/** ! @brief 微信返回第三方请求选择发票结果 + * + */ +@interface WXChooseInvoiceResp : BaseResp +@property (nonatomic, strong) NSArray* cardAry; +@end + +#pragma mark - WXSubscriptionReq +@interface WXSubscribeMsgReq : BaseReq +@property (nonatomic, assign) UInt32 scene; +@property (nonatomic, copy) NSString *templateId; +@property (nonatomic, copy, nullable) NSString *reserved; +@end + +#pragma mark - WXSubscriptionReq +@interface WXSubscribeMsgResp : BaseResp + +@property (nonatomic, copy) NSString *templateId; +@property (nonatomic, assign) UInt32 scene; +@property (nonatomic, copy) NSString *action; +@property (nonatomic, copy) NSString *reserved; +@property (nonatomic, copy, nullable) NSString *openId; + +@end + +#pragma mark - WXSubscribeMiniProgramMsg +/** ! @brief 第三方请求订阅小程序消息 + * + */ +@interface WXSubscribeMiniProgramMsgReq : BaseReq +@property (nonatomic, copy) NSString *miniProgramAppid; +@end + +#pragma mark - WXSubscriptionReq +@interface WXSubscribeMiniProgramMsgResp : BaseResp + +@property(nonatomic, copy) NSString *openId; // 小程序openid +@property(nonatomic, copy) NSString *unionId; // unionId +@property(nonatomic, copy) NSString *nickName; // 用户昵称 + +@end + +#pragma mark - WXinvoiceAuthInsertReq +@interface WXInvoiceAuthInsertReq : BaseReq + +@property (nonatomic, copy) NSString *urlString; + +@end + +#pragma mark - WXinvoiceAuthInsertResp + +@interface WXInvoiceAuthInsertResp : BaseResp + +@property (nonatomic, copy) NSString *wxOrderId; + +@end + +#pragma mark - WXMediaMessage + +/*! @brief 多媒体消息结构体 + * + * 用于微信终端和第三方程序之间传递消息的多媒体消息内容 + */ +@interface WXMediaMessage : NSObject + ++ (WXMediaMessage *)message; + +/** 标题 + * @note 长度不能超过512字节 + */ +@property (nonatomic, copy) NSString *title; +/** 描述内容 + * @note 长度不能超过1K + */ +@property (nonatomic, copy) NSString *description; +/** 缩略图数据 + * @note 大小不能超过64K + */ +@property (nonatomic, strong, nullable) NSData *thumbData; +/** + * @note 长度不能超过64字节 + */ +@property (nonatomic, copy, nullable) NSString *mediaTagName; +/** + * + */ +@property (nonatomic, copy, nullable) NSString *messageExt; +@property (nonatomic, copy, nullable) NSString *messageAction; +/** + * 多媒体数据对象,可以为WXImageObject,WXMusicObject,WXVideoObject,WXWebpageObject等。 + */ +@property (nonatomic, strong) id mediaObject; + +/** 缩略图的hash值 + * @note 使用sha256得到,用于计算签名 + */ +@property (nonatomic, copy, nullable) NSString *thumbDataHash; + +/** 消息签名 + * @note 用于校验消息体是否被篡改过 + */ +@property (nonatomic, copy, nullable) NSString *msgSignature; + + +/*! @brief 设置消息缩略图的方法 + * + * @param image 缩略图 + * @note 大小不能超过256K + */ +- (void)setThumbImage:(UIImage *)image; + +@end + + + +#pragma mark - WXImageObject +/*! @brief 多媒体消息中包含的图片数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的图片数据对象。 + * @note imageData成员不能为空 + * @see WXMediaMessage + */ +@interface WXImageObject : NSObject +/*! @brief 返回一个WXImageObject对象 + * + * @note 返回的WXImageObject对象是自动释放的 + */ ++ (WXImageObject *)object; + +/** 图片真实数据内容 + * @note 大小不能超过25M + */ +@property (nonatomic, strong) NSData *imageData; + +/** 图片数据的hash值 + * @note 使用sha256得到,用于计算签名 + */ +@property (nonatomic, copy, nullable) NSString *imgDataHash; + +/** 分享的图片消息是否要带小程序入口,若 'entranceMiniProgramUsername' 非空则显示 + * 仅部分小程序类目可用 + * @note 本字段为空则发送普通app图片消息 + */ +@property (nonatomic, copy, nullable) NSString *entranceMiniProgramUsername; + +/** 分享的图片消息显示的小程序入口可以跳转的小程序路径 + * 仅当 'entranceMiniProgramUsername' 非空时生效 + */ +@property (nonatomic, copy, nullable) NSString *entranceMiniProgramPath; + +@end + + +#pragma mark - WXMusicObject +/*! @brief 多媒体消息中包含的音乐数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的音乐数据对象。 + * @note musicUrl和musicLowBandUrl成员不能同时为空。 + * @see WXMediaMessage + */ +@interface WXMusicObject : NSObject +/*! @brief 返回一个WXMusicObject对象 + * + * @note 返回的WXMusicObject对象是自动释放的 + */ ++ (WXMusicObject *)object; + +/** 音乐网页的url地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *musicUrl; +/** 音乐lowband网页的url地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *musicLowBandUrl; +/** 音乐数据url地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *musicDataUrl; + +/**音乐lowband数据url地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *musicLowBandDataUrl; + +/**音乐封面图Url + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *songAlbumUrl; + +/**歌词信息 LRC格式 + * @note 长度不能超过32K + */ +@property (nonatomic, copy, nullable) NSString *songLyric; +@end + + + +#pragma mark - WXMusicVideoObject + +@interface WXMusicVipInfo : NSObject + +/**付费歌曲的id + * @note 长度不能超过32K + */ +@property (nonatomic, copy) NSString *musicId; + +@end + + +@interface WXMusicVideoObject : NSObject + +/*! @brief 返回一个WXMusicVideoObject对象 + * + * @note 返回的WXMusicVideoObject对象是自动释放的 + */ ++ (WXMusicVideoObject *)object; + +/** 音乐网页的url地址 + * @note 长度不能超过10K,不能为空 + */ +@property (nonatomic, copy) NSString *musicUrl; + +/** 音乐数据url地址 + * @note 长度不能超过10K,不能为空 + */ +@property (nonatomic, copy) NSString *musicDataUrl; + +/**歌手名 + * @note 长度不能超过1k,不能为空 + */ +@property (nonatomic, copy) NSString *singerName; + +/** + * @note 音乐时长, 单位毫秒 + */ +@property (nonatomic, assign) UInt32 duration; + +/**歌词信息 LRC格式 + * @note 长度不能超过32K + */ +@property (nonatomic, copy) NSString *songLyric; + +/**高清封面图 + * @note 大小不能超过1M + */ +@property (nonatomic, strong) NSData *hdAlbumThumbData; + +/** 高清封面图数据的hash值 + * @note 使用sha256得到,用于计算签名 + */ +@property (nonatomic, copy, nullable) NSString *hdAlbumThumbFileHash; + +/**音乐专辑名称 + * @note 长度不能超过1k + */ +@property (nonatomic, copy, nullable) NSString *albumName; + +/**音乐流派 + * @note 长度不能超过1k + */ +@property (nonatomic, copy, nullable) NSString *musicGenre; + +/**发行时间 + * @note Unix时间戳,单位为秒 + */ +@property (nonatomic, assign) UInt64 issueDate; + +/**音乐标识符 + * @note 长度不能超过1K,从微信跳回应用时会带上 + */ +@property (nonatomic, copy, nullable) NSString *identification; + +/**运营H5地址 + * @note 选填,建议填写,用户进入歌曲详情页将展示内嵌的运营H5,可展示该歌曲的相关评论、歌曲推荐等内容,不可诱导下载、分享等。 + */ +@property (nonatomic, copy, nullable) NSString *musicOperationUrl; + +/** 付费歌曲相关信息 + * @note 选填,如果歌曲是需要付费的,那么将付费歌曲id等信息封装在内。 + */ +@property (nonatomic, strong) WXMusicVipInfo *musicVipInfo; + +@end + + + +#pragma mark - WXVideoObject +/*! @brief 多媒体消息中包含的视频数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的视频数据对象。 + * @note videoUrl和videoLowBandUrl不能同时为空。 + * @see WXMediaMessage + */ +@interface WXVideoObject : NSObject +/*! @brief 返回一个WXVideoObject对象 + * + * @note 返回的WXVideoObject对象是自动释放的 + */ ++ (WXVideoObject *)object; + +/** 视频网页的url地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *videoUrl; +/** 视频lowband网页的url地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *videoLowBandUrl; + +@end + + + +#pragma mark - WXWebpageObject +/*! @brief 多媒体消息中包含的网页数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的网页数据对象。 + * @see WXMediaMessage + */ +@interface WXWebpageObject : NSObject +/*! @brief 返回一个WXWebpageObject对象 + * + * @note 返回的WXWebpageObject对象是自动释放的 + */ ++ (WXWebpageObject *)object; + +/** 网页的url地址 + * @note 不能为空且长度不能超过10K + */ +@property (nonatomic, copy) NSString *webpageUrl; + +/**是否是私密消息 + */ +@property (nonatomic, assign) BOOL isSecretMessage; + +/** 业务所需的额外信息 */ +@property (nonatomic, strong, nullable) NSDictionary *extraInfoDic; + +@end + + + +#pragma mark - WXAppExtendObject +/*! @brief 多媒体消息中包含的App扩展数据对象 + * + * 第三方程序向微信终端发送包含WXAppExtendObject的多媒体消息, + * 微信需要处理该消息时,会调用该第三方程序来处理多媒体消息内容。 + * @note url,extInfo和fileData不能同时为空 + * @see WXMediaMessage + */ +@interface WXAppExtendObject : NSObject +/*! @brief 返回一个WXAppExtendObject对象 + * + * @note 返回的WXAppExtendObject对象是自动释放的 + */ ++ (WXAppExtendObject *)object; + +/** 若第三方程序不存在,微信终端会打开该url所指的App下载地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *url; +/** 第三方程序自定义简单数据,微信终端会回传给第三方程序处理 + * @note 长度不能超过2K + */ +@property (nonatomic, copy, nullable) NSString *extInfo; +/** App文件数据,该数据发送给微信好友,微信好友需要点击后下载数据,微信终端会回传给第三方程序处理 + * @note 大小不能超过10M + */ +@property (nonatomic, strong, nullable) NSData *fileData; + +@end + + + +#pragma mark - WXEmoticonObject +/*! @brief 多媒体消息中包含的表情数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的表情数据对象。 + * @see WXMediaMessage + */ +@interface WXEmoticonObject : NSObject + +/*! @brief 返回一个WXEmoticonObject对象 + * + * @note 返回的WXEmoticonObject对象是自动释放的 + */ ++ (WXEmoticonObject *)object; + +/** 表情真实数据内容 + * @note 大小不能超过10M + */ +@property (nonatomic, strong) NSData *emoticonData; + +@end + + + +#pragma mark - WXFileObject +/*! @brief 多媒体消息中包含的文件数据对象 + * + * @see WXMediaMessage + */ +@interface WXFileObject : NSObject + +/*! @brief 返回一个WXFileObject对象 + * + * @note 返回的WXFileObject对象是自动释放的 + */ ++ (WXFileObject *)object; + +/** 文件后缀名 + * @note 长度不超过64字节 + */ +@property (nonatomic, copy) NSString *fileExtension; + +/** 文件真实数据内容 + * @note 大小不能超过10M + */ +@property (nonatomic, strong) NSData *fileData; + +@end + + +#pragma mark - WXLocationObject +/*! @brief 多媒体消息中包含的地理位置数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的地理位置数据对象。 + * @see WXMediaMessage + */ +@interface WXLocationObject : NSObject + +/*! @brief 返回一个WXLocationObject对象 + * + * @note 返回的WXLocationObject对象是自动释放的 + */ ++ (WXLocationObject *)object; + +/** 地理位置信息 + * @note 经纬度 + */ +@property (nonatomic, assign) double lng; //经度 +@property (nonatomic, assign) double lat; //纬度 + +@end + +#pragma mark - WXTextObject +/*! @brief 多媒体消息中包含的文本数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的文本数据对象。 + * @see WXMediaMessage + */ +@interface WXTextObject : NSObject + +/*! @brief 返回一个WXTextObject对象 + * + * @note 返回的WXTextObject对象是自动释放的 + */ ++ (WXTextObject *)object; + +/** 地理位置信息 + * @note 文本内容 + */ +@property (nonatomic, copy) NSString *contentText; + +@end + +#pragma mark - WXMiniProgramObject + +@interface WXMiniProgramObject : NSObject + +/*! @brief WXMiniProgramObject对象 + * + * @note 返回的WXMiniProgramObject对象是自动释放的 + */ ++ (WXMiniProgramObject *)object; + +/** 低版本网页链接 + * @attention 长度不能超过1024字节 + */ +@property (nonatomic, copy) NSString *webpageUrl; + +/** 小程序username */ +@property (nonatomic, copy) NSString *userName; + +/** 小程序页面的路径 + * @attention 不填默认拉起小程序首页 + */ +@property (nonatomic, copy, nullable) NSString *path; + +/** 小程序新版本的预览图 + * @attention 大小不能超过128k + */ +@property (nonatomic, strong, nullable) NSData *hdImageData; + +/** 是否使用带 shareTicket 的转发 */ +@property (nonatomic, assign) BOOL withShareTicket; + +/** 分享小程序的版本 + * @attention (正式,开发,体验) + */ +@property (nonatomic, assign) WXMiniProgramType miniProgramType; + +/** 是否禁用转发 */ +@property (nonatomic, assign) BOOL disableForward; + +@property (nonatomic, assign) BOOL isUpdatableMessage; + +@property (nonatomic, assign) BOOL isSecretMessage; + + +/** 业务所需的额外信息 */ +@property (nonatomic, strong, nullable) NSDictionary *extraInfoDic; + +@end + +#pragma mark - WXGameLiveObject + +/*! @brief WXGameLiveObject对象 + * + * @note 游戏直播消息类型 + */ + +@interface WXGameLiveObject : NSObject + ++ (WXGameLiveObject *)object; + +/** 业务所需的额外信息 */ +@property (nonatomic, strong, nullable) NSDictionary *extraInfoDic; + +@end + +@interface WXNativeGamePageObject : NSObject + +/** 是否为视频类型 + */ +@property (nonatomic, assign) BOOL isVideo; + +/** 视频时长 + @note 当为视频类型时,必填;单位为秒 + */ +@property (nonatomic, assign) UInt32 videoDuration; + +/** 透传字段 + @note 长度限制为100K + */ +@property (nonatomic, copy) NSString *shareData; + +/** 缩略图 + @note 大小限制为256K + */ +@property (nonatomic, strong) NSData *gameThumbData; + ++ (WXNativeGamePageObject *)object; + +@end + +#pragma mark - WXLaunchMiniProgramReq + +/*! @brief WXLaunchMiniProgramReq对象, 可实现通过sdk拉起微信小程序 + * + * @note 返回的WXLaunchMiniProgramReq对象是自动释放的 + */ +@interface WXLaunchMiniProgramReq : BaseReq + ++ (WXLaunchMiniProgramReq *)object; + +/** 小程序username */ +@property (nonatomic, copy) NSString *userName; + +/** 小程序页面的路径 + * @attention 不填默认拉起小程序首页 + */ +@property (nonatomic, copy, nullable) NSString *path; + +/** 分享小程序的版本 + * @attention (正式,开发,体验) + */ +@property (nonatomic, assign) WXMiniProgramType miniProgramType; + +/** ext信息 + * @attention json格式 + */ +@property (nonatomic, copy, nullable) NSString *extMsg; + +/** extDic + * @attention 字典,可存放图片等比较大的数据 + */ +@property (nonatomic, copy, nullable) NSDictionary *extDic; + +@end + +#pragma mark - WXLaunchMiniProgramResp +/*! @brief 微信终端向第三方程序返回的WXLaunchMiniProgramReq处理结果。 + * + * 第三方程序向微信终端发送WXLaunchMiniProgramReq后,微信发送回来的处理结果,该结果用WXLaunchMiniProgramResp表示。 + */ +@interface WXLaunchMiniProgramResp : BaseResp + +@property (nonatomic, copy, nullable) NSString *extMsg; + +@end + + +#pragma mark - WXOpenBusinessViewReq +/*! @brief WXOpenBusinessViewReq对象, 可实现第三方通知微信启动,打开业务页面 + * + * @note 返回的WXOpenBusinessViewReq对象是自动释放的 + */ + +@interface WXOpenBusinessViewReq : BaseReq + ++ (WXOpenBusinessViewReq *)object; + +/** 业务类型 + */ +@property (nonatomic, copy) NSString *businessType; + +/** 业务参数 + */ +@property (nonatomic, copy, nullable) NSString *query; + +/** ext信息 + * @note 选填,json格式 + */ +@property (nonatomic, copy, nullable) NSString *extInfo; + +/** extData数据 + * @note + */ +@property (nonatomic, strong, nullable) NSData *extData; +@end + + +@interface WXOpenBusinessViewResp : BaseResp + +/** 业务类型 + */ +@property (nonatomic, copy) NSString *businessType; + +/** 业务返回数据 + */ +@property (nonatomic, copy, nullable) NSString *extMsg; + +@end + +#pragma mark - WXOpenCustomerServiceReq +@interface WXOpenCustomerServiceReq : BaseReq + ++ (WXOpenCustomerServiceReq *)object; + +/**企微客服发起流程 url + */ +@property (nonatomic, copy, nullable) NSString *url; + +/**企业 id + */ +@property (nonatomic, copy, nullable) NSString *corpid; + +@end + +@interface WXOpenCustomerServiceResp : BaseResp + +/** 业务返回数据 + */ +@property (nonatomic, copy, nullable) NSString *extMsg; + +@end + + +#pragma mark - WXChannelStartLiveReq + +@interface WXChannelStartLiveReq : BaseReq + ++ (WXChannelStartLiveReq *)object; + +/** 必填,直播业务数据(json格式) + */ +@property (nonatomic, copy) NSString *liveJsonInfo; + +@end + +@interface WXChannelStartLiveResp : BaseResp + +/** 业务返回数据 + */ +@property (nonatomic, copy, nullable) NSString *extMsg; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Headers/WechatAuthSDK.h b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Headers/WechatAuthSDK.h new file mode 100644 index 0000000..308aaea --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Headers/WechatAuthSDK.h @@ -0,0 +1,68 @@ +// +// WechatAuthSDK.h +// WechatAuthSDK +// +// Created by 李凯 on 13-11-29. +// Copyright (c) 2013年 Tencent. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +enum AuthErrCode { + WechatAuth_Err_Ok = 0, //Auth成功 + WechatAuth_Err_NormalErr = -1, //普通错误 + WechatAuth_Err_NetworkErr = -2, //网络错误 + WechatAuth_Err_GetQrcodeFailed = -3, //获取二维码失败 + WechatAuth_Err_Cancel = -4, //用户取消授权 + WechatAuth_Err_Timeout = -5, //超时 +}; + +@protocol WechatAuthAPIDelegate +@optional + +- (void)onAuthGotQrcode:(UIImage *)image; //得到二维码 +- (void)onQrcodeScanned; //二维码被扫描 +- (void)onAuthFinish:(int)errCode AuthCode:(nullable NSString *)authCode; //成功登录 + +@end + +@interface WechatAuthSDK : NSObject{ + NSString *_sdkVersion; + __weak id _delegate; +} + +@property(nonatomic, weak, nullable) id delegate; +@property(nonatomic, readonly) NSString *sdkVersion; //authSDK版本号 + +/*! @brief 发送登录请求,等待WechatAuthAPIDelegate回调 + * + * @param appId 微信开发者ID + * @param nonceStr 一个随机的尽量不重复的字符串,用来使得每次的signature不同 + * @param timeStamp 时间戳 + * @param scope 应用授权作用域,拥有多个作用域用逗号(,)分隔 + * @param signature 签名 + * @param schemeData 会在扫码后拼在scheme后 + * @return 成功返回YES,失败返回NO + 注:该实现只保证同时只有一个Auth在运行,Auth未完成或未Stop再次调用Auth接口时会返回NO。 + */ + +- (BOOL)Auth:(NSString *)appId + nonceStr:(NSString *)nonceStr + timeStamp:(NSString *)timeStamp + scope:(NSString *)scope + signature:(NSString *)signature + schemeData:(nullable NSString *)schemeData; + + +/*! @brief 暂停登录请求 + * + * @return 成功返回YES,失败返回NO。 + */ +- (BOOL)StopAuth; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Headers/WechatOpenSDK.h b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Headers/WechatOpenSDK.h new file mode 100644 index 0000000..979e5e9 --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Headers/WechatOpenSDK.h @@ -0,0 +1,9 @@ +// WechatOpenSDK.h +// +// Created by Wechat. +// Copyright (c) 2012年 Tencent. All rights reserved. +// +#import +#import +#import + diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Info.plist b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Info.plist new file mode 100755 index 0000000..45d6068 --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Info.plist @@ -0,0 +1,15 @@ + + + + CFBundleIdentifier + com.tencent.WechatOpenSDK + CFBundleVersion + 1.0.0 + CFBundleShortVersionString + 1.0 + MinimumOSVersion + 12.0 + CFBundleExecutable + WechatOpenSDK + + \ No newline at end of file diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Modules/module.modulemap b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Modules/module.modulemap new file mode 100644 index 0000000..3ddbeb0 --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/Modules/module.modulemap @@ -0,0 +1,5 @@ +framework module WechatOpenSDK { + umbrella header "WechatOpenSDK.h" + export * + link "WechatOpenSDK" +} diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/WechatOpenSDK b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/WechatOpenSDK new file mode 100644 index 0000000..73d455d Binary files /dev/null and b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64/WechatOpenSDK.framework/WechatOpenSDK differ diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Headers/WXApi.h b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Headers/WXApi.h new file mode 100644 index 0000000..879c505 --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Headers/WXApi.h @@ -0,0 +1,231 @@ +// +// WXApi.h +// 所有Api接口 +// +// Created by Wechat on 12-2-28. +// Copyright (c) 2012年 Tencent. All rights reserved. +// + +#import +#import "WXApiObject.h" + +NS_ASSUME_NONNULL_BEGIN + + +typedef BOOL(^WXGrantReadPasteBoardPermissionCompletion)(void); + + +#pragma mark - WXApiDelegate +/*! @brief 接收并处理来自微信终端程序的事件消息 + * + * 接收并处理来自微信终端程序的事件消息,期间微信界面会切换到第三方应用程序。 + * WXApiDelegate 会在handleOpenURL:delegate:中使用并触发。 + */ +@protocol WXApiDelegate +@optional + +/*! @brief 收到一个来自微信的请求,第三方应用程序处理完后调用sendResp向微信发送结果 + * + * 收到一个来自微信的请求,异步处理完成后必须调用sendResp发送处理结果给微信。 + * 可能收到的请求有GetMessageFromWXReq、ShowMessageFromWXReq等。 + * @param req 具体请求内容,是自动释放的 + */ +- (void)onReq:(BaseReq*)req; + + + +/*! @brief 发送一个sendReq后,收到微信的回应 + * + * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。 + * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。 + * @param resp具体的回应内容,是自动释放的 + */ +- (void)onResp:(BaseResp*)resp; + +/* ! @brief 用于在iOS16以及以上系统上,控制OpenSDK是否读取剪切板中微信传递的数据以及读取的时机 + * 在iOS16以及以上系统,在SDK需要读取剪切板中微信写入的数据时,会回调该方法。没有实现默认会直接读取微信通过剪切板传递过来的数据 + * 注意: + * 1. 只在iOS16以及以上的系统版本上回调; + * 2. 不实现时,OpenSDK会直接调用读取剪切板接口,读取微信传递过来的数据; + * 3. 若实现该方法:开发者需要通过调用completion(), 支持异步,通知SDK允许读取剪切板中微信传递的数据, + * 不调用completion()则代表不授权OpenSDK读取剪切板,会导致收不到onReq:, onResp:回调,无法后续业务流程。请谨慎使用 + * 4. 不要长时间持有completion不释放,可能会导致内存泄漏。 + */ +- (void)onNeedGrantReadPasteBoardPermissionWithURL:(nonnull NSURL *)openURL completion:(nonnull WXGrantReadPasteBoardPermissionCompletion)completion; + +@end + +#pragma mark - WXApiLogDelegate + +@protocol WXApiLogDelegate + +- (void)onLog:(NSString*)log logLevel:(WXLogLevel)level; + +@end + + +#pragma mark - WXApi + +/*! @brief 微信Api接口函数类 + * + * 该类封装了微信终端SDK的所有接口 + */ +@interface WXApi : NSObject + +/*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。 + * + * 需要在每次启动第三方应用程序时调用。 + * @attention 请保证在主线程中调用此函数 + * @param appid 微信开发者ID + * @param universalLink 微信开发者Universal Link + * @return 成功返回YES,失败返回NO。 + */ ++ (BOOL)registerApp:(NSString *)appid universalLink:(NSString *)universalLink; + + +/*! @brief 处理旧版微信通过URL启动App时传递的数据 + * + * 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。 + * @param url 微信启动第三方应用时传递过来的URL + * @param delegate WXApiDelegate对象,用来接收微信触发的消息。 + * @return 成功返回YES,失败返回NO。 + */ ++ (BOOL)handleOpenURL:(NSURL *)url delegate:(nullable id)delegate; + + +/*! @brief 处理微信通过Universal Link启动App时传递的数据 + * + * 需要在 application:continueUserActivity:restorationHandler:中调用。 + * @param userActivity 微信启动第三方应用时系统API传递过来的userActivity + * @param delegate WXApiDelegate对象,用来接收微信触发的消息。 + * @return 成功返回YES,失败返回NO。 + */ ++ (BOOL)handleOpenUniversalLink:(NSUserActivity *)userActivity delegate:(nullable id)delegate; + + +/*! @brief 检查微信是否已被用户安装 + * + * @return 微信已安装返回YES,未安装返回NO。 + */ ++ (BOOL)isWXAppInstalled; + + + +/*! @brief 判断当前微信的版本是否支持OpenApi + * + * @return 支持返回YES,不支持返回NO。 + */ ++ (BOOL)isWXAppSupportApi; + + +/*! @brief 判断当前微信的版本是否支持分享微信状态功能 + * + * @attention 需在工程LSApplicationQueriesSchemes配置中添加weixinStateAPI + * @return 支持返回YES,不支持返回NO。 + */ ++ (BOOL)isWXAppSupportStateAPI; + + +#ifndef BUILD_WITHOUT_PAY +/*! @brief 判断当前微信的版本是否支持二维码拉起微信支付 + * + * @attention 需在工程LSApplicationQueriesSchemes配置中添加weixinQRCodePayAPI + * @return 支持返回YES,不支持返回NO。 + */ ++ (BOOL)isWXAppSupportQRCodePayAPI; + +#endif + + +/*! @brief 获取微信的itunes安装地址 + * + * @return 微信的安装地址字符串。 + */ ++ (NSString *)getWXAppInstallUrl; + + + +/*! @brief 获取当前微信SDK的版本号 + * + * @return 返回当前微信SDK的版本号 + */ ++ (NSString *)getApiVersion; + + + +/*! @brief 打开微信 + * + * @return 成功返回YES,失败返回NO。 + */ ++ (BOOL)openWXApp; + + + +/*! @brief 发送请求到微信,等待微信返回onResp + * + * 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持以下类型 + * SendAuthReq、SendMessageToWXReq、PayReq等。 + * @param req 具体的发送请求。 + * @param completion 调用结果回调block + */ ++ (void)sendReq:(BaseReq *)req completion:(void (^ __nullable)(BOOL success))completion; + +/*! @brief 收到微信onReq的请求,发送对应的应答给微信,并切换到微信界面 + * + * 函数调用后,会切换到微信的界面。第三方应用程序收到微信onReq的请求,异步处理该请求,完成后必须调用该函数。可能发送的相应有 + * GetMessageFromWXResp、ShowMessageFromWXResp等。 + * @param resp 具体的应答内容 + * @param completion 调用结果回调block + */ ++ (void)sendResp:(BaseResp*)resp completion:(void (^ __nullable)(BOOL success))completion; + + +/*! @brief 发送Auth请求到微信,支持用户没安装微信,等待微信返回onResp + * + * 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持SendAuthReq类型。 + * @param req 具体的发送请求。 + * @param viewController 当前界面对象。 + * @param delegate WXApiDelegate对象,用来接收微信触发的消息。 + * @param completion 调用结果回调block + */ ++ (void)sendAuthReq:(SendAuthReq *)req viewController:(UIViewController*)viewController delegate:(nullable id)delegate completion:(void (^ __nullable)(BOOL success))completion; + + +/*! @brief 测试函数,用于排查当前App通过Universal Link方式分享到微信的流程 + 注意1: 调用自检函数之前必须要先调用registerApp:universalLink接口, 并确认调用成功 + 注意2: 自检过程中会有Log产生,可以先调用startLogByLevel函数,根据Log排查问题 + 注意3: 会多次回调block + 注意4: 仅用于新接入SDK时调试使用,请勿在正式环境的调用 + * + * 当completion回调的step为WXULCheckStepFinal时,表示检测通过,Universal Link接入成功 + * @param completion 回调Block + */ ++ (void)checkUniversalLinkReady:(nonnull WXCheckULCompletion)completion; + + +/*! @brief WXApi的成员函数,接受微信的log信息。byBlock + 注意1:SDK会强引用这个block,注意不要导致内存泄漏,注意不要导致内存泄漏 + 注意2:调用过一次startLog by block之后,如果再调用一次任意方式的startLoad,会释放上一次logBlock,不再回调上一个logBlock + * + * @param level 打印log的级别 + * @param logBlock 打印log的回调block + */ + ++ (void)startLogByLevel:(WXLogLevel)level logBlock:(WXLogBolock)logBlock; + +/*! @brief WXApi的成员函数,接受微信的log信息。byDelegate + 注意1:sdk会弱引用这个delegate,这里可加任意对象为代理,不需要与WXApiDelegate同一个对象 + 注意2:调用过一次startLog by delegate之后,再调用一次任意方式的startLoad,不会再回调上一个logDelegate对象 + * @param level 打印log的级别 + * @param logDelegate 打印log的回调代理, + */ ++ (void)startLogByLevel:(WXLogLevel)level logDelegate:(id)logDelegate; + +/*! @brief 停止打印log,会清理block或者delegate为空,释放block + * @param + */ ++ (void)stopLog; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Headers/WXApiObject.h b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Headers/WXApiObject.h new file mode 100644 index 0000000..85b6457 --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Headers/WXApiObject.h @@ -0,0 +1,1410 @@ +// +// MMApiObject.h +// Api对象,包含所有接口和对象数据定义 +// +// Created by Wechat on 12-2-28. +// Copyright (c) 2012年 Tencent. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/*! @brief 错误码 + * + */ +enum WXErrCode { + WXSuccess = 0, /**< 成功 */ + WXErrCodeCommon = -1, /**< 普通错误类型 */ + WXErrCodeUserCancel = -2, /**< 用户点击取消并返回 */ + WXErrCodeSentFail = -3, /**< 发送失败 */ + WXErrCodeAuthDeny = -4, /**< 授权失败 */ + WXErrCodeUnsupport = -5, /**< 微信不支持 */ +}; + + + +/*! @brief 请求发送场景 + * + */ +enum WXScene { + WXSceneSession = 0, /**< 聊天界面 */ + WXSceneTimeline = 1, /**< 朋友圈 */ + WXSceneFavorite = 2, /**< 收藏 */ + WXSceneSpecifiedSession = 3, /**< 指定联系人 */ + WXSceneState = 4, /**< 状态 */ +}; + + +enum WXAPISupport { + WXAPISupportSession = 0, +}; + + + +/*! @brief 跳转profile类型 + * + */ +enum WXBizProfileType { + WXBizProfileType_Normal = 0, //**< 普通公众号 */ + WXBizProfileType_Device = 1, //**< 硬件公众号 */ +}; + +/*! @brief 分享小程序类型 + * + */ +typedef NS_ENUM(NSUInteger, WXMiniProgramType) { + WXMiniProgramTypeRelease = 0, //**< 正式版 */ + WXMiniProgramTypeTest = 1, //**< 开发版 */ + WXMiniProgramTypePreview = 2, //**< 体验版 */ +}; + +/*! @brief 跳转mp网页类型 + * + */ +enum WXMPWebviewType { + WXMPWebviewType_Ad = 0, /**< 广告网页 **/ +}; + +/*! @brief log的级别 + * + */ +typedef NS_ENUM(NSInteger,WXLogLevel) { + WXLogLevelNormal = 0, // 打印日常的日志 + WXLogLevelDetail = 1, // 打印详细的日志 +}; + + +/*! @brief 打印回调的block + * + */ +typedef void(^WXLogBolock)(NSString *log); + +/*! @brief 微信Universal Link检查函数 (WXApi#checkUniversalLinkReady:),检查步骤枚举值 + * + * WXULCheckStepParams 参数检测 + * WXULCheckStepSystemVersion 当前系统版本检测 + * WXULCheckStepWechatVersion 微信客户端版本检测 + * WXULCheckStepSDKInnerOperation 微信SDK内部操作检测 + * WXULCheckStepLaunchWechat App拉起微信检测 + * WXULCheckStepBackToCurrentApp 由微信返回当前App检测 + * WXULCheckStepFinal 最终结果 + */ +typedef NS_ENUM(NSInteger, WXULCheckStep) +{ + WXULCheckStepParams, + WXULCheckStepSystemVersion, + WXULCheckStepWechatVersion, + WXULCheckStepSDKInnerOperation, + WXULCheckStepLaunchWechat, + WXULCheckStepBackToCurrentApp, + WXULCheckStepFinal, +}; + + +#pragma mark - WXCheckULStepResult + +/*! @brief 该类为微信Universal Link检测函数结果类 +* +*/ +@interface WXCheckULStepResult : NSObject + +/** 是否成功 */ +@property(nonatomic, assign) BOOL success; +/** 当前错误信息 */ +@property(nonatomic, strong) NSString* errorInfo; +/** 修正建议 */ +@property(nonatomic, strong) NSString* suggestion; + +- (instancetype)initWithCheckResult:(BOOL)success errorInfo:(nullable NSString*)errorInfo suggestion:(nullable NSString*)suggestion; + +@end + + +/*! @brief 微信Universal Link检查函数 (WXApi#checkUniversalLinkReady:),回调Block + * + * @param step 当前检测步骤 + * @param result 检测结果 + */ +typedef void(^WXCheckULCompletion)(WXULCheckStep step, WXCheckULStepResult* result); + + +#pragma mark - BaseReq +/*! @brief 该类为微信终端SDK所有请求类的基类 + * + */ +@interface BaseReq : NSObject + +/** 请求类型 */ +@property (nonatomic, assign) int type; +/** 由用户微信号和AppID组成的唯一标识,需要校验微信用户是否换号登录时填写*/ +@property (nonatomic, copy) NSString *openID; + +@end + + + +#pragma mark - BaseResp +/*! @brief 该类为微信终端SDK所有响应类的基类 + * + */ +@interface BaseResp : NSObject +/** 错误码 */ +@property (nonatomic, assign) int errCode; +/** 错误提示字符串 */ +@property (nonatomic, copy) NSString *errStr; +/** 响应类型 */ +@property (nonatomic, assign) int type; + +@end + + + +#pragma mark - WXMediaMessage +@class WXMediaMessage; + +#ifndef BUILD_WITHOUT_PAY + +#pragma mark - PayReq +/*! @brief 第三方向微信终端发起支付的消息结构体 + * + * 第三方向微信终端发起支付的消息结构体,微信终端处理后会向第三方返回处理结果 + * @see PayResp + */ +@interface PayReq : BaseReq + +/** 商家向财付通申请的商家id */ +@property (nonatomic, copy) NSString *partnerId; +/** 预支付订单 */ +@property (nonatomic, copy) NSString *prepayId; +/** 随机串,防重发 */ +@property (nonatomic, copy) NSString *nonceStr; +/** 时间戳,防重发 */ +@property (nonatomic, assign) UInt32 timeStamp; +/** 商家根据财付通文档填写的数据和签名 */ +@property (nonatomic, copy) NSString *package; +/** 商家根据微信开放平台文档对数据做的签名 */ +@property (nonatomic, copy) NSString *sign; + +@end + + +#pragma mark - PayResp +/*! @brief 微信终端返回给第三方的关于支付结果的结构体 + * + * 微信终端返回给第三方的关于支付结果的结构体 + */ +@interface PayResp : BaseResp + +/** 财付通返回给商家的信息 */ +@property (nonatomic, copy) NSString *returnKey; + +@end + +#pragma mark - WXOfflinePay +/*! @brief 第三方向微信终端发起离线支付 + * + * 第三方向微信终端发起离线支付的消息结构体 + */ +@interface WXOfflinePayReq : BaseReq + +@end + +/*! @brief 第三方向微信终端发起离线支付返回 + * + * 第三方向微信终端发起离线支付返回的消息结构体 + */ +@interface WXOfflinePayResp : BaseResp + +@end + + +#pragma mark - WXNontaxPayReq +@interface WXNontaxPayReq:BaseReq + +@property (nonatomic, copy) NSString *urlString; + +@end + +#pragma mark - WXNontaxPayResp +@interface WXNontaxPayResp : BaseResp + +@property (nonatomic, copy) NSString *wxOrderId; + +@end + +#pragma mark - WXPayInsuranceReq +@interface WXPayInsuranceReq : BaseReq + +@property (nonatomic, copy) NSString *urlString; + +@end + +#pragma mark - WXPayInsuranceResp +@interface WXPayInsuranceResp : BaseResp + +@property (nonatomic, copy) NSString *wxOrderId; + +@end + + +#pragma mark - WXQRCodePayReq +@interface WXQRCodePayReq : BaseReq +/** 码内容 + * @note 必填,码长度必须大于0且小于10K + */ +@property (nonatomic, copy) NSString *codeContent; +/** 额外信息 + * @note 长度必须大于0且小于10K + */ +@property (nonatomic, copy) NSString *extraMsg; + +@end + +@interface WXQRCodePayResp : BaseResp +@end + +#endif + + +#pragma mark - SendAuthReq +/*! @brief 第三方程序向微信终端请求认证的消息结构 + * + * 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数, + * 向微信终端发送一个SendAuthReq消息结构。微信终端处理完后会向第三方程序发送一个处理结果。 + * @see SendAuthResp + */ +@interface SendAuthReq : BaseReq +/** 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数,向微信终端发送一个SendAuthReq消息结构。微信终端处理完后会向第三方程序发送一个处理结果。 + * @see SendAuthResp + * @note scope字符串长度不能超过1K + */ +@property (nonatomic, copy) NSString *scope; +/** 第三方程序本身用来标识其请求的唯一性,最后跳转回第三方程序时,由微信终端回传。 + * @note state字符串长度不能超过1K + */ +@property (nonatomic, copy) NSString *state; + +@property (nonatomic, assign) BOOL isOption1; + +/** 是否关闭自动授权 + * @note YES为关闭自动授权,每次登陆都需要用户手动授权;NO为允许自动授权 + */ +@property (nonatomic, assign) BOOL nonautomatic; + +@property (nonatomic, copy) NSString *extData; + +@end + +#pragma mark - SendAuthResp +/*! @brief 微信处理完第三方程序的认证和权限申请后向第三方程序回送的处理结果。 + * + * 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数,向微信终端发送一个SendAuthReq消息结构。 + * 微信终端处理完后会向第三方程序发送一个SendAuthResp。 + * @see onResp + */ +@interface SendAuthResp : BaseResp +@property (nonatomic, copy, nullable) NSString *code; +/** 第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传 + * @note state字符串长度不能超过1K + * @note 在复杂度较高的应用程序中,可能会出现其他模块请求的响应对象被错误地回调到当前模块。 + * 为了避免影响其他模块,建议当前模块的开发者根据SendAuthResp的内容,采用白名单的方式进行处理。 + * 例如,SendAuthResp.state符合预期时,才对其进行处理。 + */ +@property (nonatomic, copy, nullable) NSString *state; +@property (nonatomic, copy, nullable) NSString *lang; +@property (nonatomic, copy, nullable) NSString *country; +@end + +#pragma mark - WXStateJumpInfo +/*! @brief 状态发表时的小尾巴跳转信息 + */ +@interface WXStateJumpInfo : NSObject + +@end + +#pragma mark - WXStateJumpUrlInfo +/*! @brief 状态小尾巴跳转指定url的信息 + */ +@interface WXStateJumpUrlInfo : WXStateJumpInfo +/** 跳转到指定的url + * @note 必填,url长度必须大于0且小于10K + */ +@property (nonatomic, copy) NSString *url; + +@end + +#pragma mark - WXStateJumpWXMiniProgramInfo +/*! @brief 状态小尾巴跳转指定小程序的信息 + */ +@interface WXStateJumpMiniProgramInfo : WXStateJumpInfo +/** 小程序username + * @note 必填 + */ +@property (nonatomic, copy) NSString *username; + +/** 小程序页面的路径 + * @attention 不填默认拉起小程序首页 + */ +@property (nonatomic, copy, nullable) NSString *path; + +/** 分享小程序的版本 + * @attention (正式,开发,体验) + */ +@property (nonatomic, assign) WXMiniProgramType miniProgramType; + +@end + + + +#pragma mark - WXStateJumpWXMiniProgramInfo +/*! @brief 状态小尾巴跳转指定视频号主页信息 + */ +@interface WXStateJumpChannelProfileInfo : WXStateJumpInfo +/** 视频号username + * @note 必填,username长度必须大于0且小于1K + */ +@property (nonatomic, copy) NSString *username; + + +@end + +#pragma mark - WXStateSceneDataObject +/*! @brief 场景类型额外参数基类 + */ +@interface WXSceneDataObject : NSObject + +@end + +#pragma mark - WXStateSceneDataObject +/*! @brief 状态场景类型 + * 用户填写WXStateSceneDataObject参数后,可以跳转到微信状态发表页 + */ +@interface WXStateSceneDataObject : WXSceneDataObject + +/** 状态标志的ID + * @note 选填,文本长度必须小于10K + */ +@property (nonatomic, copy) NSString *stateId; +/** 状态发表时附带的文本描述 + * @note 选填,文本长度必须小于10K + */ +@property (nonatomic, copy) NSString *stateTitle; +/** 后台校验token + * @note 选填,文本长度必须小于10K + */ +@property (nonatomic, copy) NSString *token; +/** 小尾巴跳转所需的信息 + * @note 必填,目前仅支持url跳转 + */ +@property (nonatomic, strong) WXStateJumpInfo *stateJumpDataInfo; + +@end + +#pragma mark - SendMessageToWXReq +/*! @brief 第三方程序发送消息至微信终端程序的消息结构体 + * + * 第三方程序向微信发送信息需要传入SendMessageToWXReq结构体,信息类型包括文本消息和多媒体消息, + * 分别对应于text和message成员。调用该方法后,微信处理完信息会向第三方程序发送一个处理结果。 + * @see SendMessageToWXResp + */ +@interface SendMessageToWXReq : BaseReq +/** 发送消息的文本内容 + * @note 文本长度必须大于0且小于10K + */ +@property (nonatomic, copy) NSString *text; +/** 发送消息的多媒体内容 + * @see WXMediaMessage + */ +@property (nonatomic, strong) WXMediaMessage *message; +/** 发送消息的类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息 */ +@property (nonatomic, assign) BOOL bText; +/** 发送的目标场景,可以选择发送到会话(WXSceneSession)或者朋友圈(WXSceneTimeline)。 默认发送到会话。 + * @see WXScene + */ +@property (nonatomic, assign) int scene; +/** 指定发送消息的人 + * @note WXSceneSpecifiedSession时有效 + */ +@property (nonatomic, copy, nullable) NSString *toUserOpenId; +/** 目标场景附带信息 + * @note 目前只针对状态场景 + */ +@property (nonatomic, strong) WXSceneDataObject *sceneDataObject; + +@end + +#pragma mark - SendMessageToWXResp +/*! @brief 微信终端向第三方程序返回的SendMessageToWXReq处理结果。 + * + * 第三方程序向微信终端发送SendMessageToWXReq后,微信发送回来的处理结果,该结果用SendMessageToWXResp表示。 + */ +@interface SendMessageToWXResp : BaseResp +@property(nonatomic, copy) NSString *lang; +@property(nonatomic, copy) NSString *country; +@end + +#pragma mark - GetMessageFromWXReq +/*! @brief 微信终端向第三方程序请求提供内容的消息结构体。 + * + * 微信终端向第三方程序请求提供内容,微信终端会向第三方程序发送GetMessageFromWXReq消息结构体, + * 需要第三方程序调用sendResp返回一个GetMessageFromWXResp消息结构体。 + */ +@interface GetMessageFromWXReq : BaseReq +@property (nonatomic, strong) NSString *lang; +@property (nonatomic, strong) NSString *country; +@end + + + +#pragma mark - GetMessageFromWXResp +/*! @brief 微信终端向第三方程序请求提供内容,第三方程序向微信终端返回的消息结构体。 + * + * 微信终端向第三方程序请求提供内容,第三方程序调用sendResp向微信终端返回一个GetMessageFromWXResp消息结构体。 + */ +@interface GetMessageFromWXResp : BaseResp +/** 向微信终端提供的文本内容 + @note 文本长度必须大于0且小于10K + */ +@property (nonatomic, strong) NSString *text; +/** 向微信终端提供的多媒体内容。 + * @see WXMediaMessage + */ +@property (nonatomic, strong) WXMediaMessage *message; +/** 向微信终端提供内容的消息类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息 */ +@property (nonatomic, assign) BOOL bText; +@end + + + +#pragma mark - ShowMessageFromWXReq +/*! @brief 微信通知第三方程序,要求第三方程序显示的消息结构体。 + * + * 微信需要通知第三方程序显示或处理某些内容时,会向第三方程序发送ShowMessageFromWXReq消息结构体。 + * 第三方程序处理完内容后调用sendResp向微信终端发送ShowMessageFromWXResp。 + */ +@interface ShowMessageFromWXReq : BaseReq +/** 微信终端向第三方程序发送的要求第三方程序处理的多媒体内容 + * @see WXMediaMessage + */ +@property (nonatomic, strong) WXMediaMessage *message; +@property (nonatomic, copy) NSString *lang; +@property (nonatomic, copy) NSString *country; +@end + + + +#pragma mark - ShowMessageFromWXResp +/*! @brief 微信通知第三方程序,要求第三方程序显示或处理某些消息,第三方程序处理完后向微信终端发送的处理结果。 + * + * 微信需要通知第三方程序显示或处理某些内容时,会向第三方程序发送ShowMessageFromWXReq消息结构体。 + * 第三方程序处理完内容后调用sendResp向微信终端发送ShowMessageFromWXResp。 + */ +@interface ShowMessageFromWXResp : BaseResp +@end + + +#pragma mark - LaunchFromWXReq +/*! @brief 微信终端打开第三方程序携带的消息结构体 + * + * 微信向第三方发送的结构体,第三方不需要返回 + */ +@interface LaunchFromWXReq : BaseReq +@property (nonatomic, strong) WXMediaMessage *message; +@property (nonatomic, copy) NSString *lang; +@property (nonatomic, copy) NSString *country; +@end + + +#pragma mark - OpenWebviewReq +/* ! @brief 第三方通知微信启动内部浏览器,打开指定网页 + * + * 第三方通知微信启动内部浏览器,打开指定Url对应的网页 + */ +@interface OpenWebviewReq : BaseReq +/** 需要打开的网页对应的Url + * @attention 长度不能超过1024 + */ +@property(nonatomic, copy) NSString *url; + +@end + +#pragma mark - OpenWebviewResp +/*! @brief 微信终端向第三方程序返回的OpenWebviewReq处理结果 + * + * 第三方程序向微信终端发送OpenWebviewReq后,微信发送回来的处理结果,该结果用OpenWebviewResp表示 + */ +@interface OpenWebviewResp : BaseResp + +@end + + + +#pragma mark - WXOpenBusinessWebViewReq +/*! @brief 第三方通知微信启动内部浏览器,打开指定业务的网页 + * + * + */ +@interface WXOpenBusinessWebViewReq : BaseReq + +/** 网页业务类型 + * @attention + */ +@property (nonatomic, assign) UInt32 businessType; + +/** 网页业务参数 + * @attention + */ +@property (nonatomic, strong, nullable) NSDictionary *queryInfoDic; + +@end + +#pragma mark - WXOpenBusinessWebViewResp +/*! @brief 微信终端向第三方程序返回的WXOpenBusinessWebViewResp处理结果。 + * + * 第三方程序向微信终端发送WXOpenBusinessWebViewReq后,微信发送回来的处理结果,该结果用WXOpenBusinessWebViewResp表示。 + */ +@interface WXOpenBusinessWebViewResp : BaseResp +/** 第三方程序自定义简单数据,微信终端会回传给第三方程序处理 + * @attention 长度不能超过2k + */ +@property (nonatomic, copy) NSString *result; + +/** 网页业务类型 + * @attention + */ +@property (nonatomic, assign) UInt32 businessType; + +@end + + +#pragma mark - OpenRankListReq +/* ! @brief 第三方通知微信,打开硬件排行榜 + * + * 第三方通知微信,打开硬件排行榜 + */ +@interface OpenRankListReq : BaseReq + +@end + +#pragma mark - OpenRanklistResp +/*! @brief 微信终端向第三方程序返回的OpenRankListReq处理结果。 + * + * 第三方程序向微信终端发送OpenRankListReq后,微信发送回来的处理结果,该结果用OpenRankListResp表示。 + */ +@interface OpenRankListResp : BaseResp + +@end + + +#pragma mark - WXCardItem + +@interface WXCardItem : NSObject +/** 卡id + * @attention 长度不能超过1024字节 + */ +@property (nonatomic, copy) NSString *cardId; +/** ext信息 + * @attention 长度不能超过2024字节 + */ +@property (nonatomic, copy, nullable) NSString *extMsg; +/** + * @attention 卡的状态,req不需要填。resp:0为未添加,1为已添加。 + */ +@property (nonatomic, assign) UInt32 cardState; +/** + * @attention req不需要填,chooseCard返回的。 + */ +@property (nonatomic, copy) NSString *encryptCode; +/** + * @attention req不需要填,chooseCard返回的。 + */ +@property (nonatomic, copy) NSString *appID; +@end; + +#pragma mark - WXInvoiceItem + +@interface WXInvoiceItem : NSObject +/** 卡id + * @attention 长度不能超过1024字节 + */ +@property (nonatomic, copy) NSString *cardId; +/** ext信息 + * @attention 长度不能超过2024字节 + */ +@property (nonatomic, copy, nullable) NSString *extMsg; +/** + * @attention 卡的状态,req不需要填。resp:0为未添加,1为已添加。 + */ +@property (nonatomic, assign) UInt32 cardState; +/** + * @attention req不需要填,chooseCard返回的。 + */ +@property (nonatomic, copy) NSString *encryptCode; +/** + * @attention req不需要填,chooseCard返回的。 + */ +@property (nonatomic, copy) NSString *appID; + +@end + +#pragma mark - AddCardToWXCardPackageReq +/* ! @brief 请求添加卡券至微信卡包 + * + */ + +@interface AddCardToWXCardPackageReq : BaseReq +/** 卡列表 + * @attention 个数不能超过40个 类型WXCardItem + */ +@property (nonatomic, strong) NSArray *cardAry; + +@end + + +#pragma mark - AddCardToWXCardPackageResp +/** ! @brief 微信返回第三方添加卡券结果 + * + */ + +@interface AddCardToWXCardPackageResp : BaseResp +/** 卡列表 + * @attention 个数不能超过40个 类型WXCardItem + */ +@property (nonatomic, strong) NSArray *cardAry; +@end + +#pragma mark - WXChooseCardReq +/* ! @brief 请求从微信选取卡券 + * + */ + +@interface WXChooseCardReq : BaseReq +@property (nonatomic, copy) NSString *appID; +@property (nonatomic, assign) UInt32 shopID; +@property (nonatomic, assign) UInt32 canMultiSelect; +@property (nonatomic, copy) NSString *cardType; +@property (nonatomic, copy) NSString *cardTpID; +@property (nonatomic, copy) NSString *signType; +@property (nonatomic, copy) NSString *cardSign; +@property (nonatomic, assign) UInt32 timeStamp; +@property (nonatomic, copy) NSString *nonceStr; +@end + + +#pragma mark - WXChooseCardResp +/** ! @brief 微信返回第三方请求选择卡券结果 + * + */ + +@interface WXChooseCardResp : BaseResp +@property (nonatomic, strong ) NSArray* cardAry; +@end + + +#pragma mark - WXChooseInvoiceReq +/* ! @brief 请求从微信选取发票 + * + */ +@interface WXChooseInvoiceReq : BaseReq +@property (nonatomic, copy) NSString *appID; +@property (nonatomic, assign) UInt32 shopID; +@property (nonatomic, copy) NSString *signType; +@property (nonatomic, copy) NSString *cardSign; +@property (nonatomic, assign) UInt32 timeStamp; +@property (nonatomic, copy) NSString *nonceStr; +@end + +#pragma mark - WXChooseInvoiceResp +/** ! @brief 微信返回第三方请求选择发票结果 + * + */ +@interface WXChooseInvoiceResp : BaseResp +@property (nonatomic, strong) NSArray* cardAry; +@end + +#pragma mark - WXSubscriptionReq +@interface WXSubscribeMsgReq : BaseReq +@property (nonatomic, assign) UInt32 scene; +@property (nonatomic, copy) NSString *templateId; +@property (nonatomic, copy, nullable) NSString *reserved; +@end + +#pragma mark - WXSubscriptionReq +@interface WXSubscribeMsgResp : BaseResp + +@property (nonatomic, copy) NSString *templateId; +@property (nonatomic, assign) UInt32 scene; +@property (nonatomic, copy) NSString *action; +@property (nonatomic, copy) NSString *reserved; +@property (nonatomic, copy, nullable) NSString *openId; + +@end + +#pragma mark - WXSubscribeMiniProgramMsg +/** ! @brief 第三方请求订阅小程序消息 + * + */ +@interface WXSubscribeMiniProgramMsgReq : BaseReq +@property (nonatomic, copy) NSString *miniProgramAppid; +@end + +#pragma mark - WXSubscriptionReq +@interface WXSubscribeMiniProgramMsgResp : BaseResp + +@property(nonatomic, copy) NSString *openId; // 小程序openid +@property(nonatomic, copy) NSString *unionId; // unionId +@property(nonatomic, copy) NSString *nickName; // 用户昵称 + +@end + +#pragma mark - WXinvoiceAuthInsertReq +@interface WXInvoiceAuthInsertReq : BaseReq + +@property (nonatomic, copy) NSString *urlString; + +@end + +#pragma mark - WXinvoiceAuthInsertResp + +@interface WXInvoiceAuthInsertResp : BaseResp + +@property (nonatomic, copy) NSString *wxOrderId; + +@end + +#pragma mark - WXMediaMessage + +/*! @brief 多媒体消息结构体 + * + * 用于微信终端和第三方程序之间传递消息的多媒体消息内容 + */ +@interface WXMediaMessage : NSObject + ++ (WXMediaMessage *)message; + +/** 标题 + * @note 长度不能超过512字节 + */ +@property (nonatomic, copy) NSString *title; +/** 描述内容 + * @note 长度不能超过1K + */ +@property (nonatomic, copy) NSString *description; +/** 缩略图数据 + * @note 大小不能超过64K + */ +@property (nonatomic, strong, nullable) NSData *thumbData; +/** + * @note 长度不能超过64字节 + */ +@property (nonatomic, copy, nullable) NSString *mediaTagName; +/** + * + */ +@property (nonatomic, copy, nullable) NSString *messageExt; +@property (nonatomic, copy, nullable) NSString *messageAction; +/** + * 多媒体数据对象,可以为WXImageObject,WXMusicObject,WXVideoObject,WXWebpageObject等。 + */ +@property (nonatomic, strong) id mediaObject; + +/** 缩略图的hash值 + * @note 使用sha256得到,用于计算签名 + */ +@property (nonatomic, copy, nullable) NSString *thumbDataHash; + +/** 消息签名 + * @note 用于校验消息体是否被篡改过 + */ +@property (nonatomic, copy, nullable) NSString *msgSignature; + + +/*! @brief 设置消息缩略图的方法 + * + * @param image 缩略图 + * @note 大小不能超过256K + */ +- (void)setThumbImage:(UIImage *)image; + +@end + + + +#pragma mark - WXImageObject +/*! @brief 多媒体消息中包含的图片数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的图片数据对象。 + * @note imageData成员不能为空 + * @see WXMediaMessage + */ +@interface WXImageObject : NSObject +/*! @brief 返回一个WXImageObject对象 + * + * @note 返回的WXImageObject对象是自动释放的 + */ ++ (WXImageObject *)object; + +/** 图片真实数据内容 + * @note 大小不能超过25M + */ +@property (nonatomic, strong) NSData *imageData; + +/** 图片数据的hash值 + * @note 使用sha256得到,用于计算签名 + */ +@property (nonatomic, copy, nullable) NSString *imgDataHash; + +/** 分享的图片消息是否要带小程序入口,若 'entranceMiniProgramUsername' 非空则显示 + * 仅部分小程序类目可用 + * @note 本字段为空则发送普通app图片消息 + */ +@property (nonatomic, copy, nullable) NSString *entranceMiniProgramUsername; + +/** 分享的图片消息显示的小程序入口可以跳转的小程序路径 + * 仅当 'entranceMiniProgramUsername' 非空时生效 + */ +@property (nonatomic, copy, nullable) NSString *entranceMiniProgramPath; + +@end + + +#pragma mark - WXMusicObject +/*! @brief 多媒体消息中包含的音乐数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的音乐数据对象。 + * @note musicUrl和musicLowBandUrl成员不能同时为空。 + * @see WXMediaMessage + */ +@interface WXMusicObject : NSObject +/*! @brief 返回一个WXMusicObject对象 + * + * @note 返回的WXMusicObject对象是自动释放的 + */ ++ (WXMusicObject *)object; + +/** 音乐网页的url地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *musicUrl; +/** 音乐lowband网页的url地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *musicLowBandUrl; +/** 音乐数据url地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *musicDataUrl; + +/**音乐lowband数据url地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *musicLowBandDataUrl; + +/**音乐封面图Url + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *songAlbumUrl; + +/**歌词信息 LRC格式 + * @note 长度不能超过32K + */ +@property (nonatomic, copy, nullable) NSString *songLyric; +@end + + + +#pragma mark - WXMusicVideoObject + +@interface WXMusicVipInfo : NSObject + +/**付费歌曲的id + * @note 长度不能超过32K + */ +@property (nonatomic, copy) NSString *musicId; + +@end + + +@interface WXMusicVideoObject : NSObject + +/*! @brief 返回一个WXMusicVideoObject对象 + * + * @note 返回的WXMusicVideoObject对象是自动释放的 + */ ++ (WXMusicVideoObject *)object; + +/** 音乐网页的url地址 + * @note 长度不能超过10K,不能为空 + */ +@property (nonatomic, copy) NSString *musicUrl; + +/** 音乐数据url地址 + * @note 长度不能超过10K,不能为空 + */ +@property (nonatomic, copy) NSString *musicDataUrl; + +/**歌手名 + * @note 长度不能超过1k,不能为空 + */ +@property (nonatomic, copy) NSString *singerName; + +/** + * @note 音乐时长, 单位毫秒 + */ +@property (nonatomic, assign) UInt32 duration; + +/**歌词信息 LRC格式 + * @note 长度不能超过32K + */ +@property (nonatomic, copy) NSString *songLyric; + +/**高清封面图 + * @note 大小不能超过1M + */ +@property (nonatomic, strong) NSData *hdAlbumThumbData; + +/** 高清封面图数据的hash值 + * @note 使用sha256得到,用于计算签名 + */ +@property (nonatomic, copy, nullable) NSString *hdAlbumThumbFileHash; + +/**音乐专辑名称 + * @note 长度不能超过1k + */ +@property (nonatomic, copy, nullable) NSString *albumName; + +/**音乐流派 + * @note 长度不能超过1k + */ +@property (nonatomic, copy, nullable) NSString *musicGenre; + +/**发行时间 + * @note Unix时间戳,单位为秒 + */ +@property (nonatomic, assign) UInt64 issueDate; + +/**音乐标识符 + * @note 长度不能超过1K,从微信跳回应用时会带上 + */ +@property (nonatomic, copy, nullable) NSString *identification; + +/**运营H5地址 + * @note 选填,建议填写,用户进入歌曲详情页将展示内嵌的运营H5,可展示该歌曲的相关评论、歌曲推荐等内容,不可诱导下载、分享等。 + */ +@property (nonatomic, copy, nullable) NSString *musicOperationUrl; + +/** 付费歌曲相关信息 + * @note 选填,如果歌曲是需要付费的,那么将付费歌曲id等信息封装在内。 + */ +@property (nonatomic, strong) WXMusicVipInfo *musicVipInfo; + +@end + + + +#pragma mark - WXVideoObject +/*! @brief 多媒体消息中包含的视频数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的视频数据对象。 + * @note videoUrl和videoLowBandUrl不能同时为空。 + * @see WXMediaMessage + */ +@interface WXVideoObject : NSObject +/*! @brief 返回一个WXVideoObject对象 + * + * @note 返回的WXVideoObject对象是自动释放的 + */ ++ (WXVideoObject *)object; + +/** 视频网页的url地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *videoUrl; +/** 视频lowband网页的url地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *videoLowBandUrl; + +@end + + + +#pragma mark - WXWebpageObject +/*! @brief 多媒体消息中包含的网页数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的网页数据对象。 + * @see WXMediaMessage + */ +@interface WXWebpageObject : NSObject +/*! @brief 返回一个WXWebpageObject对象 + * + * @note 返回的WXWebpageObject对象是自动释放的 + */ ++ (WXWebpageObject *)object; + +/** 网页的url地址 + * @note 不能为空且长度不能超过10K + */ +@property (nonatomic, copy) NSString *webpageUrl; + +/**是否是私密消息 + */ +@property (nonatomic, assign) BOOL isSecretMessage; + +/** 业务所需的额外信息 */ +@property (nonatomic, strong, nullable) NSDictionary *extraInfoDic; + +@end + + + +#pragma mark - WXAppExtendObject +/*! @brief 多媒体消息中包含的App扩展数据对象 + * + * 第三方程序向微信终端发送包含WXAppExtendObject的多媒体消息, + * 微信需要处理该消息时,会调用该第三方程序来处理多媒体消息内容。 + * @note url,extInfo和fileData不能同时为空 + * @see WXMediaMessage + */ +@interface WXAppExtendObject : NSObject +/*! @brief 返回一个WXAppExtendObject对象 + * + * @note 返回的WXAppExtendObject对象是自动释放的 + */ ++ (WXAppExtendObject *)object; + +/** 若第三方程序不存在,微信终端会打开该url所指的App下载地址 + * @note 长度不能超过10K + */ +@property (nonatomic, copy) NSString *url; +/** 第三方程序自定义简单数据,微信终端会回传给第三方程序处理 + * @note 长度不能超过2K + */ +@property (nonatomic, copy, nullable) NSString *extInfo; +/** App文件数据,该数据发送给微信好友,微信好友需要点击后下载数据,微信终端会回传给第三方程序处理 + * @note 大小不能超过10M + */ +@property (nonatomic, strong, nullable) NSData *fileData; + +@end + + + +#pragma mark - WXEmoticonObject +/*! @brief 多媒体消息中包含的表情数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的表情数据对象。 + * @see WXMediaMessage + */ +@interface WXEmoticonObject : NSObject + +/*! @brief 返回一个WXEmoticonObject对象 + * + * @note 返回的WXEmoticonObject对象是自动释放的 + */ ++ (WXEmoticonObject *)object; + +/** 表情真实数据内容 + * @note 大小不能超过10M + */ +@property (nonatomic, strong) NSData *emoticonData; + +@end + + + +#pragma mark - WXFileObject +/*! @brief 多媒体消息中包含的文件数据对象 + * + * @see WXMediaMessage + */ +@interface WXFileObject : NSObject + +/*! @brief 返回一个WXFileObject对象 + * + * @note 返回的WXFileObject对象是自动释放的 + */ ++ (WXFileObject *)object; + +/** 文件后缀名 + * @note 长度不超过64字节 + */ +@property (nonatomic, copy) NSString *fileExtension; + +/** 文件真实数据内容 + * @note 大小不能超过10M + */ +@property (nonatomic, strong) NSData *fileData; + +@end + + +#pragma mark - WXLocationObject +/*! @brief 多媒体消息中包含的地理位置数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的地理位置数据对象。 + * @see WXMediaMessage + */ +@interface WXLocationObject : NSObject + +/*! @brief 返回一个WXLocationObject对象 + * + * @note 返回的WXLocationObject对象是自动释放的 + */ ++ (WXLocationObject *)object; + +/** 地理位置信息 + * @note 经纬度 + */ +@property (nonatomic, assign) double lng; //经度 +@property (nonatomic, assign) double lat; //纬度 + +@end + +#pragma mark - WXTextObject +/*! @brief 多媒体消息中包含的文本数据对象 + * + * 微信终端和第三方程序之间传递消息中包含的文本数据对象。 + * @see WXMediaMessage + */ +@interface WXTextObject : NSObject + +/*! @brief 返回一个WXTextObject对象 + * + * @note 返回的WXTextObject对象是自动释放的 + */ ++ (WXTextObject *)object; + +/** 地理位置信息 + * @note 文本内容 + */ +@property (nonatomic, copy) NSString *contentText; + +@end + +#pragma mark - WXMiniProgramObject + +@interface WXMiniProgramObject : NSObject + +/*! @brief WXMiniProgramObject对象 + * + * @note 返回的WXMiniProgramObject对象是自动释放的 + */ ++ (WXMiniProgramObject *)object; + +/** 低版本网页链接 + * @attention 长度不能超过1024字节 + */ +@property (nonatomic, copy) NSString *webpageUrl; + +/** 小程序username */ +@property (nonatomic, copy) NSString *userName; + +/** 小程序页面的路径 + * @attention 不填默认拉起小程序首页 + */ +@property (nonatomic, copy, nullable) NSString *path; + +/** 小程序新版本的预览图 + * @attention 大小不能超过128k + */ +@property (nonatomic, strong, nullable) NSData *hdImageData; + +/** 是否使用带 shareTicket 的转发 */ +@property (nonatomic, assign) BOOL withShareTicket; + +/** 分享小程序的版本 + * @attention (正式,开发,体验) + */ +@property (nonatomic, assign) WXMiniProgramType miniProgramType; + +/** 是否禁用转发 */ +@property (nonatomic, assign) BOOL disableForward; + +@property (nonatomic, assign) BOOL isUpdatableMessage; + +@property (nonatomic, assign) BOOL isSecretMessage; + + +/** 业务所需的额外信息 */ +@property (nonatomic, strong, nullable) NSDictionary *extraInfoDic; + +@end + +#pragma mark - WXGameLiveObject + +/*! @brief WXGameLiveObject对象 + * + * @note 游戏直播消息类型 + */ + +@interface WXGameLiveObject : NSObject + ++ (WXGameLiveObject *)object; + +/** 业务所需的额外信息 */ +@property (nonatomic, strong, nullable) NSDictionary *extraInfoDic; + +@end + +@interface WXNativeGamePageObject : NSObject + +/** 是否为视频类型 + */ +@property (nonatomic, assign) BOOL isVideo; + +/** 视频时长 + @note 当为视频类型时,必填;单位为秒 + */ +@property (nonatomic, assign) UInt32 videoDuration; + +/** 透传字段 + @note 长度限制为100K + */ +@property (nonatomic, copy) NSString *shareData; + +/** 缩略图 + @note 大小限制为256K + */ +@property (nonatomic, strong) NSData *gameThumbData; + ++ (WXNativeGamePageObject *)object; + +@end + +#pragma mark - WXLaunchMiniProgramReq + +/*! @brief WXLaunchMiniProgramReq对象, 可实现通过sdk拉起微信小程序 + * + * @note 返回的WXLaunchMiniProgramReq对象是自动释放的 + */ +@interface WXLaunchMiniProgramReq : BaseReq + ++ (WXLaunchMiniProgramReq *)object; + +/** 小程序username */ +@property (nonatomic, copy) NSString *userName; + +/** 小程序页面的路径 + * @attention 不填默认拉起小程序首页 + */ +@property (nonatomic, copy, nullable) NSString *path; + +/** 分享小程序的版本 + * @attention (正式,开发,体验) + */ +@property (nonatomic, assign) WXMiniProgramType miniProgramType; + +/** ext信息 + * @attention json格式 + */ +@property (nonatomic, copy, nullable) NSString *extMsg; + +/** extDic + * @attention 字典,可存放图片等比较大的数据 + */ +@property (nonatomic, copy, nullable) NSDictionary *extDic; + +@end + +#pragma mark - WXLaunchMiniProgramResp +/*! @brief 微信终端向第三方程序返回的WXLaunchMiniProgramReq处理结果。 + * + * 第三方程序向微信终端发送WXLaunchMiniProgramReq后,微信发送回来的处理结果,该结果用WXLaunchMiniProgramResp表示。 + */ +@interface WXLaunchMiniProgramResp : BaseResp + +@property (nonatomic, copy, nullable) NSString *extMsg; + +@end + + +#pragma mark - WXOpenBusinessViewReq +/*! @brief WXOpenBusinessViewReq对象, 可实现第三方通知微信启动,打开业务页面 + * + * @note 返回的WXOpenBusinessViewReq对象是自动释放的 + */ + +@interface WXOpenBusinessViewReq : BaseReq + ++ (WXOpenBusinessViewReq *)object; + +/** 业务类型 + */ +@property (nonatomic, copy) NSString *businessType; + +/** 业务参数 + */ +@property (nonatomic, copy, nullable) NSString *query; + +/** ext信息 + * @note 选填,json格式 + */ +@property (nonatomic, copy, nullable) NSString *extInfo; + +/** extData数据 + * @note + */ +@property (nonatomic, strong, nullable) NSData *extData; +@end + + +@interface WXOpenBusinessViewResp : BaseResp + +/** 业务类型 + */ +@property (nonatomic, copy) NSString *businessType; + +/** 业务返回数据 + */ +@property (nonatomic, copy, nullable) NSString *extMsg; + +@end + +#pragma mark - WXOpenCustomerServiceReq +@interface WXOpenCustomerServiceReq : BaseReq + ++ (WXOpenCustomerServiceReq *)object; + +/**企微客服发起流程 url + */ +@property (nonatomic, copy, nullable) NSString *url; + +/**企业 id + */ +@property (nonatomic, copy, nullable) NSString *corpid; + +@end + +@interface WXOpenCustomerServiceResp : BaseResp + +/** 业务返回数据 + */ +@property (nonatomic, copy, nullable) NSString *extMsg; + +@end + + +#pragma mark - WXChannelStartLiveReq + +@interface WXChannelStartLiveReq : BaseReq + ++ (WXChannelStartLiveReq *)object; + +/** 必填,直播业务数据(json格式) + */ +@property (nonatomic, copy) NSString *liveJsonInfo; + +@end + +@interface WXChannelStartLiveResp : BaseResp + +/** 业务返回数据 + */ +@property (nonatomic, copy, nullable) NSString *extMsg; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Headers/WechatAuthSDK.h b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Headers/WechatAuthSDK.h new file mode 100644 index 0000000..308aaea --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Headers/WechatAuthSDK.h @@ -0,0 +1,68 @@ +// +// WechatAuthSDK.h +// WechatAuthSDK +// +// Created by 李凯 on 13-11-29. +// Copyright (c) 2013年 Tencent. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +enum AuthErrCode { + WechatAuth_Err_Ok = 0, //Auth成功 + WechatAuth_Err_NormalErr = -1, //普通错误 + WechatAuth_Err_NetworkErr = -2, //网络错误 + WechatAuth_Err_GetQrcodeFailed = -3, //获取二维码失败 + WechatAuth_Err_Cancel = -4, //用户取消授权 + WechatAuth_Err_Timeout = -5, //超时 +}; + +@protocol WechatAuthAPIDelegate +@optional + +- (void)onAuthGotQrcode:(UIImage *)image; //得到二维码 +- (void)onQrcodeScanned; //二维码被扫描 +- (void)onAuthFinish:(int)errCode AuthCode:(nullable NSString *)authCode; //成功登录 + +@end + +@interface WechatAuthSDK : NSObject{ + NSString *_sdkVersion; + __weak id _delegate; +} + +@property(nonatomic, weak, nullable) id delegate; +@property(nonatomic, readonly) NSString *sdkVersion; //authSDK版本号 + +/*! @brief 发送登录请求,等待WechatAuthAPIDelegate回调 + * + * @param appId 微信开发者ID + * @param nonceStr 一个随机的尽量不重复的字符串,用来使得每次的signature不同 + * @param timeStamp 时间戳 + * @param scope 应用授权作用域,拥有多个作用域用逗号(,)分隔 + * @param signature 签名 + * @param schemeData 会在扫码后拼在scheme后 + * @return 成功返回YES,失败返回NO + 注:该实现只保证同时只有一个Auth在运行,Auth未完成或未Stop再次调用Auth接口时会返回NO。 + */ + +- (BOOL)Auth:(NSString *)appId + nonceStr:(NSString *)nonceStr + timeStamp:(NSString *)timeStamp + scope:(NSString *)scope + signature:(NSString *)signature + schemeData:(nullable NSString *)schemeData; + + +/*! @brief 暂停登录请求 + * + * @return 成功返回YES,失败返回NO。 + */ +- (BOOL)StopAuth; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Headers/WechatOpenSDK.h b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Headers/WechatOpenSDK.h new file mode 100644 index 0000000..979e5e9 --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Headers/WechatOpenSDK.h @@ -0,0 +1,9 @@ +// WechatOpenSDK.h +// +// Created by Wechat. +// Copyright (c) 2012年 Tencent. All rights reserved. +// +#import +#import +#import + diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Info.plist b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Info.plist new file mode 100755 index 0000000..45d6068 --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Info.plist @@ -0,0 +1,15 @@ + + + + CFBundleIdentifier + com.tencent.WechatOpenSDK + CFBundleVersion + 1.0.0 + CFBundleShortVersionString + 1.0 + MinimumOSVersion + 12.0 + CFBundleExecutable + WechatOpenSDK + + \ No newline at end of file diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Modules/module.modulemap b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Modules/module.modulemap new file mode 100644 index 0000000..3ddbeb0 --- /dev/null +++ b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/Modules/module.modulemap @@ -0,0 +1,5 @@ +framework module WechatOpenSDK { + umbrella header "WechatOpenSDK.h" + export * + link "WechatOpenSDK" +} diff --git a/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/WechatOpenSDK b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/WechatOpenSDK new file mode 100644 index 0000000..415bd55 Binary files /dev/null and b/Pods/WechatOpenSDK-XCFramework/WechatOpenSDK.xcframework/ios-arm64_x86_64-simulator/WechatOpenSDK.framework/WechatOpenSDK differ diff --git a/suixinkan.xcodeproj/project.pbxproj b/suixinkan.xcodeproj/project.pbxproj index f16dd86..f6f2a59 100644 --- a/suixinkan.xcodeproj/project.pbxproj +++ b/suixinkan.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 82444F963D925740D4BACF57 /* libPods-suixinkanTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C3624DF243B82E619461C0F /* libPods-suixinkanTests.a */; }; + 79ACA2FE7C9334E1DB401644 /* Pods_suixinkanTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0CE1585863FCF89081F4D013 /* Pods_suixinkanTests.framework */; }; 93FF17E42FFB84950033C304 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 93FF17E22FFB84950033C304 /* SnapKit */; }; 93FF17E52FFB84950033C304 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 93FF17E32FFB84950033C304 /* Kingfisher */; }; A1B2C3D12FFB84950033C305 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 93FF17E22FFB84950033C304 /* SnapKit */; }; @@ -28,8 +28,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 0CE1585863FCF89081F4D013 /* Pods_suixinkanTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_suixinkanTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1060D5E389506965D83EA1CC /* Pods-suixinkan.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-suixinkan.release.xcconfig"; path = "Target Support Files/Pods-suixinkan/Pods-suixinkan.release.xcconfig"; sourceTree = ""; }; - 2C3624DF243B82E619461C0F /* libPods-suixinkanTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-suixinkanTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 5BBB56C2281879245220A9F3 /* Pods-suixinkan.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-suixinkan.debug.xcconfig"; path = "Target Support Files/Pods-suixinkan/Pods-suixinkan.debug.xcconfig"; sourceTree = ""; }; 6CB3E1DA4E97AA4961B25733 /* Pods-suixinkanTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-suixinkanTests.release.xcconfig"; path = "Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.release.xcconfig"; sourceTree = ""; }; 83445E7B4CCCF42C6FD481D3 /* Pods-suixinkanTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-suixinkanTests.debug.xcconfig"; path = "Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.debug.xcconfig"; sourceTree = ""; }; @@ -57,16 +57,20 @@ path = suixinkan; sourceTree = ""; }; - A1B2C3D42FFB84950033C305 /* suixinkanTests */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = suixinkanTests; - sourceTree = ""; - }; 9A01B8E22FFB84950033C402 /* Vendor */ = { isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + ); path = Vendor; sourceTree = ""; }; + A1B2C3D42FFB84950033C305 /* suixinkanTests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + ); + path = suixinkanTests; + sourceTree = ""; + }; /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ @@ -88,7 +92,7 @@ files = ( A1B2C3D12FFB84950033C305 /* SnapKit in Frameworks */, A1B2C3D22FFB84950033C305 /* Kingfisher in Frameworks */, - 82444F963D925740D4BACF57 /* libPods-suixinkanTests.a in Frameworks */, + 79ACA2FE7C9334E1DB401644 /* Pods_suixinkanTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -99,7 +103,7 @@ isa = PBXGroup; children = ( C69C08A144C2D5D4A448B7D2 /* Pods_suixinkan.framework */, - 2C3624DF243B82E619461C0F /* libPods-suixinkanTests.a */, + 0CE1585863FCF89081F4D013 /* Pods_suixinkanTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -301,27 +305,6 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - D83AC0A37C1CDC54D21AB6C9 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 9A01B8E12FFB84950033C401 /* Embed Aliyun NUI SDK */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -343,6 +326,23 @@ shellScript = "set -e\nif [ \"${PLATFORM_NAME}\" = \"iphonesimulator\" ]; then\n exit 0\nfi\nFRAMEWORK_SOURCE=\"${SRCROOT}/Vendor/AliyunNui/nuisdk.framework\"\nFRAMEWORK_DEST=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${FRAMEWORK_DEST}\"\nrsync -a --delete \"${FRAMEWORK_SOURCE}\" \"${FRAMEWORK_DEST}/\"\nif [ -n \"${EXPANDED_CODE_SIGN_IDENTITY}\" ]; then\n /usr/bin/codesign --force --sign \"${EXPANDED_CODE_SIGN_IDENTITY}\" --preserve-metadata=identifier,entitlements,flags \"${FRAMEWORK_DEST}/nuisdk.framework\"\nfi\n"; showEnvVarsInLog = 0; }; + D83AC0A37C1CDC54D21AB6C9 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -377,15 +377,16 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = suixinkan/suixinkan.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 56GVN5RNVN; ENABLE_USER_SCRIPT_SANDBOXING = NO; - GENERATE_INFOPLIST_FILE = YES; "FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]" = ( "$(inherited)", "$(SRCROOT)/Vendor/AliyunNui", ); + GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = suixinkan/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; @@ -435,15 +436,16 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = suixinkan/suixinkan.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 56GVN5RNVN; ENABLE_USER_SCRIPT_SANDBOXING = NO; - GENERATE_INFOPLIST_FILE = YES; "FRAMEWORK_SEARCH_PATHS[sdk=iphoneos*]" = ( "$(inherited)", "$(SRCROOT)/Vendor/AliyunNui", ); + GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = suixinkan/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; diff --git a/suixinkan/App/NetworkServices.swift b/suixinkan/App/NetworkServices.swift index c8d036e..5cdde1d 100644 --- a/suixinkan/App/NetworkServices.swift +++ b/suixinkan/App/NetworkServices.swift @@ -18,6 +18,8 @@ final class NetworkServices { let homeAPI: HomeAPI let paymentAPI: PaymentAPI let taskAPI: TaskAPI + let inviteAPI: InviteAPI + let walletAPI: WalletAPI let scenicQueueAPI: ScenicQueueAPI let uploadAPI: UploadAPI let ossUploadService: OSSUploadService @@ -32,6 +34,8 @@ final class NetworkServices { homeAPI = HomeAPI(client: client) paymentAPI = PaymentAPI(client: client) taskAPI = TaskAPI(client: client) + inviteAPI = InviteAPI(client: client) + walletAPI = WalletAPI(client: client) scenicQueueAPI = ScenicQueueAPI(client: client) uploadAPI = UploadAPI(client: client) ossUploadService = OSSUploadService(configService: uploadAPI) @@ -51,6 +55,8 @@ final class NetworkServices { homeAPI = HomeAPI(client: apiClient) paymentAPI = PaymentAPI(client: apiClient) taskAPI = TaskAPI(client: apiClient) + inviteAPI = InviteAPI(client: apiClient) + walletAPI = WalletAPI(client: apiClient) scenicQueueAPI = ScenicQueueAPI(client: apiClient) uploadAPI = UploadAPI(client: apiClient) ossUploadService = OSSUploadService(configService: uploadAPI) diff --git a/suixinkan/App/WeChatConfig.swift b/suixinkan/App/WeChatConfig.swift new file mode 100644 index 0000000..f75eda2 --- /dev/null +++ b/suixinkan/App/WeChatConfig.swift @@ -0,0 +1,34 @@ +// +// WeChatConfig.swift +// suixinkan +// + +import Foundation + +/// 微信开放平台接入配置,集中管理 AppID、Universal Link 和 AASA 信息。 +enum WeChatConfig { + /// 微信开放平台移动应用 AppID,同时也是 Info.plist URL Scheme。 + static let appID = "wxdd80ec12c4fee322" + + /// 微信 OpenSDK 注册使用的 Universal Link,必须为 HTTPS 且以 `/` 结尾。 + static let universalLink = "https://www.zhifly.cn/suixinkan/" + + /// Associated Domains 使用的域名,不含 `applinks:` 前缀。 + static let associatedDomain = "www.zhifly.cn" + + /// AASA 文件中应配置的 paths 规则。 + static let aasaPathPattern = "/suixinkan/*" + + /// AASA 文件中应配置的 Team ID + Bundle ID。 + static let aasaAppID = "56GVN5RNVN.com.yuanzhixiang.suixinkan" + + /// 校验 Universal Link 是否满足微信 SDK 的基本格式要求。 + static func validateUniversalLink(_ link: String) -> Bool { + guard let url = URL(string: link), + url.scheme?.lowercased() == "https", + link.hasSuffix("/") else { + return false + } + return true + } +} diff --git a/suixinkan/AppDelegate.swift b/suixinkan/AppDelegate.swift index 1017f41..6667d00 100644 --- a/suixinkan/AppDelegate.swift +++ b/suixinkan/AppDelegate.swift @@ -15,6 +15,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { UmengBootstrap.configureIfNeeded() + WeChatManager.shared.registerIfNeeded() if AppStore.shared.privacyAgreementAccepted, !AppStore.shared.token.isEmpty { AMapBootstrap.configureIfNeeded() } diff --git a/suixinkan/Assets.xcassets/AccentColor.colorset/Contents.json b/suixinkan/Assets.xcassets/App/AccentColor.colorset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/AccentColor.colorset/Contents.json rename to suixinkan/Assets.xcassets/App/AccentColor.colorset/Contents.json diff --git a/suixinkan/Assets.xcassets/AppIcon.appiconset/Contents.json b/suixinkan/Assets.xcassets/App/AppIcon.appiconset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/AppIcon.appiconset/Contents.json rename to suixinkan/Assets.xcassets/App/AppIcon.appiconset/Contents.json diff --git a/suixinkan/Assets.xcassets/AppIcon.appiconset/icon_1024.png b/suixinkan/Assets.xcassets/App/AppIcon.appiconset/icon_1024.png similarity index 100% rename from suixinkan/Assets.xcassets/AppIcon.appiconset/icon_1024.png rename to suixinkan/Assets.xcassets/App/AppIcon.appiconset/icon_1024.png diff --git a/suixinkan/Assets.xcassets/App/Contents.json b/suixinkan/Assets.xcassets/App/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/suixinkan/Assets.xcassets/App/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/SplashLogo.imageset/Contents.json b/suixinkan/Assets.xcassets/App/SplashLogo.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/SplashLogo.imageset/Contents.json rename to suixinkan/Assets.xcassets/App/SplashLogo.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/SplashLogo.imageset/icon_splash.png b/suixinkan/Assets.xcassets/App/SplashLogo.imageset/icon_splash.png similarity index 100% rename from suixinkan/Assets.xcassets/SplashLogo.imageset/icon_splash.png rename to suixinkan/Assets.xcassets/App/SplashLogo.imageset/icon_splash.png diff --git a/suixinkan/Assets.xcassets/Common/Contents.json b/suixinkan/Assets.xcassets/Common/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/suixinkan/Assets.xcassets/Common/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/icon_scan.imageset/Contents.json b/suixinkan/Assets.xcassets/Common/icon_scan.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/icon_scan.imageset/Contents.json rename to suixinkan/Assets.xcassets/Common/icon_scan.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan.png b/suixinkan/Assets.xcassets/Common/icon_scan.imageset/icon_scan.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan.png rename to suixinkan/Assets.xcassets/Common/icon_scan.imageset/icon_scan.png diff --git a/suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan@2x.png b/suixinkan/Assets.xcassets/Common/icon_scan.imageset/icon_scan@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan@2x.png rename to suixinkan/Assets.xcassets/Common/icon_scan.imageset/icon_scan@2x.png diff --git a/suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan@3x.png b/suixinkan/Assets.xcassets/Common/icon_scan.imageset/icon_scan@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan@3x.png rename to suixinkan/Assets.xcassets/Common/icon_scan.imageset/icon_scan@3x.png diff --git a/suixinkan/Assets.xcassets/Invite/Contents.json b/suixinkan/Assets.xcassets/Invite/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/suixinkan/Assets.xcassets/Invite/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/Invite/ic_free_traffic.imageset/Contents.json b/suixinkan/Assets.xcassets/Invite/ic_free_traffic.imageset/Contents.json new file mode 100644 index 0000000..ec1b16a --- /dev/null +++ b/suixinkan/Assets.xcassets/Invite/ic_free_traffic.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_free_traffic.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/Invite/ic_free_traffic.imageset/ic_free_traffic.png b/suixinkan/Assets.xcassets/Invite/ic_free_traffic.imageset/ic_free_traffic.png new file mode 100644 index 0000000..878f68e Binary files /dev/null and b/suixinkan/Assets.xcassets/Invite/ic_free_traffic.imageset/ic_free_traffic.png differ diff --git a/suixinkan/Assets.xcassets/Invite/ic_invite_benefit_free_cloud.imageset/Contents.json b/suixinkan/Assets.xcassets/Invite/ic_invite_benefit_free_cloud.imageset/Contents.json new file mode 100644 index 0000000..ff20ccb --- /dev/null +++ b/suixinkan/Assets.xcassets/Invite/ic_invite_benefit_free_cloud.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_invite_benefit_free_cloud.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/Invite/ic_invite_benefit_free_cloud.imageset/ic_invite_benefit_free_cloud.png b/suixinkan/Assets.xcassets/Invite/ic_invite_benefit_free_cloud.imageset/ic_invite_benefit_free_cloud.png new file mode 100644 index 0000000..8a4910d Binary files /dev/null and b/suixinkan/Assets.xcassets/Invite/ic_invite_benefit_free_cloud.imageset/ic_invite_benefit_free_cloud.png differ diff --git a/suixinkan/Assets.xcassets/Invite/ic_invite_benefit_free_editing.imageset/Contents.json b/suixinkan/Assets.xcassets/Invite/ic_invite_benefit_free_editing.imageset/Contents.json new file mode 100644 index 0000000..87bb14c --- /dev/null +++ b/suixinkan/Assets.xcassets/Invite/ic_invite_benefit_free_editing.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_invite_benefit_free_editing.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/Invite/ic_invite_benefit_free_editing.imageset/ic_invite_benefit_free_editing.png b/suixinkan/Assets.xcassets/Invite/ic_invite_benefit_free_editing.imageset/ic_invite_benefit_free_editing.png new file mode 100644 index 0000000..b13bf86 Binary files /dev/null and b/suixinkan/Assets.xcassets/Invite/ic_invite_benefit_free_editing.imageset/ic_invite_benefit_free_editing.png differ diff --git a/suixinkan/Assets.xcassets/Invite/ic_invite_earnings.imageset/Contents.json b/suixinkan/Assets.xcassets/Invite/ic_invite_earnings.imageset/Contents.json new file mode 100644 index 0000000..0ad7fb6 --- /dev/null +++ b/suixinkan/Assets.xcassets/Invite/ic_invite_earnings.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_invite_earnings.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/Invite/ic_invite_earnings.imageset/ic_invite_earnings.png b/suixinkan/Assets.xcassets/Invite/ic_invite_earnings.imageset/ic_invite_earnings.png new file mode 100644 index 0000000..41a3cee Binary files /dev/null and b/suixinkan/Assets.xcassets/Invite/ic_invite_earnings.imageset/ic_invite_earnings.png differ diff --git a/suixinkan/Assets.xcassets/Invite/ic_invite_link.imageset/Contents.json b/suixinkan/Assets.xcassets/Invite/ic_invite_link.imageset/Contents.json new file mode 100644 index 0000000..ed39919 --- /dev/null +++ b/suixinkan/Assets.xcassets/Invite/ic_invite_link.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_invite_link.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/Invite/ic_invite_link.imageset/ic_invite_link.png b/suixinkan/Assets.xcassets/Invite/ic_invite_link.imageset/ic_invite_link.png new file mode 100644 index 0000000..20ef84c Binary files /dev/null and b/suixinkan/Assets.xcassets/Invite/ic_invite_link.imageset/ic_invite_link.png differ diff --git a/suixinkan/Assets.xcassets/Invite/ic_invite_record.imageset/Contents.json b/suixinkan/Assets.xcassets/Invite/ic_invite_record.imageset/Contents.json new file mode 100644 index 0000000..cf572f9 --- /dev/null +++ b/suixinkan/Assets.xcassets/Invite/ic_invite_record.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_invite_record.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/Invite/ic_invite_record.imageset/ic_invite_record.png b/suixinkan/Assets.xcassets/Invite/ic_invite_record.imageset/ic_invite_record.png new file mode 100644 index 0000000..b1b6adf Binary files /dev/null and b/suixinkan/Assets.xcassets/Invite/ic_invite_record.imageset/ic_invite_record.png differ diff --git a/suixinkan/Assets.xcassets/Invite/ic_invite_share.imageset/Contents.json b/suixinkan/Assets.xcassets/Invite/ic_invite_share.imageset/Contents.json new file mode 100644 index 0000000..44cb135 --- /dev/null +++ b/suixinkan/Assets.xcassets/Invite/ic_invite_share.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_invite_share.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/Invite/ic_invite_share.imageset/ic_invite_share.png b/suixinkan/Assets.xcassets/Invite/ic_invite_share.imageset/ic_invite_share.png new file mode 100644 index 0000000..8aea9ba Binary files /dev/null and b/suixinkan/Assets.xcassets/Invite/ic_invite_share.imageset/ic_invite_share.png differ diff --git a/suixinkan/Assets.xcassets/Invite/ic_no_commission.imageset/Contents.json b/suixinkan/Assets.xcassets/Invite/ic_no_commission.imageset/Contents.json new file mode 100644 index 0000000..520f0ba --- /dev/null +++ b/suixinkan/Assets.xcassets/Invite/ic_no_commission.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_no_commission.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/Invite/ic_no_commission.imageset/ic_no_commission.png b/suixinkan/Assets.xcassets/Invite/ic_no_commission.imageset/ic_no_commission.png new file mode 100644 index 0000000..2bb62ac Binary files /dev/null and b/suixinkan/Assets.xcassets/Invite/ic_no_commission.imageset/ic_no_commission.png differ diff --git a/suixinkan/Assets.xcassets/Invite/ic_order_tools.imageset/Contents.json b/suixinkan/Assets.xcassets/Invite/ic_order_tools.imageset/Contents.json new file mode 100644 index 0000000..782d133 --- /dev/null +++ b/suixinkan/Assets.xcassets/Invite/ic_order_tools.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_order_tools.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/Invite/ic_order_tools.imageset/ic_order_tools.png b/suixinkan/Assets.xcassets/Invite/ic_order_tools.imageset/ic_order_tools.png new file mode 100644 index 0000000..4b789e0 Binary files /dev/null and b/suixinkan/Assets.xcassets/Invite/ic_order_tools.imageset/ic_order_tools.png differ diff --git a/suixinkan/Assets.xcassets/Invite/ic_scenic_identity.imageset/Contents.json b/suixinkan/Assets.xcassets/Invite/ic_scenic_identity.imageset/Contents.json new file mode 100644 index 0000000..22c75f9 --- /dev/null +++ b/suixinkan/Assets.xcassets/Invite/ic_scenic_identity.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_scenic_identity.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/Invite/ic_scenic_identity.imageset/ic_scenic_identity.png b/suixinkan/Assets.xcassets/Invite/ic_scenic_identity.imageset/ic_scenic_identity.png new file mode 100644 index 0000000..b0f9220 Binary files /dev/null and b/suixinkan/Assets.xcassets/Invite/ic_scenic_identity.imageset/ic_scenic_identity.png differ diff --git a/suixinkan/Assets.xcassets/Invite/ic_user_benefits.imageset/Contents.json b/suixinkan/Assets.xcassets/Invite/ic_user_benefits.imageset/Contents.json new file mode 100644 index 0000000..67eb2df --- /dev/null +++ b/suixinkan/Assets.xcassets/Invite/ic_user_benefits.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "ic_user_benefits.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/Invite/ic_user_benefits.imageset/ic_user_benefits.png b/suixinkan/Assets.xcassets/Invite/ic_user_benefits.imageset/ic_user_benefits.png new file mode 100644 index 0000000..47d6597 Binary files /dev/null and b/suixinkan/Assets.xcassets/Invite/ic_user_benefits.imageset/ic_user_benefits.png differ diff --git a/suixinkan/Assets.xcassets/Login/Contents.json b/suixinkan/Assets.xcassets/Login/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/suixinkan/Assets.xcassets/Login/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/icon_cb_privacy_selected.imageset/Contents.json b/suixinkan/Assets.xcassets/Login/icon_cb_privacy_selected.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/icon_cb_privacy_selected.imageset/Contents.json rename to suixinkan/Assets.xcassets/Login/icon_cb_privacy_selected.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/icon_cb_privacy_selected.imageset/icon_cb_privacy_selected.png b/suixinkan/Assets.xcassets/Login/icon_cb_privacy_selected.imageset/icon_cb_privacy_selected.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_cb_privacy_selected.imageset/icon_cb_privacy_selected.png rename to suixinkan/Assets.xcassets/Login/icon_cb_privacy_selected.imageset/icon_cb_privacy_selected.png diff --git a/suixinkan/Assets.xcassets/icon_cb_privacy_unselect.imageset/Contents.json b/suixinkan/Assets.xcassets/Login/icon_cb_privacy_unselect.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/icon_cb_privacy_unselect.imageset/Contents.json rename to suixinkan/Assets.xcassets/Login/icon_cb_privacy_unselect.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/icon_cb_privacy_unselect.imageset/icon_cb_privacy_unselect.png b/suixinkan/Assets.xcassets/Login/icon_cb_privacy_unselect.imageset/icon_cb_privacy_unselect.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_cb_privacy_unselect.imageset/icon_cb_privacy_unselect.png rename to suixinkan/Assets.xcassets/Login/icon_cb_privacy_unselect.imageset/icon_cb_privacy_unselect.png diff --git a/suixinkan/Assets.xcassets/icon_pwd_invisible.imageset/Contents.json b/suixinkan/Assets.xcassets/Login/icon_pwd_invisible.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/icon_pwd_invisible.imageset/Contents.json rename to suixinkan/Assets.xcassets/Login/icon_pwd_invisible.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/icon_pwd_invisible.imageset/icon_pwd_invisible.png b/suixinkan/Assets.xcassets/Login/icon_pwd_invisible.imageset/icon_pwd_invisible.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_pwd_invisible.imageset/icon_pwd_invisible.png rename to suixinkan/Assets.xcassets/Login/icon_pwd_invisible.imageset/icon_pwd_invisible.png diff --git a/suixinkan/Assets.xcassets/icon_pwd_visible.imageset/Contents.json b/suixinkan/Assets.xcassets/Login/icon_pwd_visible.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/icon_pwd_visible.imageset/Contents.json rename to suixinkan/Assets.xcassets/Login/icon_pwd_visible.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/icon_pwd_visible.imageset/icon_pwd_visible.png b/suixinkan/Assets.xcassets/Login/icon_pwd_visible.imageset/icon_pwd_visible.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_pwd_visible.imageset/icon_pwd_visible.png rename to suixinkan/Assets.xcassets/Login/icon_pwd_visible.imageset/icon_pwd_visible.png diff --git a/suixinkan/Assets.xcassets/img_login_bg.imageset/Contents.json b/suixinkan/Assets.xcassets/Login/img_login_bg.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/img_login_bg.imageset/Contents.json rename to suixinkan/Assets.xcassets/Login/img_login_bg.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/img_login_bg.imageset/img_login_bg.png b/suixinkan/Assets.xcassets/Login/img_login_bg.imageset/img_login_bg.png similarity index 100% rename from suixinkan/Assets.xcassets/img_login_bg.imageset/img_login_bg.png rename to suixinkan/Assets.xcassets/Login/img_login_bg.imageset/img_login_bg.png diff --git a/suixinkan/Assets.xcassets/Statistics/Contents.json b/suixinkan/Assets.xcassets/Statistics/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/suixinkan/Assets.xcassets/Statistics/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_average_amount.imageset/Contents.json b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_average_amount.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_average_amount.imageset/Contents.json rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_average_amount.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_average_amount.imageset/icon_data_statistics_average_amount.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_average_amount.imageset/icon_data_statistics_average_amount.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_average_amount.imageset/icon_data_statistics_average_amount.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_average_amount.imageset/icon_data_statistics_average_amount.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_average_amount.imageset/icon_data_statistics_average_amount@2x.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_average_amount.imageset/icon_data_statistics_average_amount@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_average_amount.imageset/icon_data_statistics_average_amount@2x.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_average_amount.imageset/icon_data_statistics_average_amount@2x.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_average_amount.imageset/icon_data_statistics_average_amount@3x.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_average_amount.imageset/icon_data_statistics_average_amount@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_average_amount.imageset/icon_data_statistics_average_amount@3x.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_average_amount.imageset/icon_data_statistics_average_amount@3x.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_get_amount.imageset/Contents.json b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_get_amount.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_get_amount.imageset/Contents.json rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_get_amount.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_get_amount.imageset/icon_data_statistics_get_amount.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_get_amount.imageset/icon_data_statistics_get_amount.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_get_amount.imageset/icon_data_statistics_get_amount.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_get_amount.imageset/icon_data_statistics_get_amount.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_get_amount.imageset/icon_data_statistics_get_amount@2x.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_get_amount.imageset/icon_data_statistics_get_amount@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_get_amount.imageset/icon_data_statistics_get_amount@2x.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_get_amount.imageset/icon_data_statistics_get_amount@2x.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_get_amount.imageset/icon_data_statistics_get_amount@3x.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_get_amount.imageset/icon_data_statistics_get_amount@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_get_amount.imageset/icon_data_statistics_get_amount@3x.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_get_amount.imageset/icon_data_statistics_get_amount@3x.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_refund_amount.imageset/Contents.json b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_refund_amount.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_refund_amount.imageset/Contents.json rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_refund_amount.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_refund_amount.imageset/icon_data_statistics_refund_amount.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_refund_amount.imageset/icon_data_statistics_refund_amount.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_refund_amount.imageset/icon_data_statistics_refund_amount.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_refund_amount.imageset/icon_data_statistics_refund_amount.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_refund_amount.imageset/icon_data_statistics_refund_amount@2x.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_refund_amount.imageset/icon_data_statistics_refund_amount@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_refund_amount.imageset/icon_data_statistics_refund_amount@2x.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_refund_amount.imageset/icon_data_statistics_refund_amount@2x.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_refund_amount.imageset/icon_data_statistics_refund_amount@3x.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_refund_amount.imageset/icon_data_statistics_refund_amount@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_refund_amount.imageset/icon_data_statistics_refund_amount@3x.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_refund_amount.imageset/icon_data_statistics_refund_amount@3x.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_total_amount.imageset/Contents.json b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_amount.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_total_amount.imageset/Contents.json rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_amount.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_total_amount.imageset/icon_data_statistics_total_amount.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_amount.imageset/icon_data_statistics_total_amount.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_total_amount.imageset/icon_data_statistics_total_amount.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_amount.imageset/icon_data_statistics_total_amount.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_total_amount.imageset/icon_data_statistics_total_amount@2x.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_amount.imageset/icon_data_statistics_total_amount@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_total_amount.imageset/icon_data_statistics_total_amount@2x.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_amount.imageset/icon_data_statistics_total_amount@2x.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_total_amount.imageset/icon_data_statistics_total_amount@3x.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_amount.imageset/icon_data_statistics_total_amount@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_total_amount.imageset/icon_data_statistics_total_amount@3x.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_amount.imageset/icon_data_statistics_total_amount@3x.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_total_order.imageset/Contents.json b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_order.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_total_order.imageset/Contents.json rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_order.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_total_order.imageset/icon_data_statistics_total_order.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_order.imageset/icon_data_statistics_total_order.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_total_order.imageset/icon_data_statistics_total_order.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_order.imageset/icon_data_statistics_total_order.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_total_order.imageset/icon_data_statistics_total_order@2x.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_order.imageset/icon_data_statistics_total_order@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_total_order.imageset/icon_data_statistics_total_order@2x.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_order.imageset/icon_data_statistics_total_order@2x.png diff --git a/suixinkan/Assets.xcassets/icon_data_statistics_total_order.imageset/icon_data_statistics_total_order@3x.png b/suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_order.imageset/icon_data_statistics_total_order@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/icon_data_statistics_total_order.imageset/icon_data_statistics_total_order@3x.png rename to suixinkan/Assets.xcassets/Statistics/icon_data_statistics_total_order.imageset/icon_data_statistics_total_order@3x.png diff --git a/suixinkan/Assets.xcassets/TabBar/Contents.json b/suixinkan/Assets.xcassets/TabBar/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/suixinkan/Assets.xcassets/TabBar/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/tab_data_selected.imageset/Contents.json b/suixinkan/Assets.xcassets/TabBar/tab_data_selected.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/tab_data_selected.imageset/Contents.json rename to suixinkan/Assets.xcassets/TabBar/tab_data_selected.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/tab_data_selected.imageset/tab_data_selected.png b/suixinkan/Assets.xcassets/TabBar/tab_data_selected.imageset/tab_data_selected.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_data_selected.imageset/tab_data_selected.png rename to suixinkan/Assets.xcassets/TabBar/tab_data_selected.imageset/tab_data_selected.png diff --git a/suixinkan/Assets.xcassets/tab_data_selected.imageset/tab_data_selected@2x.png b/suixinkan/Assets.xcassets/TabBar/tab_data_selected.imageset/tab_data_selected@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_data_selected.imageset/tab_data_selected@2x.png rename to suixinkan/Assets.xcassets/TabBar/tab_data_selected.imageset/tab_data_selected@2x.png diff --git a/suixinkan/Assets.xcassets/tab_data_selected.imageset/tab_data_selected@3x.png b/suixinkan/Assets.xcassets/TabBar/tab_data_selected.imageset/tab_data_selected@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_data_selected.imageset/tab_data_selected@3x.png rename to suixinkan/Assets.xcassets/TabBar/tab_data_selected.imageset/tab_data_selected@3x.png diff --git a/suixinkan/Assets.xcassets/tab_data_unselected.imageset/Contents.json b/suixinkan/Assets.xcassets/TabBar/tab_data_unselected.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/tab_data_unselected.imageset/Contents.json rename to suixinkan/Assets.xcassets/TabBar/tab_data_unselected.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/tab_data_unselected.imageset/tab_data_unselected.png b/suixinkan/Assets.xcassets/TabBar/tab_data_unselected.imageset/tab_data_unselected.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_data_unselected.imageset/tab_data_unselected.png rename to suixinkan/Assets.xcassets/TabBar/tab_data_unselected.imageset/tab_data_unselected.png diff --git a/suixinkan/Assets.xcassets/tab_data_unselected.imageset/tab_data_unselected@2x.png b/suixinkan/Assets.xcassets/TabBar/tab_data_unselected.imageset/tab_data_unselected@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_data_unselected.imageset/tab_data_unselected@2x.png rename to suixinkan/Assets.xcassets/TabBar/tab_data_unselected.imageset/tab_data_unselected@2x.png diff --git a/suixinkan/Assets.xcassets/tab_data_unselected.imageset/tab_data_unselected@3x.png b/suixinkan/Assets.xcassets/TabBar/tab_data_unselected.imageset/tab_data_unselected@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_data_unselected.imageset/tab_data_unselected@3x.png rename to suixinkan/Assets.xcassets/TabBar/tab_data_unselected.imageset/tab_data_unselected@3x.png diff --git a/suixinkan/Assets.xcassets/tab_home_selected.imageset/Contents.json b/suixinkan/Assets.xcassets/TabBar/tab_home_selected.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/tab_home_selected.imageset/Contents.json rename to suixinkan/Assets.xcassets/TabBar/tab_home_selected.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/tab_home_selected.imageset/tab_home_selected.png b/suixinkan/Assets.xcassets/TabBar/tab_home_selected.imageset/tab_home_selected.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_home_selected.imageset/tab_home_selected.png rename to suixinkan/Assets.xcassets/TabBar/tab_home_selected.imageset/tab_home_selected.png diff --git a/suixinkan/Assets.xcassets/tab_home_selected.imageset/tab_home_selected@2x.png b/suixinkan/Assets.xcassets/TabBar/tab_home_selected.imageset/tab_home_selected@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_home_selected.imageset/tab_home_selected@2x.png rename to suixinkan/Assets.xcassets/TabBar/tab_home_selected.imageset/tab_home_selected@2x.png diff --git a/suixinkan/Assets.xcassets/tab_home_selected.imageset/tab_home_selected@3x.png b/suixinkan/Assets.xcassets/TabBar/tab_home_selected.imageset/tab_home_selected@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_home_selected.imageset/tab_home_selected@3x.png rename to suixinkan/Assets.xcassets/TabBar/tab_home_selected.imageset/tab_home_selected@3x.png diff --git a/suixinkan/Assets.xcassets/tab_home_unselected.imageset/Contents.json b/suixinkan/Assets.xcassets/TabBar/tab_home_unselected.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/tab_home_unselected.imageset/Contents.json rename to suixinkan/Assets.xcassets/TabBar/tab_home_unselected.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/tab_home_unselected.imageset/tab_home_unselected.png b/suixinkan/Assets.xcassets/TabBar/tab_home_unselected.imageset/tab_home_unselected.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_home_unselected.imageset/tab_home_unselected.png rename to suixinkan/Assets.xcassets/TabBar/tab_home_unselected.imageset/tab_home_unselected.png diff --git a/suixinkan/Assets.xcassets/tab_home_unselected.imageset/tab_home_unselected@2x.png b/suixinkan/Assets.xcassets/TabBar/tab_home_unselected.imageset/tab_home_unselected@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_home_unselected.imageset/tab_home_unselected@2x.png rename to suixinkan/Assets.xcassets/TabBar/tab_home_unselected.imageset/tab_home_unselected@2x.png diff --git a/suixinkan/Assets.xcassets/tab_home_unselected.imageset/tab_home_unselected@3x.png b/suixinkan/Assets.xcassets/TabBar/tab_home_unselected.imageset/tab_home_unselected@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_home_unselected.imageset/tab_home_unselected@3x.png rename to suixinkan/Assets.xcassets/TabBar/tab_home_unselected.imageset/tab_home_unselected@3x.png diff --git a/suixinkan/Assets.xcassets/tab_order_selected.imageset/Contents.json b/suixinkan/Assets.xcassets/TabBar/tab_order_selected.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/tab_order_selected.imageset/Contents.json rename to suixinkan/Assets.xcassets/TabBar/tab_order_selected.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/tab_order_selected.imageset/tab_order_selected.png b/suixinkan/Assets.xcassets/TabBar/tab_order_selected.imageset/tab_order_selected.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_order_selected.imageset/tab_order_selected.png rename to suixinkan/Assets.xcassets/TabBar/tab_order_selected.imageset/tab_order_selected.png diff --git a/suixinkan/Assets.xcassets/tab_order_selected.imageset/tab_order_selected@2x.png b/suixinkan/Assets.xcassets/TabBar/tab_order_selected.imageset/tab_order_selected@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_order_selected.imageset/tab_order_selected@2x.png rename to suixinkan/Assets.xcassets/TabBar/tab_order_selected.imageset/tab_order_selected@2x.png diff --git a/suixinkan/Assets.xcassets/tab_order_selected.imageset/tab_order_selected@3x.png b/suixinkan/Assets.xcassets/TabBar/tab_order_selected.imageset/tab_order_selected@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_order_selected.imageset/tab_order_selected@3x.png rename to suixinkan/Assets.xcassets/TabBar/tab_order_selected.imageset/tab_order_selected@3x.png diff --git a/suixinkan/Assets.xcassets/tab_order_unselected.imageset/Contents.json b/suixinkan/Assets.xcassets/TabBar/tab_order_unselected.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/tab_order_unselected.imageset/Contents.json rename to suixinkan/Assets.xcassets/TabBar/tab_order_unselected.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/tab_order_unselected.imageset/tab_order_unselected.png b/suixinkan/Assets.xcassets/TabBar/tab_order_unselected.imageset/tab_order_unselected.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_order_unselected.imageset/tab_order_unselected.png rename to suixinkan/Assets.xcassets/TabBar/tab_order_unselected.imageset/tab_order_unselected.png diff --git a/suixinkan/Assets.xcassets/tab_order_unselected.imageset/tab_order_unselected@2x.png b/suixinkan/Assets.xcassets/TabBar/tab_order_unselected.imageset/tab_order_unselected@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_order_unselected.imageset/tab_order_unselected@2x.png rename to suixinkan/Assets.xcassets/TabBar/tab_order_unselected.imageset/tab_order_unselected@2x.png diff --git a/suixinkan/Assets.xcassets/tab_order_unselected.imageset/tab_order_unselected@3x.png b/suixinkan/Assets.xcassets/TabBar/tab_order_unselected.imageset/tab_order_unselected@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_order_unselected.imageset/tab_order_unselected@3x.png rename to suixinkan/Assets.xcassets/TabBar/tab_order_unselected.imageset/tab_order_unselected@3x.png diff --git a/suixinkan/Assets.xcassets/tab_profile_selected.imageset/Contents.json b/suixinkan/Assets.xcassets/TabBar/tab_profile_selected.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/tab_profile_selected.imageset/Contents.json rename to suixinkan/Assets.xcassets/TabBar/tab_profile_selected.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/tab_profile_selected.imageset/tab_profile_selected.png b/suixinkan/Assets.xcassets/TabBar/tab_profile_selected.imageset/tab_profile_selected.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_profile_selected.imageset/tab_profile_selected.png rename to suixinkan/Assets.xcassets/TabBar/tab_profile_selected.imageset/tab_profile_selected.png diff --git a/suixinkan/Assets.xcassets/tab_profile_selected.imageset/tab_profile_selected@2x.png b/suixinkan/Assets.xcassets/TabBar/tab_profile_selected.imageset/tab_profile_selected@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_profile_selected.imageset/tab_profile_selected@2x.png rename to suixinkan/Assets.xcassets/TabBar/tab_profile_selected.imageset/tab_profile_selected@2x.png diff --git a/suixinkan/Assets.xcassets/tab_profile_selected.imageset/tab_profile_selected@3x.png b/suixinkan/Assets.xcassets/TabBar/tab_profile_selected.imageset/tab_profile_selected@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_profile_selected.imageset/tab_profile_selected@3x.png rename to suixinkan/Assets.xcassets/TabBar/tab_profile_selected.imageset/tab_profile_selected@3x.png diff --git a/suixinkan/Assets.xcassets/tab_profile_unselected.imageset/Contents.json b/suixinkan/Assets.xcassets/TabBar/tab_profile_unselected.imageset/Contents.json similarity index 100% rename from suixinkan/Assets.xcassets/tab_profile_unselected.imageset/Contents.json rename to suixinkan/Assets.xcassets/TabBar/tab_profile_unselected.imageset/Contents.json diff --git a/suixinkan/Assets.xcassets/tab_profile_unselected.imageset/tab_profile_unselected.png b/suixinkan/Assets.xcassets/TabBar/tab_profile_unselected.imageset/tab_profile_unselected.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_profile_unselected.imageset/tab_profile_unselected.png rename to suixinkan/Assets.xcassets/TabBar/tab_profile_unselected.imageset/tab_profile_unselected.png diff --git a/suixinkan/Assets.xcassets/tab_profile_unselected.imageset/tab_profile_unselected@2x.png b/suixinkan/Assets.xcassets/TabBar/tab_profile_unselected.imageset/tab_profile_unselected@2x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_profile_unselected.imageset/tab_profile_unselected@2x.png rename to suixinkan/Assets.xcassets/TabBar/tab_profile_unselected.imageset/tab_profile_unselected@2x.png diff --git a/suixinkan/Assets.xcassets/tab_profile_unselected.imageset/tab_profile_unselected@3x.png b/suixinkan/Assets.xcassets/TabBar/tab_profile_unselected.imageset/tab_profile_unselected@3x.png similarity index 100% rename from suixinkan/Assets.xcassets/tab_profile_unselected.imageset/tab_profile_unselected@3x.png rename to suixinkan/Assets.xcassets/TabBar/tab_profile_unselected.imageset/tab_profile_unselected@3x.png diff --git a/suixinkan/Core/WeChat/WeChatManager.swift b/suixinkan/Core/WeChat/WeChatManager.swift new file mode 100644 index 0000000..d159c46 --- /dev/null +++ b/suixinkan/Core/WeChat/WeChatManager.swift @@ -0,0 +1,89 @@ +// +// WeChatManager.swift +// suixinkan +// + +import Foundation +import WechatOpenSDK + +/// 微信 SDK 生命周期与回调管理,负责注册、URL/Universal Link 回跳及分享结果分发。 +@MainActor +final class WeChatManager: NSObject { + static let shared = WeChatManager() + + /// 最近一次分享结果,便于调试或 UI 状态读取。 + private(set) var lastShareResult: WeChatShareResult? + + private var shareCompletion: ((WeChatShareResult) -> Void)? + private var isRegistered = false + + private override init() { + super.init() + } + + /// 向微信注册 AppID 与 Universal Link,应用启动时调用。 + func registerIfNeeded() { + guard !isRegistered else { return } + guard WeChatConfig.validateUniversalLink(WeChatConfig.universalLink) else { + assertionFailure("WeChat Universal Link must use https and end with /") + return + } + + isRegistered = WXApi.registerApp(WeChatConfig.appID, universalLink: WeChatConfig.universalLink) + } + + /// 处理 URL Scheme 回调。 + @discardableResult + func handleOpenURL(_ url: URL) -> Bool { + WXApi.handleOpen(url, delegate: self) + } + + /// 处理 Universal Link 回调。 + @discardableResult + func handleContinueUserActivity(_ userActivity: NSUserActivity) -> Bool { + WXApi.handleOpenUniversalLink(userActivity, delegate: self) + } + + /// 发送分享请求到微信。 + func sendShareRequest(_ request: SendMessageToWXReq, completion: ((WeChatShareResult) -> Void)? = nil) { + guard WXApi.isWXAppInstalled() else { + completion?(.notInstalled) + return + } + guard WXApi.isWXAppSupport() else { + completion?(.unsupported) + return + } + + if let completion { + shareCompletion = completion + } + + WXApi.send(request) { [weak self] success in + guard !success else { return } + Task { @MainActor in + self?.finishShare(with: .sendFailed(-1)) + } + } + } + + private func finishShare(with result: WeChatShareResult) { + lastShareResult = result + shareCompletion?(result) + shareCompletion = nil + } +} + +extension WeChatManager: WXApiDelegate { + nonisolated func onReq(_ req: BaseReq) { + // 分享模块暂不处理来自微信的主动请求。 + } + + nonisolated func onResp(_ resp: BaseResp) { + guard let shareResp = resp as? SendMessageToWXResp else { return } + let result = WeChatShareResult.fromWXErrorCode(shareResp.errCode) + Task { @MainActor in + WeChatManager.shared.finishShare(with: result) + } + } +} diff --git a/suixinkan/Core/WeChat/WeChatShareModels.swift b/suixinkan/Core/WeChat/WeChatShareModels.swift new file mode 100644 index 0000000..4f8a8de --- /dev/null +++ b/suixinkan/Core/WeChat/WeChatShareModels.swift @@ -0,0 +1,73 @@ +// +// WeChatShareModels.swift +// suixinkan +// + +import Foundation + +/// 微信分享目标场景。 +enum WeChatShareScene: Int, CaseIterable, Sendable { + /// 微信好友会话。 + case session = 0 + /// 朋友圈。 + case timeline = 1 + /// 微信收藏。 + case favorite = 2 + + /// 展示文案。 + var title: String { + switch self { + case .session: + return "微信好友" + case .timeline: + return "朋友圈" + case .favorite: + return "收藏" + } + } + + /// 映射到微信 SDK 的 `scene` 整数值。 + var wxSceneValue: Int32 { + Int32(rawValue) + } +} + +/// 微信分享请求结果。 +enum WeChatShareResult: Equatable, Sendable { + case success + case cancelled + case notInstalled + case unsupported + case invalidPayload(String) + case sendFailed(Int) + case unknown(Int) + + /// 根据微信 SDK 错误码转换为业务可识别的分享结果。 + static func fromWXErrorCode(_ code: Int32) -> WeChatShareResult { + switch code { + case 0: + return .success + case -2: + return .cancelled + default: + return .unknown(Int(code)) + } + } +} + +/// 网页分享载荷,供邀请等业务模块调用微信分享。 +struct WeChatWebPageSharePayload: Equatable, Sendable { + let title: String + let description: String + let url: String +} + +/// 文本分享载荷。 +struct WeChatTextSharePayload: Equatable, Sendable { + let text: String +} + +/// 图片分享载荷。 +struct WeChatImageSharePayload: Equatable, Sendable { + let imageData: Data +} diff --git a/suixinkan/Core/WeChat/WeChatShareService.swift b/suixinkan/Core/WeChat/WeChatShareService.swift new file mode 100644 index 0000000..e9ec199 --- /dev/null +++ b/suixinkan/Core/WeChat/WeChatShareService.swift @@ -0,0 +1,115 @@ +// +// WeChatShareService.swift +// suixinkan +// + +import UIKit +import WechatOpenSDK + +/// 微信分享服务,封装文本、网页和图片分享能力,不包含微信支付。 +enum WeChatShareService { + /// 当前设备是否已安装微信且支持 Open SDK。 + static var isWeChatAvailable: Bool { + WXApi.isWXAppInstalled() && WXApi.isWXAppSupport() + } + + /// 分享纯文本到微信。 + @MainActor + static func shareText( + _ payload: WeChatTextSharePayload, + scene: WeChatShareScene, + completion: ((WeChatShareResult) -> Void)? = nil + ) { + let trimmed = payload.text.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { + completion?(.invalidPayload("分享文本不能为空")) + return + } + + let request = SendMessageToWXReq() + request.bText = true + request.text = trimmed + request.scene = scene.wxSceneValue + WeChatManager.shared.sendShareRequest(request, completion: completion) + } + + /// 分享网页链接到微信。 + @MainActor + static func shareWebPage( + _ payload: WeChatWebPageSharePayload, + scene: WeChatShareScene, + thumbImage: UIImage? = nil, + completion: ((WeChatShareResult) -> Void)? = nil + ) { + let title = payload.title.trimmingCharacters(in: .whitespacesAndNewlines) + let url = payload.url.trimmingCharacters(in: .whitespacesAndNewlines) + guard !title.isEmpty else { + completion?(.invalidPayload("分享标题不能为空")) + return + } + guard !url.isEmpty else { + completion?(.invalidPayload("分享链接不能为空")) + return + } + + let webpageObject = WXWebpageObject() + webpageObject.webpageUrl = url + + let message = WXMediaMessage() + message.title = title + message.description = payload.description + message.mediaObject = webpageObject + if let thumbImage, let thumbData = WeChatThumbImageProcessor.makeThumbData(from: thumbImage) { + message.thumbData = thumbData + } + + let request = SendMessageToWXReq() + request.bText = false + request.message = message + request.scene = scene.wxSceneValue + WeChatManager.shared.sendShareRequest(request, completion: completion) + } + + /// 分享图片到微信。 + @MainActor + static func shareImage( + _ payload: WeChatImageSharePayload, + scene: WeChatShareScene, + thumbImage: UIImage? = nil, + completion: ((WeChatShareResult) -> Void)? = nil + ) { + guard !payload.imageData.isEmpty else { + completion?(.invalidPayload("分享图片不能为空")) + return + } + + let imageObject = WXImageObject() + imageObject.imageData = payload.imageData + + let message = WXMediaMessage() + message.mediaObject = imageObject + if let thumbImage, let thumbData = WeChatThumbImageProcessor.makeThumbData(from: thumbImage) { + message.thumbData = thumbData + } else if let image = UIImage(data: payload.imageData), + let thumbData = WeChatThumbImageProcessor.makeThumbData(from: image) { + message.thumbData = thumbData + } + + let request = SendMessageToWXReq() + request.bText = false + request.message = message + request.scene = scene.wxSceneValue + WeChatManager.shared.sendShareRequest(request, completion: completion) + } + + /// 读取 App 图标,用作微信分享缩略图兜底。 + static func defaultThumbImage() -> UIImage? { + guard let icons = Bundle.main.infoDictionary?["CFBundleIcons"] as? [String: Any], + let primary = icons["CFBundlePrimaryIcon"] as? [String: Any], + let iconFiles = primary["CFBundleIconFiles"] as? [String], + let iconName = iconFiles.last else { + return nil + } + return UIImage(named: iconName) + } +} diff --git a/suixinkan/Core/WeChat/WeChatThumbImageProcessor.swift b/suixinkan/Core/WeChat/WeChatThumbImageProcessor.swift new file mode 100644 index 0000000..a4c456b --- /dev/null +++ b/suixinkan/Core/WeChat/WeChatThumbImageProcessor.swift @@ -0,0 +1,47 @@ +// +// WeChatThumbImageProcessor.swift +// suixinkan +// + +import UIKit + +/// 微信分享缩略图处理器,将图片压缩到微信 32KB 限制内。 +enum WeChatThumbImageProcessor { + /// 微信缩略图最大字节数。 + static let maxThumbBytes = 32 * 1024 + + /// 将图片压缩为符合微信要求的缩略图数据。 + static func makeThumbData(from image: UIImage, maxBytes: Int = maxThumbBytes) -> Data? { + guard maxBytes > 0 else { return nil } + + let resized = resize(image, maxPixel: 120) + var quality: CGFloat = 0.82 + var data = resized.jpegData(compressionQuality: quality) + + while let current = data, current.count > maxBytes, quality > 0.12 { + quality -= 0.1 + data = resized.jpegData(compressionQuality: quality) + } + + guard let result = data, result.count <= maxBytes else { return nil } + return result + } + + /// 等比缩放图片,使最长边不超过指定像素。 + static func resize(_ image: UIImage, maxPixel: CGFloat) -> UIImage { + let sourceSize = image.size + guard sourceSize.width > 0, sourceSize.height > 0 else { return image } + + let maxSide = max(sourceSize.width, sourceSize.height) + guard maxSide > maxPixel else { return image } + + let scale = maxPixel / maxSide + let targetSize = CGSize(width: sourceSize.width * scale, height: sourceSize.height * scale) + let format = UIGraphicsImageRendererFormat.default() + format.scale = 1 + let renderer = UIGraphicsImageRenderer(size: targetSize, format: format) + return renderer.image { _ in + image.draw(in: CGRect(origin: .zero, size: targetSize)) + } + } +} diff --git a/suixinkan/Features/Auth/Models/AuthModels.swift b/suixinkan/Features/Auth/Models/AuthModels.swift index 54f909d..3d79d8f 100644 --- a/suixinkan/Features/Auth/Models/AuthModels.swift +++ b/suixinkan/Features/Auth/Models/AuthModels.swift @@ -218,9 +218,7 @@ struct V9ScenicUser: Decodable, Equatable { accountType: accountType.nonEmpty ?? Self.accountTypeValue, businessUserId: businessUserId, title: scenicName.nonEmpty ?? nickname.nonEmpty ?? realName.nonEmpty ?? "景区账号", - subtitle: [realName.nonEmpty, nickname.nonEmpty] - .compactMap(\.self) - .joined(separator: " · "), + subtitle: username, phone: phone, avatar: "", scenicName: scenicName, @@ -237,7 +235,8 @@ struct V9ScenicUser: Decodable, Equatable { case userId = "user_id" case scenicUserId = "scenic_user_id" case ssUserId = "ss_user_id" - case username + case username = "user_name" + case legacyUsername = "username" case realName = "real_name" case nickname case phone @@ -255,7 +254,9 @@ struct V9ScenicUser: Decodable, Equatable { userId = try container.decodeLossyInt(forKey: .userId) ?? 0 scenicUserId = try container.decodeLossyInt(forKey: .scenicUserId) ?? 0 ssUserId = try container.decodeLossyInt(forKey: .ssUserId) ?? 0 - username = try container.decodeLossyString(forKey: .username) + let preferredUsername = try container.decodeLossyString(forKey: .username) + let legacyUsername = try container.decodeLossyString(forKey: .legacyUsername) + username = preferredUsername.nonEmpty ?? legacyUsername realName = try container.decodeLossyString(forKey: .realName) nickname = try container.decodeLossyString(forKey: .nickname) phone = try container.decodeLossyString(forKey: .phone) @@ -301,9 +302,7 @@ struct V9StoreUser: Decodable, Equatable { accountType: accountType.nonEmpty ?? Self.accountTypeValue, businessUserId: businessUserId, title: storeName.nonEmpty ?? scenicName.nonEmpty ?? realName.nonEmpty ?? userName.nonEmpty ?? "门店账号", - subtitle: [scenicName.nonEmpty, realName.nonEmpty ?? userName.nonEmpty] - .compactMap(\.self) - .joined(separator: " · "), + subtitle: userName.nonEmpty ?? username, phone: phone, avatar: avatar, scenicName: scenicName, diff --git a/suixinkan/Features/Home/Services/HomeMenuCatalog.swift b/suixinkan/Features/Home/Services/HomeMenuCatalog.swift index eb0bfd6..cd68a14 100644 --- a/suixinkan/Features/Home/Services/HomeMenuCatalog.swift +++ b/suixinkan/Features/Home/Services/HomeMenuCatalog.swift @@ -28,6 +28,8 @@ enum HomeMenuCatalog { HomeMenuItem(uri: "pm_manager", title: "项目管理", iconName: "folder"), HomeMenuItem(uri: "location_report", title: "位置上报", iconName: "location"), HomeMenuItem(uri: "registration_invitation", title: "注册邀请", iconName: "person.badge.plus"), + HomeMenuItem(uri: "photographer_invite", title: "邀请摄影师", iconName: "person.badge.plus"), + HomeMenuItem(uri: "invite_record", title: "邀请记录", iconName: "calendar.badge.clock"), HomeMenuItem(uri: "store", title: "店铺管理", iconName: "building.2"), HomeMenuItem(uri: "fly", title: "飞行管理", iconName: "airplane"), HomeMenuItem(uri: "pilot_cert", title: "飞手认证", iconName: "person.text.rectangle"), diff --git a/suixinkan/Features/Home/Services/HomeRouteHandler.swift b/suixinkan/Features/Home/Services/HomeRouteHandler.swift index cb5095b..a3a2b59 100644 --- a/suixinkan/Features/Home/Services/HomeRouteHandler.swift +++ b/suixinkan/Features/Home/Services/HomeRouteHandler.swift @@ -50,10 +50,16 @@ enum HomeRouteHandler { viewController.navigationController?.pushViewController(CooperationOrderListViewController(), animated: true) case "location_report": viewController.navigationController?.pushViewController(LocationReportViewController(), animated: true) + case "registration_invitation", "photographer_invite": + viewController.navigationController?.pushViewController(PhotographerInviteViewController(), animated: true) + case "invite_record": + viewController.navigationController?.pushViewController(InviteRecordViewController(), animated: true) case "/scenic-queue": viewController.navigationController?.pushViewController(ScenicQueueViewController(), animated: true) case "task_management", "task_management_editor": viewController.navigationController?.pushViewController(TaskAddViewController(), animated: true) + case "wallet": + showDeveloping(from: viewController) default: showDeveloping(from: viewController) } diff --git a/suixinkan/Features/Invite/API/InviteAPI.swift b/suixinkan/Features/Invite/API/InviteAPI.swift new file mode 100644 index 0000000..01df399 --- /dev/null +++ b/suixinkan/Features/Invite/API/InviteAPI.swift @@ -0,0 +1,46 @@ +// +// InviteAPI.swift +// suixinkan +// + +import Foundation + +@MainActor +/// 邀请服务协议,抽象邀请信息与邀请用户列表接口。 +protocol InviteServing { + /// 获取邀请二维码、邀请码和规则信息。 + func inviteInfo() async throws -> InviteInfoResponse + + /// 获取邀请用户列表。 + func inviteUserList(page: Int, pageSize: Int) async throws -> [InviteUserItem] +} + +@MainActor +/// 邀请 API,封装摄影师注册邀请相关接口。 +final class InviteAPI: InviteServing { + private let client: APIClient + + /// 初始化邀请 API。 + init(client: APIClient) { + self.client = client + } + + /// 获取邀请二维码、邀请码和规则信息。 + func inviteInfo() async throws -> InviteInfoResponse { + try await client.send(APIRequest(method: .get, path: "/api/yf-handset-app/photog/invite-info")) + } + + /// 获取邀请用户列表。 + func inviteUserList(page: Int = 1, pageSize: Int = 20) async throws -> [InviteUserItem] { + try await client.send( + APIRequest( + method: .get, + path: "/api/yf-handset-app/photog/invite/user-list", + queryItems: [ + URLQueryItem(name: "page", value: String(max(page, 1))), + URLQueryItem(name: "page_size", value: String(max(pageSize, 1))), + ] + ) + ) + } +} diff --git a/suixinkan/Features/Invite/Models/InviteModels.swift b/suixinkan/Features/Invite/Models/InviteModels.swift new file mode 100644 index 0000000..3f69d09 --- /dev/null +++ b/suixinkan/Features/Invite/Models/InviteModels.swift @@ -0,0 +1,172 @@ +// +// InviteModels.swift +// suixinkan +// + +import Foundation + +/// 邀请信息响应实体,表示邀请码、邀请链接和规则文案。 +struct InviteInfoResponse: Decodable, Equatable { + let enableInvite: Bool + let inviteCode: String + let inviteUrl: String + let description: [String] + + enum CodingKeys: String, CodingKey { + case enableInvite = "enable_invite" + case inviteCode = "invite_code" + case inviteUrl = "invite_url" + case description + } + + /// 创建邀请信息响应实体。 + init(enableInvite: Bool, inviteCode: String, inviteUrl: String, description: [String]) { + self.enableInvite = enableInvite + self.inviteCode = inviteCode + self.inviteUrl = inviteUrl + self.description = description + } + + /// 宽松解码邀请信息,兼容后端字符串/数字/布尔混用。 + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + enableInvite = try container.decodeInviteLossyBool(forKey: .enableInvite) ?? true + inviteCode = try container.decodeInviteLossyString(forKey: .inviteCode) + inviteUrl = try container.decodeInviteLossyString(forKey: .inviteUrl) + description = (try? container.decodeIfPresent([String].self, forKey: .description)) ?? [] + } +} + +/// 邀请用户实体,表示邀请记录里的摄影师。 +struct InviteUserItem: Decodable, Hashable { + let id: Int + let realName: String + let phone: String + let avatar: String + let createdAt: String + let inviteLevel: Int + + enum CodingKeys: String, CodingKey { + case id + case realName = "real_name" + case phone + case avatar + case createdAt = "created_at" + case inviteLevel = "invite_level" + } + + /// 创建邀请用户实体。 + init(id: Int, realName: String, phone: String, avatar: String, createdAt: String, inviteLevel: Int) { + self.id = id + self.realName = realName + self.phone = phone + self.avatar = avatar + self.createdAt = createdAt + self.inviteLevel = inviteLevel + } + + /// 宽松解码邀请用户字段。 + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + id = try container.decodeInviteLossyInt(forKey: .id) ?? 0 + realName = try container.decodeInviteLossyString(forKey: .realName) + phone = try container.decodeInviteLossyString(forKey: .phone) + avatar = try container.decodeInviteLossyString(forKey: .avatar) + createdAt = try container.decodeInviteLossyString(forKey: .createdAt) + inviteLevel = try container.decodeInviteLossyInt(forKey: .inviteLevel) ?? 1 + } +} + +/// 邀请记录分段类型。 +enum InviteRecordTab: Int, CaseIterable, Equatable { + case invite = 0 + case reward = 1 + + /// 分段标题。 + var title: String { + switch self { + case .invite: + return "邀请记录" + case .reward: + return "奖励记录" + } + } +} + +/// 邀请记录行展示实体。 +struct InviteDisplayRow: Hashable { + let id: String + let title: String + let phone: String + let avatar: String + let time: String + let inviteLevel: Int + + /// 邀请层级文案。 + var levelText: String { + inviteLevel == 1 ? "一级" : "二级" + } + + /// 邀请层级是否为一级。 + var isPrimaryLevel: Bool { + inviteLevel == 1 + } + + /// 头像缺省显示文字。 + var avatarPlaceholder: String { + if let first = title.first { + return String(first) + } + if let first = phone.first { + return String(first) + } + return "?" + } +} + +private extension KeyedDecodingContainer { + func decodeInviteLossyString(forKey key: Key) throws -> String { + if let value = try? decodeIfPresent(String.self, forKey: key) { + return value + } + if let value = try? decodeIfPresent(Int.self, forKey: key) { + return String(value) + } + if let value = try? decodeIfPresent(Double.self, forKey: key) { + return String(value) + } + if let value = try? decodeIfPresent(Bool.self, forKey: key) { + return value ? "1" : "0" + } + return "" + } + + func decodeInviteLossyInt(forKey key: Key) throws -> Int? { + if let value = try? decodeIfPresent(Int.self, forKey: key) { + return value + } + if let value = try? decodeIfPresent(Double.self, forKey: key) { + return Int(value) + } + if let value = try? decodeIfPresent(String.self, forKey: key) { + let text = value.trimmingCharacters(in: .whitespacesAndNewlines) + return Int(text) ?? Double(text).map(Int.init) + } + return nil + } + + func decodeInviteLossyBool(forKey key: Key) throws -> Bool? { + if let value = try? decodeIfPresent(Bool.self, forKey: key) { + return value + } + if let value = try? decodeIfPresent(Int.self, forKey: key) { + return value != 0 + } + if let value = try? decodeIfPresent(String.self, forKey: key) { + let text = value.trimmingCharacters(in: .whitespacesAndNewlines).lowercased() + if ["1", "true", "yes"].contains(text) { return true } + if ["0", "false", "no"].contains(text) { return false } + } + return nil + } +} diff --git a/suixinkan/Features/Invite/ViewModels/InviteViewModels.swift b/suixinkan/Features/Invite/ViewModels/InviteViewModels.swift new file mode 100644 index 0000000..3ea94bb --- /dev/null +++ b/suixinkan/Features/Invite/ViewModels/InviteViewModels.swift @@ -0,0 +1,218 @@ +// +// InviteViewModels.swift +// suixinkan +// + +import Foundation +import UIKit + +/// 邀请页 ViewModel,负责加载邀请信息、生成二维码和暴露复制内容。 +final class PhotographerInviteViewModel { + private(set) var isLoading = false + private(set) var inviteCode = "" + private(set) var inviteUrl = "" + private(set) var rules: [String] = [] + private(set) var qrImage: UIImage? + private(set) var errorMessage: String? + + var onStateChange: (() -> Void)? + + /// 重新加载邀请信息。 + func reload(api: any InviteServing) async { + isLoading = true + errorMessage = nil + notifyStateChange() + + do { + let response = try await api.inviteInfo() + inviteCode = response.inviteCode + inviteUrl = response.inviteUrl + rules = response.description + qrImage = QRCodeGenerator.generateStyledQRCode( + content: response.inviteUrl, + pixelSize: 560, + backgroundColor: .white, + cornerRadius: 0 + ) + } catch { + clear() + errorMessage = error.localizedDescription + } + + isLoading = false + notifyStateChange() + } + + /// 返回待复制的邀请码。 + func inviteCodeForCopy() -> String { + inviteCode + } + + /// 返回待复制的邀请链接。 + func inviteUrlForCopy() -> String { + inviteUrl + } + + private func clear() { + inviteCode = "" + inviteUrl = "" + rules = [] + qrImage = nil + } + + private func notifyStateChange() { + onStateChange?() + } +} + +/// 邀请记录 ViewModel,负责邀请用户、奖励流水和钱包汇总分页。 +final class InviteRecordViewModel { + private(set) var selectedTab: InviteRecordTab = .invite + private(set) var totalRewardText = "0.00" + private(set) var withdrawableText = "0.00" + private(set) var inviteRows: [InviteDisplayRow] = [] + private(set) var rewardRows: [WalletTransactionItem] = [] + private(set) var isInviteRefreshing = false + private(set) var isRewardRefreshing = false + private(set) var canLoadMoreInvite = false + private(set) var canLoadMoreReward = false + private(set) var errorMessage: String? + + var onStateChange: (() -> Void)? + + private var invitePage = 1 + private let invitePageSize = 20 + private var rewardPage = 1 + private let rewardPageSize = 10 + private var isLoadingInvite = false + private var isLoadingReward = false + + /// 初次加载邀请记录和钱包汇总。 + func loadInitial(inviteAPI: any InviteServing, walletAPI: any WalletServing) async { + await refreshInvite(inviteAPI: inviteAPI, walletAPI: walletAPI) + } + + /// 切换分段并在需要时加载奖励记录。 + func selectTab(_ tab: InviteRecordTab, inviteAPI: any InviteServing, walletAPI: any WalletServing) async { + guard tab != selectedTab else { return } + selectedTab = tab + notifyStateChange() + if tab == .reward, rewardRows.isEmpty { + await refreshReward(walletAPI: walletAPI) + } + } + + /// 刷新邀请记录和钱包汇总。 + func refreshInvite(inviteAPI: any InviteServing, walletAPI: any WalletServing) async { + await loadSummary(walletAPI: walletAPI) + await loadInviteRows(inviteAPI: inviteAPI, refresh: true) + } + + /// 加载下一页邀请记录。 + func loadMoreInvite(inviteAPI: any InviteServing) async { + guard canLoadMoreInvite, !isInviteRefreshing else { return } + await loadInviteRows(inviteAPI: inviteAPI, refresh: false) + } + + /// 刷新奖励记录和钱包汇总。 + func refreshReward(walletAPI: any WalletServing) async { + await loadSummary(walletAPI: walletAPI) + await loadRewardRows(walletAPI: walletAPI, refresh: true) + } + + /// 加载下一页奖励记录。 + func loadMoreReward(walletAPI: any WalletServing) async { + guard canLoadMoreReward, !isRewardRefreshing else { return } + await loadRewardRows(walletAPI: walletAPI, refresh: false) + } + + private func loadSummary(walletAPI: any WalletServing) async { + do { + let summary = try await walletAPI.walletSummary(type: 2) + totalRewardText = summary.amountTotal.isEmpty ? "0.00" : summary.amountTotal + withdrawableText = summary.amountWithdrawable.isEmpty ? "0.00" : summary.amountWithdrawable + } catch { + errorMessage = error.localizedDescription + } + notifyStateChange() + } + + private func loadInviteRows(inviteAPI: any InviteServing, refresh: Bool) async { + if isLoadingInvite && !refresh { return } + if refresh { invitePage = 1 } + isLoadingInvite = true + isInviteRefreshing = refresh + errorMessage = nil + notifyStateChange() + + do { + let users = try await inviteAPI.inviteUserList(page: invitePage, pageSize: invitePageSize) + let mapped = users.map { user in + InviteDisplayRow( + id: "invite_\(user.id)", + title: user.realName.isEmpty ? "**\(user.phone.suffix(4))" : user.realName, + phone: user.phone, + avatar: user.avatar, + time: user.createdAt, + inviteLevel: user.inviteLevel + ) + } + inviteRows = refresh ? mapped : inviteRows + mapped + invitePage += 1 + canLoadMoreInvite = users.count >= invitePageSize + } catch { + if refresh { + inviteRows = [] + canLoadMoreInvite = false + } + errorMessage = error.localizedDescription + } + + isLoadingInvite = false + isInviteRefreshing = false + notifyStateChange() + } + + private func loadRewardRows(walletAPI: any WalletServing, refresh: Bool) async { + if isLoadingReward && !refresh { return } + if refresh { rewardPage = 1 } + isLoadingReward = true + isRewardRefreshing = refresh + errorMessage = nil + notifyStateChange() + + do { + let response = try await walletAPI.walletTransactionList( + startDate: "2025-01-01", + endDate: Self.dayFormatter.string(from: Date()), + page: rewardPage, + pageSize: rewardPageSize, + type: 2 + ) + rewardRows = refresh ? response.list : rewardRows + response.list + rewardPage += 1 + canLoadMoreReward = response.list.count >= rewardPageSize && rewardRows.count < response.total + } catch { + if refresh { + rewardRows = [] + canLoadMoreReward = false + } + errorMessage = error.localizedDescription + } + + isLoadingReward = false + isRewardRefreshing = false + notifyStateChange() + } + + private func notifyStateChange() { + onStateChange?() + } + + private static let dayFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.locale = Locale(identifier: "zh_CN") + formatter.dateFormat = "yyyy-MM-dd" + return formatter + }() +} diff --git a/suixinkan/Features/Wallet/API/WalletAPI.swift b/suixinkan/Features/Wallet/API/WalletAPI.swift new file mode 100644 index 0000000..d153bfa --- /dev/null +++ b/suixinkan/Features/Wallet/API/WalletAPI.swift @@ -0,0 +1,67 @@ +// +// WalletAPI.swift +// suixinkan +// + +import Foundation + +@MainActor +/// 钱包服务协议,提供邀请奖励记录所需的汇总与流水接口。 +protocol WalletServing { + /// 获取钱包汇总金额,`type = 2` 表示邀请奖励。 + func walletSummary(type: Int) async throws -> WalletSummaryResponse + + /// 获取钱包流水列表。 + func walletTransactionList( + startDate: String, + endDate: String, + page: Int, + pageSize: Int, + type: Int + ) async throws -> WalletTransactionListResponse +} + +@MainActor +/// 钱包 API,封装邀请奖励记录所需的最小接口集合。 +final class WalletAPI: WalletServing { + private let client: APIClient + + /// 初始化钱包 API。 + init(client: APIClient) { + self.client = client + } + + /// 获取钱包汇总金额。 + func walletSummary(type: Int = 0) async throws -> WalletSummaryResponse { + try await client.send( + APIRequest( + method: .get, + path: "/api/yf-handset-app/photog/wallet/summary", + queryItems: [URLQueryItem(name: "type", value: String(type))] + ) + ) + } + + /// 获取钱包流水列表。 + func walletTransactionList( + startDate: String, + endDate: String, + page: Int = 1, + pageSize: Int = 10, + type: Int = 2 + ) async throws -> WalletTransactionListResponse { + try await client.send( + APIRequest( + method: .get, + path: "/api/yf-handset-app/photog/wallet/transaction-list", + queryItems: [ + URLQueryItem(name: "start_date", value: startDate), + URLQueryItem(name: "end_date", value: endDate), + URLQueryItem(name: "page", value: String(max(page, 1))), + URLQueryItem(name: "page_size", value: String(max(pageSize, 1))), + URLQueryItem(name: "type", value: String(type)), + ] + ) + ) + } +} diff --git a/suixinkan/Features/Wallet/Models/WalletModels.swift b/suixinkan/Features/Wallet/Models/WalletModels.swift new file mode 100644 index 0000000..1f683a6 --- /dev/null +++ b/suixinkan/Features/Wallet/Models/WalletModels.swift @@ -0,0 +1,127 @@ +// +// WalletModels.swift +// suixinkan +// + +import Foundation + +/// 钱包汇总响应,用于展示累计金额、当前余额和可提现金额。 +struct WalletSummaryResponse: Decodable, Equatable { + let amountTotal: String + let amountCurrentBalance: String + let amountWithdrawable: String + + enum CodingKeys: String, CodingKey { + case amountTotal = "amount_total" + case amountCurrentBalance = "amount_current_balance" + case amountWithdrawable = "amount_withdrawable" + } + + /// 创建钱包汇总响应。 + init(amountTotal: String = "", amountCurrentBalance: String = "", amountWithdrawable: String = "") { + self.amountTotal = amountTotal + self.amountCurrentBalance = amountCurrentBalance + self.amountWithdrawable = amountWithdrawable + } + + /// 宽松解码钱包汇总金额字段。 + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + amountTotal = try container.decodeWalletLossyString(forKey: .amountTotal) + amountCurrentBalance = try container.decodeWalletLossyString(forKey: .amountCurrentBalance) + amountWithdrawable = try container.decodeWalletLossyString(forKey: .amountWithdrawable) + } +} + +/// 钱包流水列表响应,用于邀请奖励记录。 +struct WalletTransactionListResponse: Decodable, Equatable { + let total: Int + let list: [WalletTransactionItem] + + /// 创建钱包流水列表响应。 + init(total: Int = 0, list: [WalletTransactionItem] = []) { + self.total = total + self.list = list + } +} + +/// 钱包流水实体,表示一条收入或提现相关记录。 +struct WalletTransactionItem: Decodable, Hashable { + let id: Int + let amount: String + let transactionType: Int + let transactionTypeLabel: String + let createdAt: String + let orderNumberSuffix: String + let withdrawLabel: String + + enum CodingKeys: String, CodingKey { + case id + case amount + case transactionType = "transaction_type" + case transactionTypeLabel = "transaction_type_label" + case createdAt = "created_at" + case orderNumberSuffix = "order_number_suffix" + case withdrawLabel = "withdraw_label" + } + + /// 创建钱包流水实体。 + init( + id: Int, + amount: String, + transactionType: Int = 0, + transactionTypeLabel: String = "", + createdAt: String, + orderNumberSuffix: String = "", + withdrawLabel: String = "" + ) { + self.id = id + self.amount = amount + self.transactionType = transactionType + self.transactionTypeLabel = transactionTypeLabel + self.createdAt = createdAt + self.orderNumberSuffix = orderNumberSuffix + self.withdrawLabel = withdrawLabel + } + + /// 宽松解码钱包流水字段。 + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + id = try container.decodeWalletLossyInt(forKey: .id) ?? 0 + amount = try container.decodeWalletLossyString(forKey: .amount) + transactionType = try container.decodeWalletLossyInt(forKey: .transactionType) ?? 0 + transactionTypeLabel = try container.decodeWalletLossyString(forKey: .transactionTypeLabel) + createdAt = try container.decodeWalletLossyString(forKey: .createdAt) + orderNumberSuffix = try container.decodeWalletLossyString(forKey: .orderNumberSuffix) + withdrawLabel = try container.decodeWalletLossyString(forKey: .withdrawLabel) + } +} + +private extension KeyedDecodingContainer { + func decodeWalletLossyString(forKey key: Key) throws -> String { + if let value = try? decodeIfPresent(String.self, forKey: key) { + return value + } + if let value = try? decodeIfPresent(Int.self, forKey: key) { + return String(value) + } + if let value = try? decodeIfPresent(Double.self, forKey: key) { + return String(value) + } + return "" + } + + func decodeWalletLossyInt(forKey key: Key) throws -> Int? { + if let value = try? decodeIfPresent(Int.self, forKey: key) { + return value + } + if let value = try? decodeIfPresent(Double.self, forKey: key) { + return Int(value) + } + if let value = try? decodeIfPresent(String.self, forKey: key) { + let text = value.trimmingCharacters(in: .whitespacesAndNewlines) + return Int(text) ?? Double(text).map(Int.init) + } + return nil + } +} diff --git a/suixinkan/Info.plist b/suixinkan/Info.plist index 543cae6..3f1a3dc 100644 --- a/suixinkan/Info.plist +++ b/suixinkan/Info.plist @@ -4,6 +4,25 @@ CFBundleDisplayName 随心瞰商家版 + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + weixin + CFBundleURLSchemes + + wxdd80ec12c4fee322 + + + + LSApplicationQueriesSchemes + + weixin + weixinULAPI + weixinURLParamsAPI + NSCameraUsageDescription 需要访问相机以扫描订单核销二维码 NSLocationWhenInUseUsageDescription diff --git a/suixinkan/SceneDelegate.swift b/suixinkan/SceneDelegate.swift index 1499d2d..70a8cf0 100644 --- a/suixinkan/SceneDelegate.swift +++ b/suixinkan/SceneDelegate.swift @@ -34,6 +34,15 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { } } + func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { + guard let url = URLContexts.first?.url else { return } + _ = WeChatManager.shared.handleOpenURL(url) + } + + func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { + _ = WeChatManager.shared.handleContinueUserActivity(userActivity) + } + private func registerNotifications() { NotificationCenter.default.addObserver( self, diff --git a/suixinkan/UI/Invite/InviteRecordViewController.swift b/suixinkan/UI/Invite/InviteRecordViewController.swift new file mode 100644 index 0000000..7dafcd6 --- /dev/null +++ b/suixinkan/UI/Invite/InviteRecordViewController.swift @@ -0,0 +1,542 @@ +// +// InviteRecordViewController.swift +// suixinkan +// + +import SnapKit +import UIKit + +/// 邀请记录页面,展示邀请用户列表、奖励流水和钱包汇总金额。 +final class InviteRecordViewController: BaseViewController { + private enum Section: Hashable { + case main + } + + private enum Item: Hashable { + case invite(InviteDisplayRow) + case reward(WalletTransactionItem) + case footer(String) + } + + private let viewModel = InviteRecordViewModel() + private let inviteAPI: InviteServing + private let walletAPI: WalletServing + + private let headerView = UIView() + private let totalAmountLabel = UILabel() + private let withdrawableAmountLabel = UILabel() + private let contentCard = UIView() + private let tabStack = UIStackView() + private let inviteTabButton = InviteRecordTabButton(title: "邀请记录") + private let rewardTabButton = InviteRecordTabButton(title: "奖励记录") + private let tableView = UITableView(frame: .zero, style: .plain) + private let emptyLabel = UILabel() + private let bottomBar = UIView() + private let walletButton = UIButton(type: .system) + + private var dataSource: UITableViewDiffableDataSource! + + /// 初始化邀请记录页面。 + init( + inviteAPI: InviteServing = NetworkServices.shared.inviteAPI, + walletAPI: WalletServing = NetworkServices.shared.walletAPI + ) { + self.inviteAPI = inviteAPI + self.walletAPI = walletAPI + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func setupNavigationBar() { + title = "邀请记录" + } + + override func setupUI() { + view.backgroundColor = UIColor(hex: 0xF5F6F8) + setupHeader() + setupContentCard() + setupBottomBar() + dataSource = makeDataSource() + } + + override func setupConstraints() { + headerView.snp.makeConstraints { make in + make.top.leading.trailing.equalTo(view.safeAreaLayoutGuide) + make.height.equalTo(104) + } + bottomBar.snp.makeConstraints { make in + make.leading.trailing.bottom.equalToSuperview() + } + contentCard.snp.makeConstraints { make in + make.top.equalTo(headerView.snp.bottom).offset(16) + make.leading.trailing.equalTo(view.safeAreaLayoutGuide).inset(16) + make.bottom.equalTo(bottomBar.snp.top).offset(-16) + } + } + + override func bindActions() { + inviteTabButton.addTarget(self, action: #selector(inviteTabTapped), for: .touchUpInside) + rewardTabButton.addTarget(self, action: #selector(rewardTabTapped), for: .touchUpInside) + walletButton.addTarget(self, action: #selector(walletTapped), for: .touchUpInside) + tableView.refreshControl?.addTarget(self, action: #selector(refreshPulled), for: .valueChanged) + viewModel.onStateChange = { [weak self] in + Task { @MainActor in + self?.applyViewModel(animated: true) + } + } + } + + override func viewDidLoad() { + super.viewDidLoad() + Task { await viewModel.loadInitial(inviteAPI: inviteAPI, walletAPI: walletAPI) } + } + + private func setupHeader() { + headerView.backgroundColor = AppColor.primary + view.addSubview(headerView) + + let divider = UIView() + divider.backgroundColor = UIColor.white.withAlphaComponent(0.8) + + let totalMetric = makeMetricView(title: "累计奖励金额", valueLabel: totalAmountLabel) + let withdrawMetric = makeMetricView(title: "可提现金额", valueLabel: withdrawableAmountLabel) + + headerView.addSubview(totalMetric) + headerView.addSubview(divider) + headerView.addSubview(withdrawMetric) + totalMetric.snp.makeConstraints { make in + make.leading.top.bottom.equalToSuperview() + make.trailing.equalTo(divider.snp.leading) + make.width.equalTo(withdrawMetric) + } + divider.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.centerY.equalToSuperview() + make.width.equalTo(1) + make.height.equalTo(56) + } + withdrawMetric.snp.makeConstraints { make in + make.leading.equalTo(divider.snp.trailing) + make.trailing.top.bottom.equalToSuperview() + } + } + + private func setupContentCard() { + contentCard.backgroundColor = .white + contentCard.layer.cornerRadius = 12 + contentCard.clipsToBounds = true + view.addSubview(contentCard) + + tabStack.axis = .horizontal + tabStack.distribution = .fillEqually + tabStack.addArrangedSubview(inviteTabButton) + tabStack.addArrangedSubview(rewardTabButton) + contentCard.addSubview(tabStack) + + tableView.backgroundColor = .white + tableView.separatorStyle = .none + tableView.delegate = self + tableView.rowHeight = UITableView.automaticDimension + tableView.estimatedRowHeight = 72 + tableView.refreshControl = UIRefreshControl() + tableView.register(InviteUserCell.self, forCellReuseIdentifier: InviteUserCell.reuseIdentifier) + tableView.register(InviteRewardCell.self, forCellReuseIdentifier: InviteRewardCell.reuseIdentifier) + tableView.register(InviteFooterCell.self, forCellReuseIdentifier: InviteFooterCell.reuseIdentifier) + contentCard.addSubview(tableView) + + emptyLabel.textColor = AppColor.textSecondary + emptyLabel.font = .app(.body) + emptyLabel.textAlignment = .center + emptyLabel.isHidden = true + contentCard.addSubview(emptyLabel) + + tabStack.snp.makeConstraints { make in + make.top.leading.trailing.equalToSuperview().inset(16) + make.height.equalTo(44) + } + tableView.snp.makeConstraints { make in + make.top.equalTo(tabStack.snp.bottom).offset(8) + make.leading.trailing.bottom.equalToSuperview().inset(16) + } + emptyLabel.snp.makeConstraints { make in + make.center.equalTo(tableView) + } + } + + private func setupBottomBar() { + bottomBar.backgroundColor = .white + view.addSubview(bottomBar) + + walletButton.backgroundColor = AppColor.primary + walletButton.layer.cornerRadius = 12 + walletButton.setTitle("去钱包提现", for: .normal) + walletButton.setTitleColor(.white, for: .normal) + walletButton.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) + bottomBar.addSubview(walletButton) + + walletButton.snp.makeConstraints { make in + make.top.equalToSuperview().offset(16) + make.leading.trailing.equalTo(bottomBar.safeAreaLayoutGuide).inset(16) + make.height.equalTo(48) + make.bottom.equalTo(bottomBar.safeAreaLayoutGuide).inset(22) + } + } + + private func makeMetricView(title: String, valueLabel: UILabel) -> UIView { + let titleLabel = UILabel() + titleLabel.text = title + titleLabel.font = .app(.body) + titleLabel.textColor = UIColor.white.withAlphaComponent(0.8) + titleLabel.textAlignment = .center + + valueLabel.font = .systemFont(ofSize: 24, weight: .medium) + valueLabel.textColor = .white + valueLabel.textAlignment = .center + valueLabel.adjustsFontSizeToFitWidth = true + valueLabel.minimumScaleFactor = 0.7 + + let stack = UIStackView(arrangedSubviews: [titleLabel, valueLabel]) + stack.axis = .vertical + stack.alignment = .fill + stack.spacing = 4 + + let container = UIView() + container.addSubview(stack) + stack.snp.makeConstraints { make in + make.center.equalToSuperview() + make.leading.trailing.equalToSuperview().inset(12) + } + return container + } + + private func makeDataSource() -> UITableViewDiffableDataSource { + UITableViewDiffableDataSource(tableView: tableView) { tableView, indexPath, item in + switch item { + case .invite(let row): + let cell = tableView.dequeueReusableCell(withIdentifier: InviteUserCell.reuseIdentifier, for: indexPath) as! InviteUserCell + cell.apply(row) + return cell + case .reward(let row): + let cell = tableView.dequeueReusableCell(withIdentifier: InviteRewardCell.reuseIdentifier, for: indexPath) as! InviteRewardCell + cell.apply(row) + return cell + case .footer(let text): + let cell = tableView.dequeueReusableCell(withIdentifier: InviteFooterCell.reuseIdentifier, for: indexPath) as! InviteFooterCell + cell.apply(text: text) + return cell + } + } + } + + @MainActor + private func applyViewModel(animated: Bool) { + totalAmountLabel.text = "¥ \(viewModel.totalRewardText)" + withdrawableAmountLabel.text = "¥ \(viewModel.withdrawableText)" + inviteTabButton.isSelected = viewModel.selectedTab == .invite + rewardTabButton.isSelected = viewModel.selectedTab == .reward + + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections([.main]) + switch viewModel.selectedTab { + case .invite: + snapshot.appendItems([.footer("已邀请摄影师")], toSection: .main) + snapshot.appendItems(viewModel.inviteRows.map(Item.invite), toSection: .main) + if !viewModel.inviteRows.isEmpty { + snapshot.appendItems([.footer(viewModel.canLoadMoreInvite ? "加载中..." : "没有更多")], toSection: .main) + } + emptyLabel.text = "暂无邀请记录" + emptyLabel.isHidden = !viewModel.inviteRows.isEmpty || viewModel.isInviteRefreshing + case .reward: + snapshot.appendItems([.footer("奖励记录")], toSection: .main) + snapshot.appendItems(viewModel.rewardRows.map(Item.reward), toSection: .main) + if !viewModel.rewardRows.isEmpty { + snapshot.appendItems([.footer(viewModel.canLoadMoreReward ? "加载中..." : "没有更多")], toSection: .main) + } + emptyLabel.text = "暂无数据" + emptyLabel.isHidden = !viewModel.rewardRows.isEmpty || viewModel.isRewardRefreshing + } + dataSource.apply(snapshot, animatingDifferences: animated) + tableView.refreshControl?.endRefreshing() + + if let message = viewModel.errorMessage { + showToast(message) + } + } + + @objc private func inviteTabTapped() { + Task { await viewModel.selectTab(.invite, inviteAPI: inviteAPI, walletAPI: walletAPI) } + } + + @objc private func rewardTabTapped() { + Task { await viewModel.selectTab(.reward, inviteAPI: inviteAPI, walletAPI: walletAPI) } + } + + @objc private func refreshPulled() { + Task { + switch viewModel.selectedTab { + case .invite: + await viewModel.refreshInvite(inviteAPI: inviteAPI, walletAPI: walletAPI) + case .reward: + await viewModel.refreshReward(walletAPI: walletAPI) + } + } + } + + @objc private func walletTapped() { + HomeRouteHandler.open(uri: "wallet", from: self, storeItem: nil) + } + + private func loadMoreIfNeeded() { + Task { + switch viewModel.selectedTab { + case .invite: + await viewModel.loadMoreInvite(inviteAPI: inviteAPI) + case .reward: + await viewModel.loadMoreReward(walletAPI: walletAPI) + } + } + } +} + +extension InviteRecordViewController: UITableViewDelegate { + func scrollViewDidScroll(_ scrollView: UIScrollView) { + let distanceToBottom = scrollView.contentSize.height - scrollView.bounds.height - scrollView.contentOffset.y + guard distanceToBottom < 160, scrollView.contentSize.height > scrollView.bounds.height else { return } + loadMoreIfNeeded() + } +} + +/// 邀请记录 Tab 按钮。 +private final class InviteRecordTabButton: UIButton { + override var isSelected: Bool { + didSet { + setTitleColor(isSelected ? AppColor.primary : UIColor(hex: 0xB6BECA), for: .normal) + titleLabel?.font = .systemFont(ofSize: 16, weight: isSelected ? .medium : .regular) + } + } + + /// 初始化 Tab 按钮。 + init(title: String) { + super.init(frame: .zero) + setTitle(title, for: .normal) + setTitleColor(UIColor(hex: 0xB6BECA), for: .normal) + titleLabel?.font = .systemFont(ofSize: 16) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +/// 邀请用户列表单元格。 +private final class InviteUserCell: UITableViewCell { + static let reuseIdentifier = "InviteUserCell" + + private let avatarImageView = UIImageView() + private let avatarLabel = UILabel() + private let nameLabel = UILabel() + private let levelLabel = UILabel() + private let phoneLabel = UILabel() + private let timeLabel = UILabel() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + selectionStyle = .none + setupUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + /// 应用邀请用户行数据。 + func apply(_ row: InviteDisplayRow) { + avatarLabel.text = row.avatarPlaceholder + avatarImageView.loadRemoteImage(urlString: row.avatar, placeholderColor: UIColor(hex: 0xE0F2FF)) + avatarLabel.isHidden = !row.avatar.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty + nameLabel.text = row.title + phoneLabel.text = row.phone + timeLabel.text = row.time + levelLabel.text = row.levelText + levelLabel.textColor = row.isPrimaryLevel ? UIColor(hex: 0x22C55E) : AppColor.warning + levelLabel.backgroundColor = row.isPrimaryLevel ? AppColor.successBackground : AppColor.warningBackground + } + + private func setupUI() { + let divider = UIView() + divider.backgroundColor = UIColor(hex: 0xF3F4F6) + contentView.addSubview(divider) + + avatarImageView.layer.cornerRadius = 24 + avatarImageView.clipsToBounds = true + avatarImageView.contentMode = .scaleAspectFill + contentView.addSubview(avatarImageView) + + avatarLabel.font = .systemFont(ofSize: 18, weight: .medium) + avatarLabel.textColor = AppColor.primary + avatarLabel.textAlignment = .center + avatarImageView.addSubview(avatarLabel) + + nameLabel.font = .systemFont(ofSize: 16, weight: .medium) + nameLabel.textColor = .black + levelLabel.font = .app(.caption) + levelLabel.textAlignment = .center + levelLabel.layer.cornerRadius = 4 + levelLabel.clipsToBounds = true + + let nameRow = UIStackView(arrangedSubviews: [nameLabel, levelLabel]) + nameRow.axis = .horizontal + nameRow.alignment = .center + nameRow.spacing = 4 + + phoneLabel.font = .app(.body) + phoneLabel.textColor = UIColor(hex: 0x7B8EAA) + timeLabel.font = .app(.body) + timeLabel.textColor = UIColor(hex: 0xB6BECA) + timeLabel.textAlignment = .right + let infoRow = UIStackView(arrangedSubviews: [phoneLabel, timeLabel]) + infoRow.axis = .horizontal + infoRow.spacing = 8 + infoRow.distribution = .fillEqually + + let textStack = UIStackView(arrangedSubviews: [nameRow, infoRow]) + textStack.axis = .vertical + textStack.spacing = 4 + contentView.addSubview(textStack) + + divider.snp.makeConstraints { make in + make.top.leading.trailing.equalToSuperview() + make.height.equalTo(1) + } + avatarImageView.snp.makeConstraints { make in + make.leading.equalToSuperview() + make.top.equalToSuperview().offset(13) + make.size.equalTo(48) + make.bottom.lessThanOrEqualToSuperview().inset(13) + } + avatarLabel.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + levelLabel.snp.makeConstraints { make in + make.width.greaterThanOrEqualTo(40) + make.height.equalTo(20) + } + textStack.snp.makeConstraints { make in + make.leading.equalTo(avatarImageView.snp.trailing).offset(12) + make.trailing.equalToSuperview() + make.centerY.equalTo(avatarImageView) + make.top.greaterThanOrEqualToSuperview().offset(12) + make.bottom.lessThanOrEqualToSuperview().inset(12) + } + } +} + +/// 奖励流水列表单元格。 +private final class InviteRewardCell: UITableViewCell { + static let reuseIdentifier = "InviteRewardCell" + + private let amountLabel = UILabel() + private let timeLabel = UILabel() + private let statusLabel = UILabel() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + selectionStyle = .none + setupUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + /// 应用奖励流水数据。 + func apply(_ item: WalletTransactionItem) { + amountLabel.text = "¥ \(item.amount)" + timeLabel.text = item.createdAt + let label = item.withdrawLabel.isEmpty ? "--" : item.withdrawLabel + statusLabel.text = label + let isWithdrawable = label == "可提现" + statusLabel.textColor = isWithdrawable ? UIColor(hex: 0x22C55E) : UIColor(hex: 0x7B8EAA) + statusLabel.backgroundColor = isWithdrawable ? AppColor.successBackground : UIColor(hex: 0xF4F4F4) + } + + private func setupUI() { + let divider = UIView() + divider.backgroundColor = UIColor(hex: 0xF3F4F6) + contentView.addSubview(divider) + + amountLabel.font = .systemFont(ofSize: 16, weight: .medium) + amountLabel.textColor = .black + timeLabel.font = .app(.body) + timeLabel.textColor = UIColor(hex: 0x7B8EAA) + let textStack = UIStackView(arrangedSubviews: [amountLabel, timeLabel]) + textStack.axis = .vertical + textStack.spacing = 4 + contentView.addSubview(textStack) + + statusLabel.font = .app(.caption) + statusLabel.textAlignment = .center + statusLabel.layer.cornerRadius = 4 + statusLabel.clipsToBounds = true + contentView.addSubview(statusLabel) + + divider.snp.makeConstraints { make in + make.top.leading.trailing.equalToSuperview() + make.height.equalTo(1) + } + textStack.snp.makeConstraints { make in + make.leading.equalToSuperview() + make.top.bottom.equalToSuperview().inset(12) + make.trailing.lessThanOrEqualTo(statusLabel.snp.leading).offset(-12) + } + statusLabel.snp.makeConstraints { make in + make.trailing.equalToSuperview() + make.centerY.equalToSuperview() + make.height.equalTo(22) + make.width.greaterThanOrEqualTo(48) + } + } +} + +/// 邀请记录列表标题与底部提示单元格。 +private final class InviteFooterCell: UITableViewCell { + static let reuseIdentifier = "InviteFooterCell" + + private let label = UILabel() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + selectionStyle = .none + label.textAlignment = .center + contentView.addSubview(label) + label.snp.makeConstraints { make in + make.edges.equalToSuperview().inset(UIEdgeInsets(top: 12, left: 0, bottom: 12, right: 0)) + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + /// 应用标题或底部提示文字。 + func apply(text: String) { + label.text = text + if text == "已邀请摄影师" || text == "奖励记录" { + label.textAlignment = .left + label.font = .systemFont(ofSize: 16, weight: .medium) + label.textColor = .black + } else { + label.textAlignment = .center + label.font = .app(.body) + label.textColor = AppColor.textSecondary + } + } +} diff --git a/suixinkan/UI/Invite/PhotographerInviteViewController.swift b/suixinkan/UI/Invite/PhotographerInviteViewController.swift new file mode 100644 index 0000000..0339be4 --- /dev/null +++ b/suixinkan/UI/Invite/PhotographerInviteViewController.swift @@ -0,0 +1,448 @@ +// +// PhotographerInviteViewController.swift +// suixinkan +// + +import SnapKit +import UIKit + +/// 摄影师邀请页面,展示邀请二维码、邀请码、收益规则、新人福利和分享入口。 +final class PhotographerInviteViewController: BaseViewController { + private let viewModel = PhotographerInviteViewModel() + private let inviteAPI: InviteServing + + private let scrollView = UIScrollView() + private let contentStack = UIStackView() + private let qrCard = UIView() + private let qrImageView = UIImageView() + private let inviteCodeLabel = UILabel() + private let ruleStack = UIStackView() + + /// 初始化摄影师邀请页面。 + init(inviteAPI: InviteServing = NetworkServices.shared.inviteAPI) { + self.inviteAPI = inviteAPI + super.init(nibName: nil, bundle: nil) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func setupNavigationBar() { + title = "摄影师邀请" + } + + override func setupUI() { + view.backgroundColor = UIColor(hex: 0xF5F6F8) + scrollView.alwaysBounceVertical = true + scrollView.refreshControl = UIRefreshControl() + contentStack.axis = .vertical + contentStack.spacing = 16 + + view.addSubview(scrollView) + scrollView.addSubview(contentStack) + + contentStack.addArrangedSubview(makeInviteCard()) + contentStack.addArrangedSubview(makeRuleCard()) + contentStack.addArrangedSubview(makeBenefitCard()) + contentStack.addArrangedSubview(makeInviteRecordEntry()) + } + + override func setupConstraints() { + scrollView.snp.makeConstraints { make in + make.edges.equalTo(view.safeAreaLayoutGuide) + } + contentStack.snp.makeConstraints { make in + make.top.bottom.equalTo(scrollView.contentLayoutGuide).inset(16) + make.leading.trailing.equalTo(scrollView.frameLayoutGuide).inset(16) + make.width.equalTo(scrollView.frameLayoutGuide).offset(-32) + } + } + + override func bindActions() { + scrollView.refreshControl?.addTarget(self, action: #selector(refreshPulled), for: .valueChanged) + viewModel.onStateChange = { [weak self] in + Task { @MainActor in + self?.applyViewModel() + } + } + } + + override func viewDidLoad() { + super.viewDidLoad() + Task { await viewModel.reload(api: inviteAPI) } + } + + private func makeInviteCard() -> UIView { + qrCard.backgroundColor = .white + qrCard.layer.cornerRadius = 12 + qrCard.clipsToBounds = true + + let stack = UIStackView() + stack.axis = .vertical + stack.spacing = 16 + stack.alignment = .fill + qrCard.addSubview(stack) + + qrImageView.contentMode = .scaleAspectFit + qrImageView.backgroundColor = .white + qrImageView.image = UIImage(systemName: "qrcode") + qrImageView.tintColor = AppColor.textTertiary + stack.addArrangedSubview(qrImageView) + + let codeRow = UIStackView() + codeRow.axis = .horizontal + codeRow.alignment = .center + codeRow.spacing = 8 + + inviteCodeLabel.font = .systemFont(ofSize: 16) + inviteCodeLabel.textColor = UIColor(hex: 0x4B5563) + inviteCodeLabel.numberOfLines = 1 + codeRow.addArrangedSubview(inviteCodeLabel) + + let copyButton = UIButton(type: .system) + copyButton.setTitle("复制", for: .normal) + copyButton.setTitleColor(.white, for: .normal) + copyButton.titleLabel?.font = .systemFont(ofSize: 14, weight: .medium) + copyButton.backgroundColor = AppColor.primary + copyButton.layer.cornerRadius = 6 + copyButton.addTarget(self, action: #selector(copyCodeTapped), for: .touchUpInside) + codeRow.addArrangedSubview(copyButton) + copyButton.snp.makeConstraints { make in + make.width.equalTo(64) + make.height.equalTo(28) + } + stack.addArrangedSubview(codeRow) + + let actionRow = UIStackView() + actionRow.axis = .horizontal + actionRow.spacing = 12 + actionRow.distribution = .fillEqually + let shareButton = InviteIconButton(title: "分享", imageName: "ic_invite_share", backgroundColor: UIColor(hex: 0x07C160)) + shareButton.addTarget(self, action: #selector(shareTapped), for: .touchUpInside) + let linkButton = InviteIconButton(title: "复制链接", imageName: "ic_invite_link", backgroundColor: AppColor.primary) + linkButton.addTarget(self, action: #selector(copyLinkTapped), for: .touchUpInside) + actionRow.addArrangedSubview(shareButton) + actionRow.addArrangedSubview(linkButton) + stack.addArrangedSubview(actionRow) + actionRow.snp.makeConstraints { make in + make.height.equalTo(44) + } + + stack.snp.makeConstraints { make in + make.edges.equalToSuperview().inset(16) + } + qrImageView.snp.makeConstraints { make in + make.height.equalTo(280) + } + + return qrCard + } + + private func makeRuleCard() -> UIView { + let card = UIView() + card.backgroundColor = .white + card.layer.cornerRadius = 12 + card.layer.borderWidth = 1 + card.layer.borderColor = AppColor.cardOutline.cgColor + + let titleLabel = UILabel() + titleLabel.text = "收益规则" + titleLabel.font = .systemFont(ofSize: 18, weight: .medium) + titleLabel.textColor = .black + + ruleStack.axis = .vertical + ruleStack.spacing = 12 + + let stack = UIStackView(arrangedSubviews: [titleLabel, ruleStack]) + stack.axis = .vertical + stack.spacing = 12 + card.addSubview(stack) + stack.snp.makeConstraints { make in + make.edges.equalToSuperview().inset(16) + } + return card + } + + private func makeBenefitCard() -> UIView { + let card = UIView() + card.backgroundColor = .white + card.layer.cornerRadius = 12 + card.clipsToBounds = true + + let titleLabel = UILabel() + titleLabel.text = "新人福利" + titleLabel.font = .systemFont(ofSize: 18, weight: .medium) + titleLabel.textColor = .black + + let grid = UIStackView() + grid.axis = .vertical + grid.spacing = 12 + + let benefits: [(String, String)] = [ + ("免费剪辑修图", "ic_invite_benefit_free_editing"), + ("免费云盘相册", "ic_invite_benefit_free_cloud"), + ("免费线上流量", "ic_free_traffic"), + ("景区运营身份", "ic_scenic_identity"), + ("接单软件工具", "ic_order_tools"), + ("免佣金特权", "ic_no_commission"), + ] + for index in stride(from: 0, to: benefits.count, by: 2) { + let row = UIStackView() + row.axis = .horizontal + row.spacing = 12 + row.distribution = .fillEqually + row.addArrangedSubview(InviteBenefitView(title: benefits[index].0, imageName: benefits[index].1)) + row.addArrangedSubview(InviteBenefitView(title: benefits[index + 1].0, imageName: benefits[index + 1].1)) + grid.addArrangedSubview(row) + } + + let validityStack = UIStackView() + validityStack.axis = .vertical + validityStack.spacing = 8 + ["活动有效期: 2026年9月1日", "佣金有效期: 2028年1月1日"].forEach { text in + let label = UILabel() + label.text = text + label.font = .app(.body) + label.textColor = UIColor(hex: 0x7B8EAA) + validityStack.addArrangedSubview(label) + } + + let stack = UIStackView(arrangedSubviews: [titleLabel, grid, validityStack]) + stack.axis = .vertical + stack.spacing = 16 + card.addSubview(stack) + stack.snp.makeConstraints { make in + make.edges.equalToSuperview().inset(16) + } + return card + } + + private func makeInviteRecordEntry() -> UIView { + let container = UIView() + container.backgroundColor = UIColor(hex: 0xF5F6F8) + container.snp.makeConstraints { make in + make.height.equalTo(64) + } + + let button = UIButton(type: .system) + button.backgroundColor = .white + button.layer.cornerRadius = 8 + button.setTitle("邀请记录", for: .normal) + button.setTitleColor(AppColor.primary, for: .normal) + button.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) + button.setImage(UIImage(named: "ic_invite_record")?.withRenderingMode(.alwaysTemplate), for: .normal) + button.tintColor = AppColor.primary + button.imageEdgeInsets = UIEdgeInsets(top: 0, left: -6, bottom: 0, right: 6) + button.addTarget(self, action: #selector(inviteRecordTapped), for: .touchUpInside) + container.addSubview(button) + button.snp.makeConstraints { make in + make.leading.trailing.equalToSuperview() + make.top.equalToSuperview().offset(16) + make.height.equalTo(48) + } + return container + } + + @MainActor + private func applyViewModel() { + if viewModel.isLoading { + showLoading() + } else { + hideLoading() + scrollView.refreshControl?.endRefreshing() + } + + if let qrImage = viewModel.qrImage { + qrImageView.image = qrImage + } + + let attributed = NSMutableAttributedString( + string: "邀请码: ", + attributes: [.foregroundColor: UIColor(hex: 0x4B5563)] + ) + attributed.append( + NSAttributedString( + string: viewModel.inviteCode.isEmpty ? "--" : viewModel.inviteCode, + attributes: [.foregroundColor: AppColor.primary] + ) + ) + inviteCodeLabel.attributedText = attributed + applyRules() + + if let message = viewModel.errorMessage { + showToast("获取邀请信息失败: \(message)") + } + } + + private func applyRules() { + ruleStack.arrangedSubviews.forEach { view in + ruleStack.removeArrangedSubview(view) + view.removeFromSuperview() + } + viewModel.rules.enumerated().forEach { index, rule in + ruleStack.addArrangedSubview(InviteRuleRow(rule: rule, imageName: index.isMultiple(of: 2) ? "ic_invite_earnings" : "ic_user_benefits")) + } + } + + @objc private func refreshPulled() { + Task { await viewModel.reload(api: inviteAPI) } + } + + @objc private func copyCodeTapped() { + guard !viewModel.inviteCodeForCopy().isEmpty else { + showToast("邀请码加载中,请稍后重试") + return + } + UIPasteboard.general.string = viewModel.inviteCodeForCopy() + showToast("已复制成功") + } + + @objc private func copyLinkTapped() { + guard !viewModel.inviteUrlForCopy().isEmpty else { + showToast("邀请链接加载中,请稍后重试") + return + } + UIPasteboard.general.string = viewModel.inviteUrlForCopy() + showToast("已复制成功") + } + + @objc private func shareTapped() { + guard !viewModel.inviteUrl.isEmpty else { + showToast("邀请链接加载中,请稍后重试") + return + } + + let payload = WeChatWebPageSharePayload( + title: "邀请你加入随心瞰商家版", + description: viewModel.inviteCode.isEmpty ? "摄影师邀请" : "邀请码:\(viewModel.inviteCode)", + url: viewModel.inviteUrl + ) + WeChatShareService.shareWebPage(payload, scene: .session, thumbImage: viewModel.qrImage ?? WeChatShareService.defaultThumbImage()) { [weak self] result in + Task { @MainActor in + self?.handleShareResult(result) + } + } + } + + @objc private func inviteRecordTapped() { + navigationController?.pushViewController(InviteRecordViewController(), animated: true) + } + + private func handleShareResult(_ result: WeChatShareResult) { + switch result { + case .success: + showToast("已分享到微信好友") + case .cancelled: + showToast("已取消分享") + case .notInstalled: + showToast("未安装微信,无法分享") + case .unsupported: + showToast("当前微信版本不支持分享") + case .invalidPayload(let message): + showToast(message) + case .sendFailed, .unknown: + showToast("分享失败,请稍后重试") + } + } +} + +/// 邀请页带图标按钮。 +private final class InviteIconButton: UIButton { + /// 初始化带图标按钮。 + init(title: String, imageName: String, backgroundColor: UIColor) { + super.init(frame: .zero) + self.backgroundColor = backgroundColor + layer.cornerRadius = 8 + setTitle(title, for: .normal) + setTitleColor(.white, for: .normal) + setImage(UIImage(named: imageName)?.withRenderingMode(.alwaysTemplate), for: .normal) + tintColor = .white + titleLabel?.font = .systemFont(ofSize: 14, weight: .medium) + imageEdgeInsets = UIEdgeInsets(top: 0, left: -3, bottom: 0, right: 3) + titleEdgeInsets = UIEdgeInsets(top: 0, left: 3, bottom: 0, right: -3) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +/// 收益规则展示行。 +private final class InviteRuleRow: UIView { + /// 初始化收益规则展示行。 + init(rule: String, imageName: String) { + super.init(frame: .zero) + + let iconView = UIImageView(image: UIImage(named: imageName)?.withRenderingMode(.alwaysTemplate)) + iconView.tintColor = AppColor.primary + iconView.contentMode = .scaleAspectFit + + let label = UILabel() + label.text = rule + label.font = .app(.body) + label.textColor = .black + label.numberOfLines = 0 + + addSubview(iconView) + addSubview(label) + iconView.snp.makeConstraints { make in + make.leading.equalToSuperview() + make.top.equalToSuperview().offset(2) + make.size.equalTo(16) + } + label.snp.makeConstraints { make in + make.top.bottom.trailing.equalToSuperview() + make.leading.equalTo(iconView.snp.trailing).offset(12) + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +/// 新人福利卡片。 +private final class InviteBenefitView: UIView { + /// 初始化新人福利卡片。 + init(title: String, imageName: String) { + super.init(frame: .zero) + backgroundColor = UIColor(hex: 0xEFF6FF) + layer.cornerRadius = 12 + + let iconView = UIImageView(image: UIImage(named: imageName)?.withRenderingMode(.alwaysTemplate)) + iconView.tintColor = AppColor.primary + iconView.contentMode = .scaleAspectFit + + let titleLabel = UILabel() + titleLabel.text = title + titleLabel.font = .app(.body) + titleLabel.textColor = .black + titleLabel.textAlignment = .center + titleLabel.numberOfLines = 2 + + addSubview(iconView) + addSubview(titleLabel) + snp.makeConstraints { make in + make.height.equalTo(80) + } + iconView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalToSuperview().offset(12) + make.size.equalTo(24) + } + titleLabel.snp.makeConstraints { make in + make.leading.trailing.equalToSuperview().inset(8) + make.top.equalTo(iconView.snp.bottom).offset(8) + make.bottom.lessThanOrEqualToSuperview().inset(8) + } + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/suixinkan/UI/Login/AccountSelectionViewController.swift b/suixinkan/UI/Login/AccountSelectionViewController.swift index 047d995..529f3f0 100644 --- a/suixinkan/UI/Login/AccountSelectionViewController.swift +++ b/suixinkan/UI/Login/AccountSelectionViewController.swift @@ -111,6 +111,9 @@ final class AccountSelectionViewController: UIViewController, UITableViewDelegat private func configureTableView() { tableView.backgroundColor = .clear tableView.separatorStyle = .none + tableView.contentInset = UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0) + tableView.rowHeight = UITableView.automaticDimension + tableView.estimatedRowHeight = 92 tableView.delegate = self tableView.register(AccountSelectionCell.self, forCellReuseIdentifier: AccountSelectionCell.reuseIdentifier) view.addSubview(tableView) @@ -178,8 +181,9 @@ final class AccountSelectionViewController: UIViewController, UITableViewDelegat private final class AccountSelectionCell: UITableViewCell { static let reuseIdentifier = "AccountSelectionCell" - private let avatarView = UIView() - private let avatarLabel = UILabel() + private let card = UIView() + private let avatarView = UIImageView() + private let avatarPlaceholderLabel = UILabel() private let titleLabel = UILabel() private let subtitleLabel = UILabel() private let phoneLabel = UILabel() @@ -191,13 +195,18 @@ private final class AccountSelectionCell: UITableViewCell { super.init(style: style, reuseIdentifier: reuseIdentifier) selectionStyle = .none backgroundColor = .clear - contentView.backgroundColor = .white - contentView.layer.cornerRadius = 8 - contentView.layer.masksToBounds = true + contentView.backgroundColor = .clear + card.backgroundColor = .white + card.layer.cornerRadius = 10 + card.layer.masksToBounds = true + + avatarView.clipsToBounds = true avatarView.layer.cornerRadius = 25 + avatarView.contentMode = .scaleAspectFill - avatarLabel.font = .systemFont(ofSize: 14, weight: .semibold) + avatarPlaceholderLabel.font = .systemFont(ofSize: 14, weight: .semibold) + avatarPlaceholderLabel.textAlignment = .center titleLabel.font = .systemFont(ofSize: 16, weight: .semibold) titleLabel.textColor = AppColor.text333 @@ -212,6 +221,7 @@ private final class AccountSelectionCell: UITableViewCell { typeTag.textAlignment = .center typeTag.layer.cornerRadius = 4 typeTag.clipsToBounds = true + typeTag.setContentCompressionResistancePriority(.required, for: .horizontal) currentTag.font = .systemFont(ofSize: 11, weight: .semibold) currentTag.textAlignment = .center @@ -224,14 +234,19 @@ private final class AccountSelectionCell: UITableViewCell { checkmark.contentMode = .scaleAspectFit - contentView.addSubview(avatarView) - avatarView.addSubview(avatarLabel) - contentView.addSubview(titleLabel) - contentView.addSubview(subtitleLabel) - contentView.addSubview(phoneLabel) - contentView.addSubview(typeTag) - contentView.addSubview(currentTag) - contentView.addSubview(checkmark) + contentView.addSubview(card) + card.addSubview(avatarView) + avatarView.addSubview(avatarPlaceholderLabel) + card.addSubview(titleLabel) + card.addSubview(subtitleLabel) + card.addSubview(phoneLabel) + card.addSubview(typeTag) + card.addSubview(currentTag) + card.addSubview(checkmark) + + card.snp.makeConstraints { make in + make.edges.equalToSuperview().inset(UIEdgeInsets(top: 6, left: 16, bottom: 6, right: 16)) + } avatarView.snp.makeConstraints { make in make.leading.equalToSuperview().inset(16) @@ -239,18 +254,19 @@ private final class AccountSelectionCell: UITableViewCell { make.width.height.equalTo(50) } - avatarLabel.snp.makeConstraints { make in + avatarPlaceholderLabel.snp.makeConstraints { make in make.center.equalToSuperview() } titleLabel.snp.makeConstraints { make in make.top.equalToSuperview().inset(16) make.leading.equalTo(avatarView.snp.trailing).offset(12) - make.trailing.lessThanOrEqualTo(checkmark.snp.leading).offset(-8) + make.trailing.lessThanOrEqualTo(typeTag.snp.leading).offset(-8) } currentTag.snp.makeConstraints { make in make.leading.equalTo(titleLabel.snp.trailing).offset(6) + make.trailing.lessThanOrEqualTo(typeTag.snp.leading).offset(-8) make.centerY.equalTo(titleLabel) make.height.equalTo(18) } @@ -292,27 +308,32 @@ private final class AccountSelectionCell: UITableViewCell { phoneLabel.isHidden = account.phone.isEmpty currentTag.isHidden = !account.isCurrent + let avatarPlaceholderColor: UIColor + let avatarTextColor: UIColor if account.isStoreUser { - avatarView.backgroundColor = UIColor(hex: 0xE8F8F1) - avatarLabel.text = "店" - avatarLabel.textColor = UIColor(hex: 0x0F9F6E) + avatarPlaceholderColor = UIColor(hex: 0xE8F8F1) + avatarTextColor = UIColor(hex: 0x0F9F6E) + avatarPlaceholderLabel.text = "店" typeTag.text = " 门店 " typeTag.textColor = UIColor(hex: 0x0F9F6E) typeTag.backgroundColor = UIColor(hex: 0xE8F8F1) } else { - avatarView.backgroundColor = UIColor(hex: 0xF3ECFF) - avatarLabel.text = "景" - avatarLabel.textColor = UIColor(hex: 0x7C3AED) + avatarPlaceholderColor = UIColor(hex: 0xF3ECFF) + avatarTextColor = UIColor(hex: 0x7C3AED) + avatarPlaceholderLabel.text = "景" typeTag.text = " 景区 " typeTag.textColor = UIColor(hex: 0x7C3AED) typeTag.backgroundColor = UIColor(hex: 0xF3ECFF) } + avatarPlaceholderLabel.textColor = avatarTextColor + avatarPlaceholderLabel.isHidden = !account.avatar.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty + avatarView.loadRemoteImage(urlString: account.avatar, placeholderColor: avatarPlaceholderColor) let symbolName = selected ? "checkmark.circle.fill" : "circle" checkmark.image = UIImage(systemName: symbolName) checkmark.tintColor = selected ? AppColor.primary : UIColor(hex: 0xB6BECA) - contentView.layer.borderWidth = selected ? 1.4 : 1 - contentView.layer.borderColor = (selected ? AppColor.primary : UIColor(hex: 0xE6ECF4)).cgColor + card.layer.borderWidth = selected ? 1.4 : 1 + card.layer.borderColor = (selected ? AppColor.primary : UIColor(hex: 0xE6ECF4)).cgColor } } diff --git a/suixinkan/UI/Profile/AccountSwitchViewController.swift b/suixinkan/UI/Profile/AccountSwitchViewController.swift index 807cf1c..6a4b568 100644 --- a/suixinkan/UI/Profile/AccountSwitchViewController.swift +++ b/suixinkan/UI/Profile/AccountSwitchViewController.swift @@ -157,7 +157,9 @@ private final class AccountSwitchCell: UITableViewCell { private let card = UIView() private let avatarView = UIImageView() + private let titleStackView = UIStackView() private let titleLabel = UILabel() + private let currentTagLabel = UILabel() private let subtitleLabel = UILabel() private let phoneLabel = UILabel() private let tagLabel = UILabel() @@ -176,7 +178,23 @@ private final class AccountSwitchCell: UITableViewCell { avatarView.clipsToBounds = true avatarView.contentMode = .scaleAspectFill + titleStackView.axis = .horizontal + titleStackView.alignment = .center + titleStackView.spacing = 6 + titleLabel.font = .systemFont(ofSize: 16, weight: .semibold) + titleLabel.numberOfLines = 1 + titleLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) + currentTagLabel.font = .systemFont(ofSize: 11, weight: .regular) + currentTagLabel.text = "当前" + currentTagLabel.textColor = AppColor.primary + currentTagLabel.textAlignment = .center + currentTagLabel.backgroundColor = UIColor(hex: 0xEFF6FF) + currentTagLabel.layer.cornerRadius = 4 + currentTagLabel.clipsToBounds = true + currentTagLabel.isHidden = true + currentTagLabel.setContentHuggingPriority(.required, for: .horizontal) + currentTagLabel.setContentCompressionResistancePriority(.required, for: .horizontal) subtitleLabel.font = .systemFont(ofSize: 13) subtitleLabel.textColor = AppColor.text666 phoneLabel.font = .systemFont(ofSize: 12) @@ -187,7 +205,10 @@ private final class AccountSwitchCell: UITableViewCell { tagLabel.clipsToBounds = true card.addSubview(avatarView) - card.addSubview(titleLabel) + titleStackView.addArrangedSubview(titleLabel) + titleStackView.addArrangedSubview(currentTagLabel) + + card.addSubview(titleStackView) card.addSubview(subtitleLabel) card.addSubview(phoneLabel) card.addSubview(tagLabel) @@ -200,14 +221,18 @@ private final class AccountSwitchCell: UITableViewCell { make.leading.centerY.equalToSuperview().inset(14) make.width.height.equalTo(50) } - titleLabel.snp.makeConstraints { make in + titleStackView.snp.makeConstraints { make in make.leading.equalTo(avatarView.snp.trailing).offset(13) make.top.equalTo(avatarView).offset(2) make.trailing.lessThanOrEqualTo(tagLabel.snp.leading).offset(-8) } + currentTagLabel.snp.makeConstraints { make in + make.height.equalTo(19) + make.width.greaterThanOrEqualTo(34) + } subtitleLabel.snp.makeConstraints { make in - make.leading.equalTo(titleLabel) - make.top.equalTo(titleLabel.snp.bottom).offset(4) + make.leading.equalTo(titleStackView) + make.top.equalTo(titleStackView.snp.bottom).offset(4) } phoneLabel.snp.makeConstraints { make in make.leading.equalTo(titleLabel) @@ -230,9 +255,7 @@ private final class AccountSwitchCell: UITableViewCell { func configure(account: AccountSwitchAccount, selected: Bool, isCurrent: Bool) { titleLabel.text = account.title - if isCurrent { - titleLabel.text = (account.title) + " (当前)" - } + currentTagLabel.isHidden = !isCurrent subtitleLabel.text = account.subtitle phoneLabel.text = account.phone tagLabel.text = account.isStoreUser ? "门店" : "景区" diff --git a/suixinkan/suixinkan.entitlements b/suixinkan/suixinkan.entitlements new file mode 100644 index 0000000..b9bf05e --- /dev/null +++ b/suixinkan/suixinkan.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.associated-domains + + applinks:www.zhifly.cn + + + diff --git a/suixinkanTests/AuthModelsTests.swift b/suixinkanTests/AuthModelsTests.swift index 7699944..0235b69 100644 --- a/suixinkanTests/AuthModelsTests.swift +++ b/suixinkanTests/AuthModelsTests.swift @@ -23,6 +23,7 @@ final class AuthModelsTests: XCTestCase { "scenic_user_id": 101, "ss_user_id": 101, "username": "scenic_admin", + "user_name": "scenic_operator", "real_name": "张三", "nickname": "张三", "phone": "13800138000", @@ -58,6 +59,7 @@ final class AuthModelsTests: XCTestCase { XCTAssertEqual(response.token, "person-temp-token") XCTAssertEqual(response.accounts.map(\.businessUserId), [101, 201]) + XCTAssertEqual(response.accounts.map(\.subtitle), ["scenic_operator", "store_admin"]) } func testV9AuthResponseDecodesMissingAccountListsAsEmpty() throws { @@ -88,6 +90,7 @@ final class AuthModelsTests: XCTestCase { "scenic_user_id": 3, "ss_user_id": 101, "username": "scenic_admin", + "user_name": "scenic_operator", "real_name": "张三", "nickname": "张三", "phone": "13800138000", @@ -99,6 +102,7 @@ final class AuthModelsTests: XCTestCase { let user = try JSONDecoder().decode(V9ScenicUser.self, from: json) XCTAssertEqual(user.businessUserId, 101) + XCTAssertEqual(user.toAccountSwitchAccount().subtitle, "scenic_operator") XCTAssertEqual(user.toAccountSwitchAccount().toSetUserRequest(), SetUserRequest(ssUserId: 101)) } @@ -124,6 +128,7 @@ final class AuthModelsTests: XCTestCase { let user = try JSONDecoder().decode(V9StoreUser.self, from: json) XCTAssertEqual(user.businessUserId, 201) + XCTAssertEqual(user.toAccountSwitchAccount().subtitle, "store_admin") XCTAssertEqual(user.toAccountSwitchAccount().toSetUserRequest(), SetUserRequest(storeUserId: 201)) } } diff --git a/suixinkanTests/InviteTests.swift b/suixinkanTests/InviteTests.swift new file mode 100644 index 0000000..aeefa7c --- /dev/null +++ b/suixinkanTests/InviteTests.swift @@ -0,0 +1,161 @@ +// +// InviteTests.swift +// suixinkanTests +// + +import XCTest +@testable import suixinkan + +/// 邀请 API 和 ViewModel 测试。 +@MainActor +final class InviteTests: XCTestCase { + /// 测试邀请 API path 和分页参数。 + func testInviteAPIUsesExpectedRequests() async throws { + let session = MockURLSession(responses: [Self.inviteInfoEnvelope, Self.inviteUsersEnvelope]) + let api = InviteAPI(client: APIClient(environment: .testing, session: session)) + + let info = try await api.inviteInfo() + let users = try await api.inviteUserList(page: 0, pageSize: 0) + + XCTAssertEqual(info.inviteCode, "ABC123") + XCTAssertEqual(users.first?.realName, "摄影师") + XCTAssertEqual(session.requests.map { $0.url?.path }, [ + "/api/yf-handset-app/photog/invite-info", + "/api/yf-handset-app/photog/invite/user-list", + ]) + let query = queryItems(from: session.requests[1]) + XCTAssertEqual(query["page"], "1") + XCTAssertEqual(query["page_size"], "1") + } + + /// 测试邀请信息模型宽松解码。 + func testInviteInfoResponseDecodesLossyFields() throws { + let json = Data(#"{"enable_invite":"1","invite_code":123,"invite_url":"https://invite.example.com","description":["规则1"]}"#.utf8) + let response = try JSONDecoder().decode(InviteInfoResponse.self, from: json) + + XCTAssertTrue(response.enableInvite) + XCTAssertEqual(response.inviteCode, "123") + XCTAssertEqual(response.description, ["规则1"]) + } + + /// 测试邀请页加载信息并生成二维码。 + func testPhotographerInviteViewModelLoadsInfoAndGeneratesQRCode() async { + let viewModel = PhotographerInviteViewModel() + + await viewModel.reload(api: FakeInviteService()) + + XCTAssertEqual(viewModel.inviteCode, "ABC123") + XCTAssertEqual(viewModel.inviteUrl, "https://invite.example.com") + XCTAssertEqual(viewModel.rules, ["规则1"]) + XCTAssertNotNil(viewModel.qrImage) + XCTAssertFalse(viewModel.isLoading) + } + + /// 测试邀请记录首次加载邀请用户和钱包汇总。 + func testInviteRecordLoadsInviteRowsAndSummary() async { + let inviteAPI = FakeInviteService() + let walletAPI = FakeWalletService() + let viewModel = InviteRecordViewModel() + + await viewModel.loadInitial(inviteAPI: inviteAPI, walletAPI: walletAPI) + + XCTAssertEqual(viewModel.inviteRows.first?.title, "摄影师") + XCTAssertEqual(viewModel.totalRewardText, "100.00") + XCTAssertEqual(viewModel.withdrawableText, "50.00") + XCTAssertEqual(walletAPI.summaryTypes, [2]) + XCTAssertFalse(viewModel.canLoadMoreInvite) + } + + /// 测试奖励 Tab 加载钱包流水并使用 type=2。 + func testInviteRecordRewardTabLoadsWalletTransactions() async { + let inviteAPI = FakeInviteService() + let walletAPI = FakeWalletService() + let viewModel = InviteRecordViewModel() + + await viewModel.selectTab(.reward, inviteAPI: inviteAPI, walletAPI: walletAPI) + + XCTAssertEqual(viewModel.selectedTab, .reward) + XCTAssertEqual(viewModel.rewardRows.first?.amount, "8.00") + XCTAssertEqual(walletAPI.transactionQueries.first?.type, 2) + XCTAssertEqual(walletAPI.transactionQueries.first?.page, 1) + } + + /// 测试首页菜单 catalog 包含邀请相关 URI。 + func testHomeMenuCatalogContainsInviteRoutes() { + XCTAssertEqual(HomeMenuCatalog.item(for: "registration_invitation")?.title, "注册邀请") + XCTAssertEqual(HomeMenuCatalog.item(for: "photographer_invite")?.title, "邀请摄影师") + XCTAssertEqual(HomeMenuCatalog.item(for: "invite_record")?.title, "邀请记录") + } + + private static let inviteInfoEnvelope = Data(#"{"code":100000,"msg":"success","data":{"enable_invite":"1","invite_code":"ABC123","invite_url":"https://invite.example.com","description":["规则1"]}}"#.utf8) + private static let inviteUsersEnvelope = Data(#"{"code":100000,"msg":"success","data":[{"id":"1","real_name":"摄影师","phone":"13800000000","avatar":"","created_at":"2026-06-24","invite_level":"1"}]}"#.utf8) +} + +@MainActor +/// 邀请服务测试替身。 +private final class FakeInviteService: InviteServing { + func inviteInfo() async throws -> InviteInfoResponse { + InviteInfoResponse( + enableInvite: true, + inviteCode: "ABC123", + inviteUrl: "https://invite.example.com", + description: ["规则1"] + ) + } + + func inviteUserList(page: Int, pageSize: Int) async throws -> [InviteUserItem] { + [ + InviteUserItem( + id: 1, + realName: "摄影师", + phone: "13800000000", + avatar: "", + createdAt: "2026-06-24", + inviteLevel: 1 + ), + ] + } +} + +@MainActor +/// 钱包服务测试替身。 +private final class FakeWalletService: WalletServing { + private(set) var summaryTypes: [Int] = [] + private(set) var transactionQueries: [(page: Int, pageSize: Int, type: Int)] = [] + + func walletSummary(type: Int) async throws -> WalletSummaryResponse { + summaryTypes.append(type) + return WalletSummaryResponse(amountTotal: "100.00", amountCurrentBalance: "20.00", amountWithdrawable: "50.00") + } + + func walletTransactionList( + startDate: String, + endDate: String, + page: Int, + pageSize: Int, + type: Int + ) async throws -> WalletTransactionListResponse { + transactionQueries.append((page, pageSize, type)) + return WalletTransactionListResponse( + total: 1, + list: [ + WalletTransactionItem( + id: 1, + amount: "8.00", + transactionType: 2, + transactionTypeLabel: "邀请奖励", + createdAt: "2026-06-24", + withdrawLabel: "可提现" + ), + ] + ) + } +} + +private func queryItems(from request: URLRequest) -> [String: String] { + URLComponents(url: request.url!, resolvingAgainstBaseURL: false)? + .queryItems? + .reduce(into: [String: String]()) { result, item in + result[item.name] = item.value + } ?? [:] +} diff --git a/suixinkanTests/WeChatShareServiceTests.swift b/suixinkanTests/WeChatShareServiceTests.swift new file mode 100644 index 0000000..c9eff96 --- /dev/null +++ b/suixinkanTests/WeChatShareServiceTests.swift @@ -0,0 +1,69 @@ +// +// WeChatShareServiceTests.swift +// suixinkanTests +// + +import UIKit +import XCTest +@testable import suixinkan + +/// 微信分享服务测试。 +@MainActor +final class WeChatShareServiceTests: XCTestCase { + /// 测试 Universal Link 必须是 HTTPS 且以 `/` 结尾。 + func testUniversalLinkMustUseHTTPSAndEndWithSlash() { + XCTAssertTrue(WeChatConfig.validateUniversalLink(WeChatConfig.universalLink)) + XCTAssertFalse(WeChatConfig.validateUniversalLink("https://www.zhifly.cn/suixinkan")) + XCTAssertFalse(WeChatConfig.validateUniversalLink("http://www.zhifly.cn/suixinkan/")) + } + + /// 测试分享场景映射到微信 SDK scene 值。 + func testShareSceneMapsToWXValues() { + XCTAssertEqual(WeChatShareScene.session.wxSceneValue, 0) + XCTAssertEqual(WeChatShareScene.timeline.wxSceneValue, 1) + XCTAssertEqual(WeChatShareScene.favorite.wxSceneValue, 2) + } + + /// 测试微信错误码解析。 + func testShareResultFromWXErrorCode() { + XCTAssertEqual(WeChatShareResult.fromWXErrorCode(0), .success) + XCTAssertEqual(WeChatShareResult.fromWXErrorCode(-2), .cancelled) + XCTAssertEqual(WeChatShareResult.fromWXErrorCode(99), .unknown(99)) + } + + /// 测试缩略图压缩到微信限制内。 + func testThumbImageProcessorKeepsDataUnderLimit() throws { + let renderer = UIGraphicsImageRenderer(size: CGSize(width: 640, height: 640)) + let image = renderer.image { context in + UIColor.systemBlue.setFill() + context.fill(CGRect(x: 0, y: 0, width: 640, height: 640)) + UIColor.white.setFill() + context.fill(CGRect(x: 80, y: 80, width: 480, height: 480)) + } + + let thumbData = try XCTUnwrap(WeChatThumbImageProcessor.makeThumbData(from: image)) + XCTAssertLessThanOrEqual(thumbData.count, WeChatThumbImageProcessor.maxThumbBytes) + } + + /// 测试空标题和空链接会直接返回参数错误。 + func testShareWebPageRejectsInvalidPayloadBeforeSending() { + var results: [WeChatShareResult] = [] + WeChatShareService.shareWebPage( + WeChatWebPageSharePayload(title: " ", description: "desc", url: "https://example.com"), + scene: .session + ) { result in + results.append(result) + } + WeChatShareService.shareWebPage( + WeChatWebPageSharePayload(title: "title", description: "desc", url: " "), + scene: .session + ) { result in + results.append(result) + } + + XCTAssertEqual(results, [ + .invalidPayload("分享标题不能为空"), + .invalidPayload("分享链接不能为空"), + ]) + } +}