feat: integrate JPush notifications
This commit is contained in:
3
Podfile
3
Podfile
@ -8,6 +8,9 @@ target 'suixinkan' do
|
|||||||
pod 'UMCommon'
|
pod 'UMCommon'
|
||||||
pod 'UMDevice'
|
pod 'UMDevice'
|
||||||
pod 'UMAPM'
|
pod 'UMAPM'
|
||||||
|
# 极光推送:固定无 IDFA 的 JCore,避免引入 ATT 授权。
|
||||||
|
pod 'JCore', '5.4.2-noidfa'
|
||||||
|
pod 'JPush', '6.1.0'
|
||||||
pod 'IQKeyboardManagerSwift'
|
pod 'IQKeyboardManagerSwift'
|
||||||
# 微信 Open SDK:仅接入分享能力,不调用支付 API。
|
# 微信 Open SDK:仅接入分享能力,不调用支付 API。
|
||||||
pod 'WechatOpenSDK-XCFramework', '~> 2.0.4'
|
pod 'WechatOpenSDK-XCFramework', '~> 2.0.4'
|
||||||
|
|||||||
11
Podfile.lock
11
Podfile.lock
@ -46,6 +46,9 @@ PODS:
|
|||||||
- IQKeyboardCore
|
- IQKeyboardCore
|
||||||
- IQTextView (1.0.5):
|
- IQTextView (1.0.5):
|
||||||
- IQKeyboardToolbar/Placeholderable
|
- IQKeyboardToolbar/Placeholderable
|
||||||
|
- JCore (5.4.2-noidfa)
|
||||||
|
- JPush (6.1.0):
|
||||||
|
- JCore (> 5.1.1)
|
||||||
- UMAPM (2.0.7):
|
- UMAPM (2.0.7):
|
||||||
- UMCommon
|
- UMCommon
|
||||||
- UMCommon (7.5.11):
|
- UMCommon (7.5.11):
|
||||||
@ -58,6 +61,8 @@ DEPENDENCIES:
|
|||||||
- AMapLocation-NO-IDFA
|
- AMapLocation-NO-IDFA
|
||||||
- AMapSearch-NO-IDFA
|
- AMapSearch-NO-IDFA
|
||||||
- IQKeyboardManagerSwift
|
- IQKeyboardManagerSwift
|
||||||
|
- JCore (= 5.4.2-noidfa)
|
||||||
|
- JPush (= 6.1.0)
|
||||||
- UMAPM
|
- UMAPM
|
||||||
- UMCommon
|
- UMCommon
|
||||||
- UMDevice
|
- UMDevice
|
||||||
@ -77,6 +82,8 @@ SPEC REPOS:
|
|||||||
- IQKeyboardToolbarManager
|
- IQKeyboardToolbarManager
|
||||||
- IQTextInputViewNotification
|
- IQTextInputViewNotification
|
||||||
- IQTextView
|
- IQTextView
|
||||||
|
- JCore
|
||||||
|
- JPush
|
||||||
- UMAPM
|
- UMAPM
|
||||||
- UMCommon
|
- UMCommon
|
||||||
- UMDevice
|
- UMDevice
|
||||||
@ -95,11 +102,13 @@ SPEC CHECKSUMS:
|
|||||||
IQKeyboardToolbarManager: 242e858cc74e06e00aa989bea1355b24d4397854
|
IQKeyboardToolbarManager: 242e858cc74e06e00aa989bea1355b24d4397854
|
||||||
IQTextInputViewNotification: 3b9fb27a16e7ee8958cc9092cfb07a1a9e1fd559
|
IQTextInputViewNotification: 3b9fb27a16e7ee8958cc9092cfb07a1a9e1fd559
|
||||||
IQTextView: ae13b4922f22e6f027f62c557d9f4f236b19d5c7
|
IQTextView: ae13b4922f22e6f027f62c557d9f4f236b19d5c7
|
||||||
|
JCore: 696e0ac22f417bb0ac4729fc41bc2941aef14e2b
|
||||||
|
JPush: 891c497687be788b094bde368d51289355ee1112
|
||||||
UMAPM: ba9fbebe8dd2048b251c332ab0afc86e1ba5ea63
|
UMAPM: ba9fbebe8dd2048b251c332ab0afc86e1ba5ea63
|
||||||
UMCommon: d652b3b372a801b36db203f5b546ab3e15676898
|
UMCommon: d652b3b372a801b36db203f5b546ab3e15676898
|
||||||
UMDevice: 20b7b3c37a36b2c5c7ca8b5a54386ff9ed2b3b19
|
UMDevice: 20b7b3c37a36b2c5c7ca8b5a54386ff9ed2b3b19
|
||||||
WechatOpenSDK-XCFramework: ff342ae616bb86df3d236aca38059dfd4bc4a949
|
WechatOpenSDK-XCFramework: ff342ae616bb86df3d236aca38059dfd4bc4a949
|
||||||
|
|
||||||
PODFILE CHECKSUM: 0fd38f741cbaae39c8e7a70fa233f651d3b34d0f
|
PODFILE CHECKSUM: e7971a58b5d46ffc03f36ef716b922b6a75a6412
|
||||||
|
|
||||||
COCOAPODS: 1.16.2
|
COCOAPODS: 1.16.2
|
||||||
|
|||||||
1
Pods/JCore/README.md
generated
Normal file
1
Pods/JCore/README.md
generated
Normal file
@ -0,0 +1 @@
|
|||||||
|
# jcore-sdk
|
||||||
44
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/Info.plist
generated
Normal file
44
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/Info.plist
generated
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>AvailableLibraries</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>HeadersPath</key>
|
||||||
|
<string>Headers</string>
|
||||||
|
<key>LibraryIdentifier</key>
|
||||||
|
<string>ios-arm64</string>
|
||||||
|
<key>LibraryPath</key>
|
||||||
|
<string>libJCore.a</string>
|
||||||
|
<key>SupportedArchitectures</key>
|
||||||
|
<array>
|
||||||
|
<string>arm64</string>
|
||||||
|
</array>
|
||||||
|
<key>SupportedPlatform</key>
|
||||||
|
<string>ios</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>HeadersPath</key>
|
||||||
|
<string>Headers</string>
|
||||||
|
<key>LibraryIdentifier</key>
|
||||||
|
<string>ios-arm64_x86_64-simulator</string>
|
||||||
|
<key>LibraryPath</key>
|
||||||
|
<string>libJCore.a</string>
|
||||||
|
<key>SupportedArchitectures</key>
|
||||||
|
<array>
|
||||||
|
<string>arm64</string>
|
||||||
|
<string>x86_64</string>
|
||||||
|
</array>
|
||||||
|
<key>SupportedPlatform</key>
|
||||||
|
<string>ios</string>
|
||||||
|
<key>SupportedPlatformVariant</key>
|
||||||
|
<string>simulator</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>XFWK</string>
|
||||||
|
<key>XCFrameworkFormatVersion</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
19
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64/Headers/JGCOREAPI.h
generated
Normal file
19
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64/Headers/JGCOREAPI.h
generated
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// JGCOREService.h
|
||||||
|
// JCore
|
||||||
|
//
|
||||||
|
// Created by Shuni Huang on 2024/3/19.
|
||||||
|
// Copyright © 2024 jiguang. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface JGCOREAPI : NSObject
|
||||||
|
|
||||||
|
+ (void)ci:(BOOL)enable;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
||||||
27
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64/Headers/JGInforCollectionAuth.h
generated
Normal file
27
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64/Headers/JGInforCollectionAuth.h
generated
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
//
|
||||||
|
// JGInforCollectionAuth.h
|
||||||
|
// JCore
|
||||||
|
//
|
||||||
|
// Created by 豆瓣 on 2021/10/27.
|
||||||
|
// Copyright © 2021 jiguang. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
/// 合规接口,是否授权极光采集一定的设备信息
|
||||||
|
@interface JGInforCollectionAuthItems : NSObject
|
||||||
|
/// 是否授权,默认YES
|
||||||
|
@property(nonatomic,assign)BOOL isAuth;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface JGInforCollectionAuth : NSObject
|
||||||
|
|
||||||
|
/// 设备信息采集授权接口(合规接口)
|
||||||
|
/// 请务必在调用初始化、功能性接口前调用此接口进行合规授权
|
||||||
|
/// @param authBlock auth:YES 则极光认为您同意极光采集一定的设备信息
|
||||||
|
+(void)JCollectionAuth:(void(^_Nullable)(JGInforCollectionAuthItems *authInfo))authBlock;
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
||||||
64
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64/PrivacyInfo.xcprivacy
generated
Normal file
64
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64/PrivacyInfo.xcprivacy
generated
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyTrackingDomains</key>
|
||||||
|
<array/>
|
||||||
|
<key>NSPrivacyCollectedDataTypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyCollectedDataType</key>
|
||||||
|
<string>NSPrivacyCollectedDataTypeCrashData</string>
|
||||||
|
<key>NSPrivacyCollectedDataTypeLinked</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSPrivacyCollectedDataTypeTracking</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSPrivacyCollectedDataTypePurposes</key>
|
||||||
|
<array>
|
||||||
|
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyCollectedDataType</key>
|
||||||
|
<string>NSPrivacyCollectedDataTypePreciseLocation</string>
|
||||||
|
<key>NSPrivacyCollectedDataTypeLinked</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSPrivacyCollectedDataTypeTracking</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSPrivacyCollectedDataTypePurposes</key>
|
||||||
|
<array>
|
||||||
|
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>NSPrivacyTracking</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSPrivacyAccessedAPITypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>E174.1</string>
|
||||||
|
</array>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>CA92.1</string>
|
||||||
|
</array>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>C617.1</string>
|
||||||
|
</array>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
BIN
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64/libJCore.a
generated
Normal file
BIN
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64/libJCore.a
generated
Normal file
Binary file not shown.
19
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64_x86_64-simulator/Headers/JGCOREAPI.h
generated
Normal file
19
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64_x86_64-simulator/Headers/JGCOREAPI.h
generated
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// JGCOREService.h
|
||||||
|
// JCore
|
||||||
|
//
|
||||||
|
// Created by Shuni Huang on 2024/3/19.
|
||||||
|
// Copyright © 2024 jiguang. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface JGCOREAPI : NSObject
|
||||||
|
|
||||||
|
+ (void)ci:(BOOL)enable;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
||||||
@ -0,0 +1,27 @@
|
|||||||
|
//
|
||||||
|
// JGInforCollectionAuth.h
|
||||||
|
// JCore
|
||||||
|
//
|
||||||
|
// Created by 豆瓣 on 2021/10/27.
|
||||||
|
// Copyright © 2021 jiguang. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
/// 合规接口,是否授权极光采集一定的设备信息
|
||||||
|
@interface JGInforCollectionAuthItems : NSObject
|
||||||
|
/// 是否授权,默认YES
|
||||||
|
@property(nonatomic,assign)BOOL isAuth;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface JGInforCollectionAuth : NSObject
|
||||||
|
|
||||||
|
/// 设备信息采集授权接口(合规接口)
|
||||||
|
/// 请务必在调用初始化、功能性接口前调用此接口进行合规授权
|
||||||
|
/// @param authBlock auth:YES 则极光认为您同意极光采集一定的设备信息
|
||||||
|
+(void)JCollectionAuth:(void(^_Nullable)(JGInforCollectionAuthItems *authInfo))authBlock;
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
||||||
64
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64_x86_64-simulator/PrivacyInfo.xcprivacy
generated
Normal file
64
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64_x86_64-simulator/PrivacyInfo.xcprivacy
generated
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyTrackingDomains</key>
|
||||||
|
<array/>
|
||||||
|
<key>NSPrivacyCollectedDataTypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyCollectedDataType</key>
|
||||||
|
<string>NSPrivacyCollectedDataTypeCrashData</string>
|
||||||
|
<key>NSPrivacyCollectedDataTypeLinked</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSPrivacyCollectedDataTypeTracking</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSPrivacyCollectedDataTypePurposes</key>
|
||||||
|
<array>
|
||||||
|
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyCollectedDataType</key>
|
||||||
|
<string>NSPrivacyCollectedDataTypePreciseLocation</string>
|
||||||
|
<key>NSPrivacyCollectedDataTypeLinked</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSPrivacyCollectedDataTypeTracking</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSPrivacyCollectedDataTypePurposes</key>
|
||||||
|
<array>
|
||||||
|
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>NSPrivacyTracking</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSPrivacyAccessedAPITypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>E174.1</string>
|
||||||
|
</array>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>CA92.1</string>
|
||||||
|
</array>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>C617.1</string>
|
||||||
|
</array>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
BIN
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64_x86_64-simulator/libJCore.a
generated
Normal file
BIN
Pods/JCore/jcore-noidfa-ios-5.4.2.xcframework/ios-arm64_x86_64-simulator/libJCore.a
generated
Normal file
Binary file not shown.
44
Pods/JPush/jpush-ios-6.1.0.xcframework/Info.plist
generated
Normal file
44
Pods/JPush/jpush-ios-6.1.0.xcframework/Info.plist
generated
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>AvailableLibraries</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>HeadersPath</key>
|
||||||
|
<string>Headers</string>
|
||||||
|
<key>LibraryIdentifier</key>
|
||||||
|
<string>ios-arm64_x86_64-simulator</string>
|
||||||
|
<key>LibraryPath</key>
|
||||||
|
<string>libJPush.a</string>
|
||||||
|
<key>SupportedArchitectures</key>
|
||||||
|
<array>
|
||||||
|
<string>arm64</string>
|
||||||
|
<string>x86_64</string>
|
||||||
|
</array>
|
||||||
|
<key>SupportedPlatform</key>
|
||||||
|
<string>ios</string>
|
||||||
|
<key>SupportedPlatformVariant</key>
|
||||||
|
<string>simulator</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>HeadersPath</key>
|
||||||
|
<string>Headers</string>
|
||||||
|
<key>LibraryIdentifier</key>
|
||||||
|
<string>ios-arm64</string>
|
||||||
|
<key>LibraryPath</key>
|
||||||
|
<string>libJPush.a</string>
|
||||||
|
<key>SupportedArchitectures</key>
|
||||||
|
<array>
|
||||||
|
<string>arm64</string>
|
||||||
|
</array>
|
||||||
|
<key>SupportedPlatform</key>
|
||||||
|
<string>ios</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>XFWK</string>
|
||||||
|
<key>XCFrameworkFormatVersion</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
1023
Pods/JPush/jpush-ios-6.1.0.xcframework/ios-arm64/Headers/JPUSHService.h
generated
Normal file
1023
Pods/JPush/jpush-ios-6.1.0.xcframework/ios-arm64/Headers/JPUSHService.h
generated
Normal file
File diff suppressed because it is too large
Load Diff
23
Pods/JPush/jpush-ios-6.1.0.xcframework/ios-arm64/PrivacyInfo.xcprivacy
generated
Normal file
23
Pods/JPush/jpush-ios-6.1.0.xcframework/ios-arm64/PrivacyInfo.xcprivacy
generated
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyTrackingDomains</key>
|
||||||
|
<array/>
|
||||||
|
<key>NSPrivacyCollectedDataTypes</key>
|
||||||
|
<array/>
|
||||||
|
<key>NSPrivacyTracking</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSPrivacyAccessedAPITypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>CA92.1</string>
|
||||||
|
</array>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
BIN
Pods/JPush/jpush-ios-6.1.0.xcframework/ios-arm64/libJPush.a
generated
Normal file
BIN
Pods/JPush/jpush-ios-6.1.0.xcframework/ios-arm64/libJPush.a
generated
Normal file
Binary file not shown.
1023
Pods/JPush/jpush-ios-6.1.0.xcframework/ios-arm64_x86_64-simulator/Headers/JPUSHService.h
generated
Normal file
1023
Pods/JPush/jpush-ios-6.1.0.xcframework/ios-arm64_x86_64-simulator/Headers/JPUSHService.h
generated
Normal file
File diff suppressed because it is too large
Load Diff
23
Pods/JPush/jpush-ios-6.1.0.xcframework/ios-arm64_x86_64-simulator/PrivacyInfo.xcprivacy
generated
Normal file
23
Pods/JPush/jpush-ios-6.1.0.xcframework/ios-arm64_x86_64-simulator/PrivacyInfo.xcprivacy
generated
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyTrackingDomains</key>
|
||||||
|
<array/>
|
||||||
|
<key>NSPrivacyCollectedDataTypes</key>
|
||||||
|
<array/>
|
||||||
|
<key>NSPrivacyTracking</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSPrivacyAccessedAPITypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>NSPrivacyAccessedAPITypeReasons</key>
|
||||||
|
<array>
|
||||||
|
<string>CA92.1</string>
|
||||||
|
</array>
|
||||||
|
<key>NSPrivacyAccessedAPIType</key>
|
||||||
|
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
BIN
Pods/JPush/jpush-ios-6.1.0.xcframework/ios-arm64_x86_64-simulator/libJPush.a
generated
Normal file
BIN
Pods/JPush/jpush-ios-6.1.0.xcframework/ios-arm64_x86_64-simulator/libJPush.a
generated
Normal file
Binary file not shown.
11
Pods/Manifest.lock
generated
11
Pods/Manifest.lock
generated
@ -46,6 +46,9 @@ PODS:
|
|||||||
- IQKeyboardCore
|
- IQKeyboardCore
|
||||||
- IQTextView (1.0.5):
|
- IQTextView (1.0.5):
|
||||||
- IQKeyboardToolbar/Placeholderable
|
- IQKeyboardToolbar/Placeholderable
|
||||||
|
- JCore (5.4.2-noidfa)
|
||||||
|
- JPush (6.1.0):
|
||||||
|
- JCore (> 5.1.1)
|
||||||
- UMAPM (2.0.7):
|
- UMAPM (2.0.7):
|
||||||
- UMCommon
|
- UMCommon
|
||||||
- UMCommon (7.5.11):
|
- UMCommon (7.5.11):
|
||||||
@ -58,6 +61,8 @@ DEPENDENCIES:
|
|||||||
- AMapLocation-NO-IDFA
|
- AMapLocation-NO-IDFA
|
||||||
- AMapSearch-NO-IDFA
|
- AMapSearch-NO-IDFA
|
||||||
- IQKeyboardManagerSwift
|
- IQKeyboardManagerSwift
|
||||||
|
- JCore (= 5.4.2-noidfa)
|
||||||
|
- JPush (= 6.1.0)
|
||||||
- UMAPM
|
- UMAPM
|
||||||
- UMCommon
|
- UMCommon
|
||||||
- UMDevice
|
- UMDevice
|
||||||
@ -77,6 +82,8 @@ SPEC REPOS:
|
|||||||
- IQKeyboardToolbarManager
|
- IQKeyboardToolbarManager
|
||||||
- IQTextInputViewNotification
|
- IQTextInputViewNotification
|
||||||
- IQTextView
|
- IQTextView
|
||||||
|
- JCore
|
||||||
|
- JPush
|
||||||
- UMAPM
|
- UMAPM
|
||||||
- UMCommon
|
- UMCommon
|
||||||
- UMDevice
|
- UMDevice
|
||||||
@ -95,11 +102,13 @@ SPEC CHECKSUMS:
|
|||||||
IQKeyboardToolbarManager: 242e858cc74e06e00aa989bea1355b24d4397854
|
IQKeyboardToolbarManager: 242e858cc74e06e00aa989bea1355b24d4397854
|
||||||
IQTextInputViewNotification: 3b9fb27a16e7ee8958cc9092cfb07a1a9e1fd559
|
IQTextInputViewNotification: 3b9fb27a16e7ee8958cc9092cfb07a1a9e1fd559
|
||||||
IQTextView: ae13b4922f22e6f027f62c557d9f4f236b19d5c7
|
IQTextView: ae13b4922f22e6f027f62c557d9f4f236b19d5c7
|
||||||
|
JCore: 696e0ac22f417bb0ac4729fc41bc2941aef14e2b
|
||||||
|
JPush: 891c497687be788b094bde368d51289355ee1112
|
||||||
UMAPM: ba9fbebe8dd2048b251c332ab0afc86e1ba5ea63
|
UMAPM: ba9fbebe8dd2048b251c332ab0afc86e1ba5ea63
|
||||||
UMCommon: d652b3b372a801b36db203f5b546ab3e15676898
|
UMCommon: d652b3b372a801b36db203f5b546ab3e15676898
|
||||||
UMDevice: 20b7b3c37a36b2c5c7ca8b5a54386ff9ed2b3b19
|
UMDevice: 20b7b3c37a36b2c5c7ca8b5a54386ff9ed2b3b19
|
||||||
WechatOpenSDK-XCFramework: ff342ae616bb86df3d236aca38059dfd4bc4a949
|
WechatOpenSDK-XCFramework: ff342ae616bb86df3d236aca38059dfd4bc4a949
|
||||||
|
|
||||||
PODFILE CHECKSUM: 0fd38f741cbaae39c8e7a70fa233f651d3b34d0f
|
PODFILE CHECKSUM: e7971a58b5d46ffc03f36ef716b922b6a75a6412
|
||||||
|
|
||||||
COCOAPODS: 1.16.2
|
COCOAPODS: 1.16.2
|
||||||
|
|||||||
5216
Pods/Pods.xcodeproj/project.pbxproj
generated
5216
Pods/Pods.xcodeproj/project.pbxproj
generated
File diff suppressed because it is too large
Load Diff
2
Pods/Target Support Files/JCore/JCore-xcframeworks-input-files.xcfilelist
generated
Normal file
2
Pods/Target Support Files/JCore/JCore-xcframeworks-input-files.xcfilelist
generated
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
${PODS_ROOT}/Target Support Files/JCore/JCore-xcframeworks.sh
|
||||||
|
${PODS_ROOT}/JCore/jcore-noidfa-ios-5.4.2.xcframework
|
||||||
1
Pods/Target Support Files/JCore/JCore-xcframeworks-output-files.xcfilelist
generated
Normal file
1
Pods/Target Support Files/JCore/JCore-xcframeworks-output-files.xcfilelist
generated
Normal file
@ -0,0 +1 @@
|
|||||||
|
${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore/jcore-noidfa-ios-5.4.2.framework
|
||||||
121
Pods/Target Support Files/JCore/JCore-xcframeworks.sh
generated
Executable file
121
Pods/Target Support Files/JCore/JCore-xcframeworks.sh
generated
Executable file
@ -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
|
||||||
|
"jcore-noidfa-ios-5.4.2.xcframework/ios-arm64")
|
||||||
|
echo ""
|
||||||
|
;;
|
||||||
|
"jcore-noidfa-ios-5.4.2.xcframework/ios-arm64_x86_64-simulator")
|
||||||
|
echo "simulator"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
archs_for_slice()
|
||||||
|
{
|
||||||
|
case "$1" in
|
||||||
|
"jcore-noidfa-ios-5.4.2.xcframework/ios-arm64")
|
||||||
|
echo "arm64"
|
||||||
|
;;
|
||||||
|
"jcore-noidfa-ios-5.4.2.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}/JCore/jcore-noidfa-ios-5.4.2.xcframework" "JCore" "library" "ios-arm64" "ios-arm64_x86_64-simulator"
|
||||||
|
|
||||||
17
Pods/Target Support Files/JCore/JCore.debug.xcconfig
generated
Normal file
17
Pods/Target Support Files/JCore/JCore.debug.xcconfig
generated
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
||||||
|
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JCore
|
||||||
|
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JCore"
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||||
|
HEADER_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore/Headers"
|
||||||
|
LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore"
|
||||||
|
OTHER_LDFLAGS = $(inherited) -l"JCore" -l"resolv" -l"z" -framework "CFNetwork" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreTelephony" -framework "Foundation" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit" -weak_framework "Network" -weak_framework "UserNotifications"
|
||||||
|
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}/JCore
|
||||||
|
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 = x86_64 arm64
|
||||||
17
Pods/Target Support Files/JCore/JCore.release.xcconfig
generated
Normal file
17
Pods/Target Support Files/JCore/JCore.release.xcconfig
generated
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
||||||
|
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JCore
|
||||||
|
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JCore"
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||||
|
HEADER_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore/Headers"
|
||||||
|
LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore"
|
||||||
|
OTHER_LDFLAGS = $(inherited) -l"JCore" -l"resolv" -l"z" -framework "CFNetwork" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreTelephony" -framework "Foundation" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit" -weak_framework "Network" -weak_framework "UserNotifications"
|
||||||
|
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}/JCore
|
||||||
|
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 = x86_64 arm64
|
||||||
2
Pods/Target Support Files/JPush/JPush-xcframeworks-input-files.xcfilelist
generated
Normal file
2
Pods/Target Support Files/JPush/JPush-xcframeworks-input-files.xcfilelist
generated
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
${PODS_ROOT}/Target Support Files/JPush/JPush-xcframeworks.sh
|
||||||
|
${PODS_ROOT}/JPush/jpush-ios-6.1.0.xcframework
|
||||||
1
Pods/Target Support Files/JPush/JPush-xcframeworks-output-files.xcfilelist
generated
Normal file
1
Pods/Target Support Files/JPush/JPush-xcframeworks-output-files.xcfilelist
generated
Normal file
@ -0,0 +1 @@
|
|||||||
|
${PODS_XCFRAMEWORKS_BUILD_DIR}/JPush/jpush-ios-6.1.0.framework
|
||||||
121
Pods/Target Support Files/JPush/JPush-xcframeworks.sh
generated
Executable file
121
Pods/Target Support Files/JPush/JPush-xcframeworks.sh
generated
Executable file
@ -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
|
||||||
|
"jpush-ios-6.1.0.xcframework/ios-arm64")
|
||||||
|
echo ""
|
||||||
|
;;
|
||||||
|
"jpush-ios-6.1.0.xcframework/ios-arm64_x86_64-simulator")
|
||||||
|
echo "simulator"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
archs_for_slice()
|
||||||
|
{
|
||||||
|
case "$1" in
|
||||||
|
"jpush-ios-6.1.0.xcframework/ios-arm64")
|
||||||
|
echo "arm64"
|
||||||
|
;;
|
||||||
|
"jpush-ios-6.1.0.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}/JPush/jpush-ios-6.1.0.xcframework" "JPush" "library" "ios-arm64" "ios-arm64_x86_64-simulator"
|
||||||
|
|
||||||
15
Pods/Target Support Files/JPush/JPush.debug.xcconfig
generated
Normal file
15
Pods/Target Support Files/JPush/JPush.debug.xcconfig
generated
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
||||||
|
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JPush
|
||||||
|
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JCore" "${PODS_ROOT}/JPush"
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||||
|
HEADER_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JPush/Headers"
|
||||||
|
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}/JPush
|
||||||
|
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
|
||||||
|
SKIP_INSTALL = YES
|
||||||
|
SWIFT_INCLUDE_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore"
|
||||||
|
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
|
||||||
15
Pods/Target Support Files/JPush/JPush.release.xcconfig
generated
Normal file
15
Pods/Target Support Files/JPush/JPush.release.xcconfig
generated
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
||||||
|
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JPush
|
||||||
|
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/JCore" "${PODS_ROOT}/JPush"
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||||
|
HEADER_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JPush/Headers"
|
||||||
|
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}/JPush
|
||||||
|
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
|
||||||
|
SKIP_INSTALL = YES
|
||||||
|
SWIFT_INCLUDE_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore"
|
||||||
|
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
|
||||||
@ -219,6 +219,14 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
## JCore
|
||||||
|
|
||||||
|
Copyright jpush.cn
|
||||||
|
|
||||||
|
## JPush
|
||||||
|
|
||||||
|
Copyright jiguang.cn
|
||||||
|
|
||||||
## UMAPM
|
## UMAPM
|
||||||
|
|
||||||
Copyright 2011 - 2020 umeng.com. All rights reserved.
|
Copyright 2011 - 2020 umeng.com. All rights reserved.
|
||||||
|
|||||||
@ -302,6 +302,26 @@ SOFTWARE.
|
|||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>Copyright jpush.cn</string>
|
||||||
|
<key>License</key>
|
||||||
|
<string>Copyright</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>JCore</string>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>Copyright jiguang.cn</string>
|
||||||
|
<key>License</key>
|
||||||
|
<string>Copyright</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>JPush</string>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>Copyright 2011 - 2020 umeng.com. All rights reserved.
|
<string>Copyright 2011 - 2020 umeng.com. All rights reserved.
|
||||||
|
|||||||
@ -3,13 +3,13 @@ ARCHS = $(ARCHS_STANDARD)
|
|||||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = NO
|
ENABLE_USER_SCRIPT_SANDBOXING = NO
|
||||||
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
|
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
|
||||||
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${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"
|
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/JCore" "${PODS_ROOT}/JPush" "${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
|
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||||
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers"
|
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JPush/Headers"
|
||||||
LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
|
LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
|
||||||
LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
|
LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JPush" "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
|
||||||
OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "Combine" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMAPM" -framework "UMCommon" -framework "UMDevice" -framework "WebKit" -framework "WechatOpenSDK"
|
OTHER_LDFLAGS = $(inherited) -ObjC -l"JCore" -l"JPush" -l"c++" -l"resolv" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "CFNetwork" -framework "Combine" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "Foundation" -framework "GLKit" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMAPM" -framework "UMCommon" -framework "UMDevice" -framework "WebKit" -framework "WechatOpenSDK" -weak_framework "Network" -weak_framework "UserNotifications"
|
||||||
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}/IQKeyboardCore" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "-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"
|
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}/IQKeyboardCore" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "-F${PODS_CONFIGURATION_BUILD_DIR}/JCore" "-F${PODS_CONFIGURATION_BUILD_DIR}/JPush" "-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"
|
||||||
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
|
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
|
||||||
PODS_BUILD_DIR = ${BUILD_DIR}
|
PODS_BUILD_DIR = ${BUILD_DIR}
|
||||||
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
||||||
|
|||||||
@ -3,13 +3,13 @@ ARCHS = $(ARCHS_STANDARD)
|
|||||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = NO
|
ENABLE_USER_SCRIPT_SANDBOXING = NO
|
||||||
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
|
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
|
||||||
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${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"
|
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/JCore" "${PODS_ROOT}/JPush" "${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
|
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||||
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers"
|
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JPush/Headers"
|
||||||
LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
|
LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
|
||||||
LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
|
LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JPush" "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
|
||||||
OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "Combine" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMAPM" -framework "UMCommon" -framework "UMDevice" -framework "WebKit" -framework "WechatOpenSDK"
|
OTHER_LDFLAGS = $(inherited) -ObjC -l"JCore" -l"JPush" -l"c++" -l"resolv" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "CFNetwork" -framework "Combine" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "Foundation" -framework "GLKit" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMAPM" -framework "UMCommon" -framework "UMDevice" -framework "WebKit" -framework "WechatOpenSDK" -weak_framework "Network" -weak_framework "UserNotifications"
|
||||||
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}/IQKeyboardCore" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "-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"
|
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}/IQKeyboardCore" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "-F${PODS_CONFIGURATION_BUILD_DIR}/JCore" "-F${PODS_CONFIGURATION_BUILD_DIR}/JPush" "-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"
|
||||||
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
|
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
|
||||||
PODS_BUILD_DIR = ${BUILD_DIR}
|
PODS_BUILD_DIR = ${BUILD_DIR}
|
||||||
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
||||||
|
|||||||
@ -2,10 +2,10 @@ ARCHS = $(ARCHS_STANDARD)
|
|||||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = NO
|
ENABLE_USER_SCRIPT_SANDBOXING = NO
|
||||||
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
|
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
|
||||||
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${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"
|
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/JCore" "${PODS_ROOT}/JPush" "${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
|
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||||
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers"
|
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JPush/Headers"
|
||||||
OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "Combine" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit"
|
OTHER_LDFLAGS = $(inherited) -l"c++" -l"resolv" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "CFNetwork" -framework "Combine" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "Foundation" -framework "GLKit" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit" -weak_framework "Network" -weak_framework "UserNotifications"
|
||||||
PODS_BUILD_DIR = ${BUILD_DIR}
|
PODS_BUILD_DIR = ${BUILD_DIR}
|
||||||
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
||||||
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
|
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
|
||||||
|
|||||||
@ -2,10 +2,10 @@ ARCHS = $(ARCHS_STANDARD)
|
|||||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = NO
|
ENABLE_USER_SCRIPT_SANDBOXING = NO
|
||||||
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
|
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
|
||||||
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${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"
|
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" "${PODS_ROOT}/JCore" "${PODS_ROOT}/JPush" "${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
|
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
|
||||||
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers"
|
HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JCore/Headers" "${PODS_XCFRAMEWORKS_BUILD_DIR}/JPush/Headers"
|
||||||
OTHER_LDFLAGS = $(inherited) -l"c++" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "Combine" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit"
|
OTHER_LDFLAGS = $(inherited) -l"c++" -l"resolv" -l"sqlite3" -l"sqlite3.0" -l"z" -framework "CFNetwork" -framework "Combine" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "Foundation" -framework "GLKit" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "WebKit" -weak_framework "Network" -weak_framework "UserNotifications"
|
||||||
PODS_BUILD_DIR = ${BUILD_DIR}
|
PODS_BUILD_DIR = ${BUILD_DIR}
|
||||||
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
|
||||||
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
|
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
|
||||||
|
|||||||
@ -208,6 +208,11 @@
|
|||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
93FF17C42FFB84950033C304 = {
|
93FF17C42FFB84950033C304 = {
|
||||||
CreatedOnToolsVersion = 26.6;
|
CreatedOnToolsVersion = 26.6;
|
||||||
|
SystemCapabilities = {
|
||||||
|
com.apple.Push = {
|
||||||
|
enabled = 1;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
A1B2C3D32FFB84950033C305 = {
|
A1B2C3D32FFB84950033C305 = {
|
||||||
CreatedOnToolsVersion = 26.6;
|
CreatedOnToolsVersion = 26.6;
|
||||||
@ -422,6 +427,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = 5BBB56C2281879245220A9F3 /* Pods-suixinkan.debug.xcconfig */;
|
baseConfigurationReference = 5BBB56C2281879245220A9F3 /* Pods-suixinkan.debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
APS_ENVIRONMENT = development;
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
CODE_SIGN_ENTITLEMENTS = suixinkan/suixinkan.entitlements;
|
CODE_SIGN_ENTITLEMENTS = suixinkan/suixinkan.entitlements;
|
||||||
@ -487,6 +493,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = 1060D5E389506965D83EA1CC /* Pods-suixinkan.release.xcconfig */;
|
baseConfigurationReference = 1060D5E389506965D83EA1CC /* Pods-suixinkan.release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
APS_ENVIRONMENT = production;
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
CODE_SIGN_ENTITLEMENTS = suixinkan/suixinkan.entitlements;
|
CODE_SIGN_ENTITLEMENTS = suixinkan/suixinkan.entitlements;
|
||||||
|
|||||||
@ -29,6 +29,7 @@ final class NetworkServices {
|
|||||||
let liveAPI: LiveAPI
|
let liveAPI: LiveAPI
|
||||||
let cloudDriveAPI: CloudDriveAPI
|
let cloudDriveAPI: CloudDriveAPI
|
||||||
let messageCenterAPI: MessageCenterAPI
|
let messageCenterAPI: MessageCenterAPI
|
||||||
|
let pushAPI: PushAPI
|
||||||
let wildPhotographerReportAPI: WildPhotographerReportAPI
|
let wildPhotographerReportAPI: WildPhotographerReportAPI
|
||||||
let uploadAPI: UploadAPI
|
let uploadAPI: UploadAPI
|
||||||
let ossUploadService: OSSUploadService
|
let ossUploadService: OSSUploadService
|
||||||
@ -54,6 +55,7 @@ final class NetworkServices {
|
|||||||
liveAPI = LiveAPI(client: client)
|
liveAPI = LiveAPI(client: client)
|
||||||
cloudDriveAPI = CloudDriveAPI(client: client)
|
cloudDriveAPI = CloudDriveAPI(client: client)
|
||||||
messageCenterAPI = MessageCenterAPI(client: client)
|
messageCenterAPI = MessageCenterAPI(client: client)
|
||||||
|
pushAPI = PushAPI(client: client)
|
||||||
wildPhotographerReportAPI = WildPhotographerReportAPI(client: client)
|
wildPhotographerReportAPI = WildPhotographerReportAPI(client: client)
|
||||||
uploadAPI = UploadAPI(client: client)
|
uploadAPI = UploadAPI(client: client)
|
||||||
ossUploadService = OSSUploadService(configService: uploadAPI)
|
ossUploadService = OSSUploadService(configService: uploadAPI)
|
||||||
@ -84,6 +86,7 @@ final class NetworkServices {
|
|||||||
liveAPI = LiveAPI(client: apiClient)
|
liveAPI = LiveAPI(client: apiClient)
|
||||||
cloudDriveAPI = CloudDriveAPI(client: apiClient)
|
cloudDriveAPI = CloudDriveAPI(client: apiClient)
|
||||||
messageCenterAPI = MessageCenterAPI(client: apiClient)
|
messageCenterAPI = MessageCenterAPI(client: apiClient)
|
||||||
|
pushAPI = PushAPI(client: apiClient)
|
||||||
wildPhotographerReportAPI = WildPhotographerReportAPI(client: apiClient)
|
wildPhotographerReportAPI = WildPhotographerReportAPI(client: apiClient)
|
||||||
uploadAPI = UploadAPI(client: apiClient)
|
uploadAPI = UploadAPI(client: apiClient)
|
||||||
ossUploadService = OSSUploadService(configService: uploadAPI)
|
ossUploadService = OSSUploadService(configService: uploadAPI)
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
import IQKeyboardManagerSwift
|
import IQKeyboardManagerSwift
|
||||||
import IQKeyboardToolbarManager
|
import IQKeyboardToolbarManager
|
||||||
import UIKit
|
import UIKit
|
||||||
|
import UserNotifications
|
||||||
|
|
||||||
@main
|
@main
|
||||||
class AppDelegate: UIResponder, UIApplicationDelegate {
|
class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||||
@ -18,9 +19,36 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
|||||||
if AppStore.shared.session.privacyAgreementAccepted, !AppStore.shared.session.token.isEmpty {
|
if AppStore.shared.session.privacyAgreementAccepted, !AppStore.shared.session.token.isEmpty {
|
||||||
AMapBootstrap.configureIfNeeded()
|
AMapBootstrap.configureIfNeeded()
|
||||||
}
|
}
|
||||||
|
PushNotificationManager.shared.initializeIfPrivacyAccepted(launchOptions: launchOptions)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// APNs 注册成功后将 Device Token 交给极光。
|
||||||
|
func application(
|
||||||
|
_ application: UIApplication,
|
||||||
|
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
|
||||||
|
) {
|
||||||
|
PushNotificationManager.shared.handleDeviceToken(deviceToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// APNs 注册失败不阻断应用启动,仅交由推送管理器记录。
|
||||||
|
func application(
|
||||||
|
_ application: UIApplication,
|
||||||
|
didFailToRegisterForRemoteNotificationsWithError error: Error
|
||||||
|
) {
|
||||||
|
PushNotificationManager.shared.handleRegistrationError(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 处理后台静默通知并完成极光到达统计。
|
||||||
|
func application(
|
||||||
|
_ application: UIApplication,
|
||||||
|
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
|
||||||
|
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
|
||||||
|
) {
|
||||||
|
PushNotificationManager.shared.handleRemoteNotification(userInfo)
|
||||||
|
completionHandler(.newData)
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: UISceneSession Lifecycle
|
// MARK: UISceneSession Lifecycle
|
||||||
|
|
||||||
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
|
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
|
||||||
|
|||||||
30
suixinkan/Core/Push/PushAPI.swift
Normal file
30
suixinkan/Core/Push/PushAPI.swift
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import Foundation
|
||||||
|
|
||||||
|
/// 极光 Registration ID 上报能力,允许推送管理器注入测试替身。
|
||||||
|
@MainActor
|
||||||
|
protocol PushRegistrationServing: AnyObject {
|
||||||
|
/// 将当前设备的极光 Registration ID 绑定到已登录业务账号。
|
||||||
|
func registerJPushID(_ registrationID: String) async throws
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 推送 API,复用 Android 当前使用的 Registration ID 上报接口。
|
||||||
|
@MainActor
|
||||||
|
final class PushAPI: PushRegistrationServing {
|
||||||
|
private let client: APIClient
|
||||||
|
|
||||||
|
/// 使用共享网络客户端创建推送 API。
|
||||||
|
init(client: APIClient) {
|
||||||
|
self.client = client
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 上报极光 Registration ID;后端字段名沿用 `jpush_reg_id`。
|
||||||
|
func registerJPushID(_ registrationID: String) async throws {
|
||||||
|
let _: EmptyPayload = try await client.send(
|
||||||
|
APIRequest(
|
||||||
|
method: .post,
|
||||||
|
path: "/api/app/user/register-jpush-id",
|
||||||
|
queryItems: [URLQueryItem(name: "jpush_reg_id", value: registrationID)]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
130
suixinkan/Core/Push/PushModels.swift
Normal file
130
suixinkan/Core/Push/PushModels.swift
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
import Foundation
|
||||||
|
|
||||||
|
/// 推送点击后可到达的业务页面。
|
||||||
|
enum PushDestination: Sendable, Equatable {
|
||||||
|
case payment
|
||||||
|
case orders
|
||||||
|
case verificationOrders
|
||||||
|
case task
|
||||||
|
case queue
|
||||||
|
case messageCenter
|
||||||
|
|
||||||
|
/// 目标页面是否依赖当前景区上下文。
|
||||||
|
var requiresScenicContext: Bool {
|
||||||
|
switch self {
|
||||||
|
case .payment, .task, .queue:
|
||||||
|
true
|
||||||
|
case .orders, .verificationOrders, .messageCenter:
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 极光/APNs payload 解析结果,兼容顶层字段及常见 JSON 嵌套格式。
|
||||||
|
struct PushPayload: Sendable, Equatable {
|
||||||
|
private let values: [String: String]
|
||||||
|
|
||||||
|
/// 从系统通知 userInfo 解析路由字段。
|
||||||
|
nonisolated init(userInfo: [AnyHashable: Any]) {
|
||||||
|
var flattened: [String: String] = [:]
|
||||||
|
Self.mergeDictionary(userInfo, into: &flattened)
|
||||||
|
values = flattened
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 从可发送的字符串字典创建 payload,供跨 Actor 回调及测试使用。
|
||||||
|
nonisolated init(values: [String: String]) {
|
||||||
|
self.values = values
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 可发送的规范化字段快照。
|
||||||
|
nonisolated var normalizedValues: [String: String] {
|
||||||
|
values
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 根据后端约定和历史兼容字段解析目标页面。
|
||||||
|
nonisolated var destination: PushDestination {
|
||||||
|
let type = value(for: "type")
|
||||||
|
let route = value(for: "route")
|
||||||
|
let uri = value(for: "uri")
|
||||||
|
let action = value(for: "action")
|
||||||
|
let merged = [route, uri, action].joined(separator: " ").lowercased()
|
||||||
|
|
||||||
|
if type == "1" || type == "6"
|
||||||
|
|| merged.contains("payment") || merged.contains("payment_qr")
|
||||||
|
|| merged.contains("收款") {
|
||||||
|
return .payment
|
||||||
|
}
|
||||||
|
if merged.contains("queue") || merged.contains("scenic-queue")
|
||||||
|
|| merged.contains("排队") || merged.contains("叫号") {
|
||||||
|
return .queue
|
||||||
|
}
|
||||||
|
if merged.contains("verification") || merged.contains("writeoff")
|
||||||
|
|| merged.contains("write_off") || merged.contains("核销") {
|
||||||
|
return .verificationOrders
|
||||||
|
}
|
||||||
|
if merged.contains("order") || merged.contains("订单") {
|
||||||
|
return .orders
|
||||||
|
}
|
||||||
|
if merged.contains("task") || merged.contains("任务") {
|
||||||
|
return .task
|
||||||
|
}
|
||||||
|
return .messageCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
private nonisolated func value(for key: String) -> String {
|
||||||
|
values[key]?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
|
||||||
|
}
|
||||||
|
|
||||||
|
private nonisolated static func mergeDictionary(
|
||||||
|
_ dictionary: [AnyHashable: Any],
|
||||||
|
into result: inout [String: String]
|
||||||
|
) {
|
||||||
|
for (rawKey, value) in dictionary {
|
||||||
|
guard let key = rawKey as? String else { continue }
|
||||||
|
merge(value, key: key, into: &result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private nonisolated static func merge(
|
||||||
|
_ value: Any,
|
||||||
|
key: String,
|
||||||
|
into result: inout [String: String]
|
||||||
|
) {
|
||||||
|
if let dictionary = value as? [String: Any] {
|
||||||
|
result[key] = stringValue(value)
|
||||||
|
mergeDictionary(dictionary, into: &result)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if let dictionary = value as? [AnyHashable: Any] {
|
||||||
|
result[key] = stringValue(value)
|
||||||
|
mergeDictionary(dictionary, into: &result)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let text = stringValue(value)
|
||||||
|
result[key] = text
|
||||||
|
guard Self.nestedJSONKeys.contains(key),
|
||||||
|
let data = text.data(using: .utf8),
|
||||||
|
let object = try? JSONSerialization.jsonObject(with: data)
|
||||||
|
else { return }
|
||||||
|
|
||||||
|
if let dictionary = object as? [String: Any] {
|
||||||
|
mergeDictionary(dictionary, into: &result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private nonisolated static func stringValue(_ value: Any) -> String {
|
||||||
|
switch value {
|
||||||
|
case let string as String:
|
||||||
|
string
|
||||||
|
case let number as NSNumber:
|
||||||
|
number.stringValue
|
||||||
|
default:
|
||||||
|
String(describing: value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private nonisolated static let nestedJSONKeys: Set<String> = [
|
||||||
|
"extras", "extra", "data", "JMessageExtra", "n_extras",
|
||||||
|
]
|
||||||
|
}
|
||||||
354
suixinkan/Core/Push/PushNotificationManager.swift
Normal file
354
suixinkan/Core/Push/PushNotificationManager.swift
Normal file
@ -0,0 +1,354 @@
|
|||||||
|
import UIKit
|
||||||
|
import UserNotifications
|
||||||
|
|
||||||
|
/// 极光 SDK 的最小能力边界,便于推送生命周期逻辑使用测试替身。
|
||||||
|
@MainActor
|
||||||
|
protocol PushSDKProviding: AnyObject {
|
||||||
|
/// 初始化极光长连接与 APNs 代理服务。
|
||||||
|
func initialize(launchOptions: [UIApplication.LaunchOptionsKey: Any]?, isProduction: Bool)
|
||||||
|
|
||||||
|
/// 请求系统通知权限并注册极光通知代理。
|
||||||
|
func requestAuthorization(delegate: JPUSHRegisterDelegate)
|
||||||
|
|
||||||
|
/// 将 APNs Device Token 注册给极光。
|
||||||
|
func registerDeviceToken(_ deviceToken: Data)
|
||||||
|
|
||||||
|
/// 获取极光 Registration ID。
|
||||||
|
func fetchRegistrationID(completion: @escaping (Int32, String?) -> Void)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 跨越极光 `@Sendable` 回调边界的只读闭包容器。
|
||||||
|
private final class RegistrationIDCompletionBox: @unchecked Sendable {
|
||||||
|
let completion: (Int32, String?) -> Void
|
||||||
|
|
||||||
|
init(completion: @escaping (Int32, String?) -> Void) {
|
||||||
|
self.completion = completion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 生产环境极光 SDK 适配器,集中保存 AppKey 和渠道配置。
|
||||||
|
@MainActor
|
||||||
|
final class JPushSDKAdapter: PushSDKProviding {
|
||||||
|
private static let appKey = "194a633c2a6b79c2f1033c40"
|
||||||
|
private static let channel = "App Store"
|
||||||
|
|
||||||
|
/// 初始化极光 SDK;Debug 输出详细日志,Release 只保留告警和错误。
|
||||||
|
func initialize(launchOptions: [UIApplication.LaunchOptionsKey: Any]?, isProduction: Bool) {
|
||||||
|
JPUSHService.setup(
|
||||||
|
withOption: launchOptions,
|
||||||
|
appKey: Self.appKey,
|
||||||
|
channel: Self.channel,
|
||||||
|
apsForProduction: isProduction
|
||||||
|
)
|
||||||
|
#if DEBUG
|
||||||
|
JPUSHService.setDebugMode()
|
||||||
|
#else
|
||||||
|
JPUSHService.setLogOFF()
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 请求 alert、badge、sound 三类通知权限。
|
||||||
|
func requestAuthorization(delegate: JPUSHRegisterDelegate) {
|
||||||
|
let entity = JPUSHRegisterEntity()
|
||||||
|
entity.types = 1 | 2 | 4
|
||||||
|
JPUSHService.register(forRemoteNotificationConfig: entity, delegate: delegate)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 将 APNs Device Token 交给极光。
|
||||||
|
func registerDeviceToken(_ deviceToken: Data) {
|
||||||
|
JPUSHService.registerDeviceToken(deviceToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 异步获取当前设备 Registration ID。
|
||||||
|
func fetchRegistrationID(completion: @escaping (Int32, String?) -> Void) {
|
||||||
|
let box = RegistrationIDCompletionBox(completion: completion)
|
||||||
|
JPUSHService.registrationIDCompletionHandler { resultCode, registrationID in
|
||||||
|
box.completion(resultCode, registrationID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 推送生命周期管理器,负责隐私门禁、权限、Registration ID 绑定及通知点击分发。
|
||||||
|
@MainActor
|
||||||
|
final class PushNotificationManager: NSObject {
|
||||||
|
/// 全局推送管理器。
|
||||||
|
static let shared = PushNotificationManager()
|
||||||
|
|
||||||
|
/// 推送相关的本地持久化键。
|
||||||
|
private enum Key {
|
||||||
|
static let registrationID = "key_jpush_registration_id"
|
||||||
|
static let uploadedRegistrationIDSuffix = "jpush_uploaded_registration_id"
|
||||||
|
}
|
||||||
|
|
||||||
|
private let sdk: any PushSDKProviding
|
||||||
|
private let api: any PushRegistrationServing
|
||||||
|
private let appStore: AppStore
|
||||||
|
private let defaults: UserDefaults
|
||||||
|
private let router: any PushRouting
|
||||||
|
|
||||||
|
private var isInitialized = false
|
||||||
|
private var didRequestAuthorization = false
|
||||||
|
private var uploadTask: Task<Void, Never>?
|
||||||
|
private var queuedForcedUpload = false
|
||||||
|
private var isFetchingRegistrationID = false
|
||||||
|
private var queuedForcedFetch = false
|
||||||
|
|
||||||
|
/// 创建推送管理器;生产环境使用共享依赖,测试可注入替身。
|
||||||
|
init(
|
||||||
|
sdk: (any PushSDKProviding)? = nil,
|
||||||
|
api: (any PushRegistrationServing)? = nil,
|
||||||
|
appStore: AppStore = .shared,
|
||||||
|
defaults: UserDefaults = .standard,
|
||||||
|
router: (any PushRouting)? = nil
|
||||||
|
) {
|
||||||
|
self.sdk = sdk ?? JPushSDKAdapter()
|
||||||
|
self.api = api ?? NetworkServices.shared.pushAPI
|
||||||
|
self.appStore = appStore
|
||||||
|
self.defaults = defaults
|
||||||
|
self.router = router ?? PushRouteCoordinator.shared
|
||||||
|
super.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
deinit {
|
||||||
|
NotificationCenter.default.removeObserver(self)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 绑定当前 Scene 的主窗口。
|
||||||
|
func attach(window: UIWindow) {
|
||||||
|
router.attach(window: window)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 仅在用户已同意隐私协议后初始化极光 SDK。
|
||||||
|
func initializeIfPrivacyAccepted(
|
||||||
|
launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
|
||||||
|
) {
|
||||||
|
guard appStore.session.privacyAgreementAccepted, !isInitialized else { return }
|
||||||
|
isInitialized = true
|
||||||
|
sdk.initialize(launchOptions: launchOptions, isProduction: Self.isProductionBuild)
|
||||||
|
observeJPushNetworkLogin()
|
||||||
|
refreshRegistrationID(forceUpload: false)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 登录成功后请求通知权限,并强制绑定当前账号。
|
||||||
|
func handleLoginCompleted() {
|
||||||
|
initializeIfPrivacyAccepted()
|
||||||
|
guard isInitialized, appStore.session.isLoggedIn else { return }
|
||||||
|
if !didRequestAuthorization {
|
||||||
|
didRequestAuthorization = true
|
||||||
|
sdk.requestAuthorization(delegate: self)
|
||||||
|
}
|
||||||
|
bindCurrentAccount()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 账号切换后把同一设备重新绑定到新的业务账号。
|
||||||
|
func handleAccountSwitched() {
|
||||||
|
guard appStore.session.isLoggedIn else { return }
|
||||||
|
bindCurrentAccount()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 退出登录时停止账号上报并清除未完成的业务路由。
|
||||||
|
func handleLogout() {
|
||||||
|
uploadTask?.cancel()
|
||||||
|
uploadTask = nil
|
||||||
|
queuedForcedUpload = false
|
||||||
|
router.resetPendingRoute()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// App 回到前台时补偿失败或尚未完成的 Registration ID 上报。
|
||||||
|
func retryPendingRegistrationUpload() {
|
||||||
|
guard appStore.session.isLoggedIn else { return }
|
||||||
|
uploadCachedRegistrationID(force: false)
|
||||||
|
refreshRegistrationID(forceUpload: false)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 登录根页面建立后继续执行通知点击暂存的路由。
|
||||||
|
func routePendingNotificationIfPossible() {
|
||||||
|
router.routePendingIfPossible()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// APNs 注册成功后把 Device Token 注册给极光。
|
||||||
|
func handleDeviceToken(_ deviceToken: Data) {
|
||||||
|
guard isInitialized else { return }
|
||||||
|
sdk.registerDeviceToken(deviceToken)
|
||||||
|
refreshRegistrationID(forceUpload: false)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// APNs 注册失败只记录调试信息,不阻断登录和主业务。
|
||||||
|
func handleRegistrationError(_ error: Error) {
|
||||||
|
#if DEBUG
|
||||||
|
print("JPush APNs registration failed: \(error.localizedDescription)")
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 处理冷启动或运行中通知点击。
|
||||||
|
func handleNotificationTap(
|
||||||
|
payload: PushPayload,
|
||||||
|
requestIdentifier: String
|
||||||
|
) {
|
||||||
|
router.handle(
|
||||||
|
destination: payload.destination,
|
||||||
|
requestIdentifier: requestIdentifier
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 处理 Scene 冷启动携带的系统通知响应,并向极光上报点击。
|
||||||
|
func handleNotificationResponse(_ response: UNNotificationResponse) {
|
||||||
|
let userInfo = response.notification.request.content.userInfo
|
||||||
|
JPUSHService.handleRemoteNotification(userInfo)
|
||||||
|
handleNotificationTap(
|
||||||
|
payload: PushPayload(userInfo: userInfo),
|
||||||
|
requestIdentifier: response.notification.request.identifier
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 处理后台静默通知并向极光上报到达,不触发页面跳转。
|
||||||
|
func handleRemoteNotification(_ userInfo: [AnyHashable: Any]) {
|
||||||
|
JPUSHService.handleRemoteNotification(userInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func observeJPushNetworkLogin() {
|
||||||
|
NotificationCenter.default.addObserver(
|
||||||
|
self,
|
||||||
|
selector: #selector(handleJPushNetworkLogin),
|
||||||
|
name: .jpfNetworkDidLogin,
|
||||||
|
object: nil,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc private func handleJPushNetworkLogin() {
|
||||||
|
refreshRegistrationID(forceUpload: false)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func refreshRegistrationID(forceUpload: Bool) {
|
||||||
|
guard isInitialized else { return }
|
||||||
|
queuedForcedFetch = queuedForcedFetch || forceUpload
|
||||||
|
guard !isFetchingRegistrationID else { return }
|
||||||
|
isFetchingRegistrationID = true
|
||||||
|
sdk.fetchRegistrationID { [weak self] resultCode, registrationID in
|
||||||
|
Task { @MainActor in
|
||||||
|
guard let self else { return }
|
||||||
|
let shouldForceUpload = self.queuedForcedFetch
|
||||||
|
self.queuedForcedFetch = false
|
||||||
|
self.isFetchingRegistrationID = false
|
||||||
|
guard resultCode == 0 else { return }
|
||||||
|
let normalized = registrationID?
|
||||||
|
.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
|
||||||
|
guard !normalized.isEmpty else { return }
|
||||||
|
self.defaults.set(normalized, forKey: Key.registrationID)
|
||||||
|
self.upload(registrationID: normalized, force: shouldForceUpload)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func uploadCachedRegistrationID(force: Bool) {
|
||||||
|
let registrationID = cachedRegistrationID
|
||||||
|
guard !registrationID.isEmpty else { return }
|
||||||
|
upload(registrationID: registrationID, force: force)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func bindCurrentAccount() {
|
||||||
|
if cachedRegistrationID.isEmpty {
|
||||||
|
refreshRegistrationID(forceUpload: true)
|
||||||
|
} else {
|
||||||
|
uploadCachedRegistrationID(force: true)
|
||||||
|
refreshRegistrationID(forceUpload: false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private var cachedRegistrationID: String {
|
||||||
|
defaults.string(forKey: Key.registrationID)?
|
||||||
|
.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
|
||||||
|
}
|
||||||
|
|
||||||
|
private func upload(registrationID: String, force: Bool) {
|
||||||
|
guard appStore.session.isLoggedIn,
|
||||||
|
let uploadedKey = appStore.session.accountScopedKey(Key.uploadedRegistrationIDSuffix)
|
||||||
|
else { return }
|
||||||
|
|
||||||
|
if !force, defaults.string(forKey: uploadedKey) == registrationID {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if uploadTask != nil {
|
||||||
|
queuedForcedUpload = queuedForcedUpload || force
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let accountScope = appStore.session.accountCachePrefix
|
||||||
|
uploadTask = Task { [weak self] in
|
||||||
|
guard let self else { return }
|
||||||
|
var succeeded = false
|
||||||
|
do {
|
||||||
|
try await self.api.registerJPushID(registrationID)
|
||||||
|
if self.appStore.session.accountCachePrefix == accountScope {
|
||||||
|
self.defaults.set(registrationID, forKey: uploadedKey)
|
||||||
|
}
|
||||||
|
succeeded = true
|
||||||
|
} catch is CancellationError {
|
||||||
|
// 退出登录时取消,不视为失败重试。
|
||||||
|
} catch {
|
||||||
|
#if DEBUG
|
||||||
|
print("JPush Registration ID upload failed: \(error.localizedDescription)")
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
self.uploadTask = nil
|
||||||
|
let shouldForceAgain = self.queuedForcedUpload
|
||||||
|
self.queuedForcedUpload = false
|
||||||
|
if succeeded, shouldForceAgain {
|
||||||
|
self.uploadCachedRegistrationID(force: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private nonisolated static var isProductionBuild: Bool {
|
||||||
|
#if DEBUG
|
||||||
|
false
|
||||||
|
#else
|
||||||
|
true
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension PushNotificationManager: JPUSHRegisterDelegate {
|
||||||
|
/// 前台通知只展示系统 UI,不自动执行业务路由。
|
||||||
|
nonisolated func jpushNotificationCenter(
|
||||||
|
_ center: UNUserNotificationCenter,
|
||||||
|
willPresent notification: UNNotification,
|
||||||
|
withCompletionHandler completionHandler: @escaping (Int) -> Void
|
||||||
|
) {
|
||||||
|
JPUSHService.handleRemoteNotification(notification.request.content.userInfo)
|
||||||
|
let options: UNNotificationPresentationOptions = [.banner, .list, .sound, .badge]
|
||||||
|
completionHandler(Int(options.rawValue))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 用户点击通知后上报极光统计,并在主 Actor 执行业务路由。
|
||||||
|
nonisolated func jpushNotificationCenter(
|
||||||
|
_ center: UNUserNotificationCenter,
|
||||||
|
didReceive response: UNNotificationResponse,
|
||||||
|
withCompletionHandler completionHandler: @escaping () -> Void
|
||||||
|
) {
|
||||||
|
let userInfo = response.notification.request.content.userInfo
|
||||||
|
JPUSHService.handleRemoteNotification(userInfo)
|
||||||
|
let payload = PushPayload(userInfo: userInfo)
|
||||||
|
let requestIdentifier = response.notification.request.identifier
|
||||||
|
Task { @MainActor [weak self] in
|
||||||
|
self?.handleNotificationTap(
|
||||||
|
payload: payload,
|
||||||
|
requestIdentifier: requestIdentifier
|
||||||
|
)
|
||||||
|
}
|
||||||
|
completionHandler()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 系统通知设置入口回调,首期无需额外应用内页面。
|
||||||
|
nonisolated func jpushNotificationCenter(
|
||||||
|
_ center: UNUserNotificationCenter,
|
||||||
|
openSettingsFor notification: UNNotification
|
||||||
|
) {}
|
||||||
|
|
||||||
|
/// 极光通知授权状态回调,权限变化由系统设置管理。
|
||||||
|
nonisolated func jpushNotificationAuthorization(
|
||||||
|
_ status: JPAuthorizationStatus,
|
||||||
|
withInfo info: [AnyHashable: Any]?
|
||||||
|
) {}
|
||||||
|
}
|
||||||
106
suixinkan/Core/Push/PushRouteCoordinator.swift
Normal file
106
suixinkan/Core/Push/PushRouteCoordinator.swift
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
import UIKit
|
||||||
|
|
||||||
|
/// 推送点击路由能力,允许生命周期管理器与 UIKit 导航解耦并支持测试替身。
|
||||||
|
@MainActor
|
||||||
|
protocol PushRouting: AnyObject {
|
||||||
|
/// 绑定当前 Scene 的主窗口。
|
||||||
|
func attach(window: UIWindow)
|
||||||
|
|
||||||
|
/// 处理一次通知点击;未登录时暂存到登录成功后继续。
|
||||||
|
func handle(destination: PushDestination, requestIdentifier: String)
|
||||||
|
|
||||||
|
/// 主界面建立后执行尚未完成的通知路由。
|
||||||
|
func routePendingIfPossible()
|
||||||
|
|
||||||
|
/// 清除退出登录前遗留的待处理路由。
|
||||||
|
func resetPendingRoute()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 集中式推送路由器,负责冷启动去重、登录等待和跨 Tab 导航。
|
||||||
|
@MainActor
|
||||||
|
final class PushRouteCoordinator: PushRouting {
|
||||||
|
/// 全局推送路由器。
|
||||||
|
static let shared = PushRouteCoordinator()
|
||||||
|
|
||||||
|
/// 等待登录或主界面建立后执行的一次性推送路由。
|
||||||
|
private struct PendingRoute {
|
||||||
|
let destination: PushDestination
|
||||||
|
let requestIdentifier: String
|
||||||
|
}
|
||||||
|
|
||||||
|
private weak var window: UIWindow?
|
||||||
|
private var pendingRoute: PendingRoute?
|
||||||
|
private var handledRequestIdentifiers: [String] = []
|
||||||
|
private let appStore: AppStore
|
||||||
|
|
||||||
|
/// 创建路由器并注入应用状态。
|
||||||
|
init(appStore: AppStore = .shared) {
|
||||||
|
self.appStore = appStore
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 绑定当前 Scene 的主窗口。
|
||||||
|
func attach(window: UIWindow) {
|
||||||
|
self.window = window
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 处理通知点击;相同 request identifier 只执行一次。
|
||||||
|
func handle(destination: PushDestination, requestIdentifier: String) {
|
||||||
|
let identifier = requestIdentifier.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
if !identifier.isEmpty, handledRequestIdentifiers.contains(identifier) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
markHandled(identifier)
|
||||||
|
|
||||||
|
let route = PendingRoute(destination: destination, requestIdentifier: identifier)
|
||||||
|
guard appStore.session.isLoggedIn, mainTabController != nil else {
|
||||||
|
pendingRoute = route
|
||||||
|
return
|
||||||
|
}
|
||||||
|
perform(route)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 登录完成、根页面切换后继续执行最后一次待处理路由。
|
||||||
|
func routePendingIfPossible() {
|
||||||
|
guard appStore.session.isLoggedIn,
|
||||||
|
mainTabController != nil,
|
||||||
|
let route = pendingRoute
|
||||||
|
else { return }
|
||||||
|
pendingRoute = nil
|
||||||
|
perform(route)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 用户退出登录时丢弃之前账号尚未执行的跳转。
|
||||||
|
func resetPendingRoute() {
|
||||||
|
pendingRoute = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
private var mainTabController: MainTabBarController? {
|
||||||
|
window?.rootViewController as? MainTabBarController
|
||||||
|
}
|
||||||
|
|
||||||
|
private func perform(_ route: PendingRoute) {
|
||||||
|
guard let mainTabController else {
|
||||||
|
pendingRoute = route
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let destination: PushDestination
|
||||||
|
if route.destination.requiresScenicContext,
|
||||||
|
appStore.session.currentScenicId <= 0 {
|
||||||
|
destination = .messageCenter
|
||||||
|
} else {
|
||||||
|
destination = route.destination
|
||||||
|
}
|
||||||
|
|
||||||
|
mainTabController.dismiss(animated: false)
|
||||||
|
mainTabController.openPushDestination(destination)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func markHandled(_ identifier: String) {
|
||||||
|
guard !identifier.isEmpty else { return }
|
||||||
|
handledRequestIdentifiers.append(identifier)
|
||||||
|
if handledRequestIdentifiers.count > 50 {
|
||||||
|
handledRequestIdentifiers.removeFirst(handledRequestIdentifiers.count - 50)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -42,5 +42,9 @@
|
|||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</dict>
|
</dict>
|
||||||
|
<key>UIBackgroundModes</key>
|
||||||
|
<array>
|
||||||
|
<string>remote-notification</string>
|
||||||
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@ -24,7 +24,18 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
|
|||||||
self.window = window
|
self.window = window
|
||||||
(UIApplication.shared.delegate as? AppDelegate)?.window = window
|
(UIApplication.shared.delegate as? AppDelegate)?.window = window
|
||||||
|
|
||||||
|
PushNotificationManager.shared.attach(window: window)
|
||||||
|
|
||||||
registerNotifications()
|
registerNotifications()
|
||||||
|
|
||||||
|
if AppStore.shared.session.isLoggedIn {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
PushNotificationManager.shared.handleLoginCompleted()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let response = connectionOptions.notificationResponse {
|
||||||
|
PushNotificationManager.shared.handleNotificationResponse(response)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func sceneDidDisconnect(_ scene: UIScene) {
|
func sceneDidDisconnect(_ scene: UIScene) {
|
||||||
@ -43,6 +54,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
|
|||||||
_ = WeChatManager.shared.handleContinueUserActivity(userActivity)
|
_ = WeChatManager.shared.handleContinueUserActivity(userActivity)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func sceneDidBecomeActive(_ scene: UIScene) {
|
||||||
|
PushNotificationManager.shared.retryPendingRegistrationUpload()
|
||||||
|
}
|
||||||
|
|
||||||
private func registerNotifications() {
|
private func registerNotifications() {
|
||||||
NotificationCenter.default.addObserver(
|
NotificationCenter.default.addObserver(
|
||||||
self,
|
self,
|
||||||
@ -62,19 +77,35 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
|
|||||||
name: NotificationName.userDidLogin,
|
name: NotificationName.userDidLogin,
|
||||||
object: nil
|
object: nil
|
||||||
)
|
)
|
||||||
|
NotificationCenter.default.addObserver(
|
||||||
|
self,
|
||||||
|
selector: #selector(handleAccountDidSwitch),
|
||||||
|
name: NotificationName.accountDidSwitch,
|
||||||
|
object: nil
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc private func handleSessionDidExpire() {
|
@objc private func handleSessionDidExpire() {
|
||||||
|
PushNotificationManager.shared.handleLogout()
|
||||||
AppStore.shared.logout()
|
AppStore.shared.logout()
|
||||||
AppRouter.setRoot(.login, on: window)
|
AppRouter.setRoot(.login, on: window)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc private func handleUserDidLogout() {
|
@objc private func handleUserDidLogout() {
|
||||||
|
PushNotificationManager.shared.handleLogout()
|
||||||
AppStore.shared.logout()
|
AppStore.shared.logout()
|
||||||
AppRouter.setRoot(.login, on: window)
|
AppRouter.setRoot(.login, on: window)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc private func handleUserDidLogin() {
|
@objc private func handleUserDidLogin() {
|
||||||
AppRouter.setRoot(.mainTab, on: window)
|
AppRouter.setRoot(.mainTab, on: window)
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
PushNotificationManager.shared.handleLoginCompleted()
|
||||||
|
PushNotificationManager.shared.routePendingNotificationIfPossible()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc private func handleAccountDidSwitch() {
|
||||||
|
PushNotificationManager.shared.handleAccountSwitched()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -65,6 +65,38 @@ final class MainTabBarController: UITabBarController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 响应推送点击,切换到目标 Tab 并打开对应业务页面。
|
||||||
|
func openPushDestination(_ destination: PushDestination) {
|
||||||
|
let targetTab: AppTab = switch destination {
|
||||||
|
case .orders, .verificationOrders:
|
||||||
|
.orders
|
||||||
|
case .payment, .task, .queue, .messageCenter:
|
||||||
|
.home
|
||||||
|
}
|
||||||
|
|
||||||
|
selectTab(targetTab)
|
||||||
|
guard let navigationController = tabNavigationControllers[targetTab] else { return }
|
||||||
|
_ = navigationController.popToRootViewController(animated: false)
|
||||||
|
|
||||||
|
let controller: UIViewController?
|
||||||
|
switch destination {
|
||||||
|
case .payment:
|
||||||
|
controller = PaymentCollectionDetailsViewController()
|
||||||
|
case .task:
|
||||||
|
controller = TaskAddViewController()
|
||||||
|
case .queue:
|
||||||
|
controller = ScenicQueueViewController()
|
||||||
|
case .messageCenter:
|
||||||
|
controller = MessageCenterViewController()
|
||||||
|
case .orders, .verificationOrders:
|
||||||
|
controller = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if let controller {
|
||||||
|
navigationController.pushViewController(controller, animated: false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func configureTabBarAppearance() {
|
private func configureTabBarAppearance() {
|
||||||
tabBar.tintColor = AppColor.primary
|
tabBar.tintColor = AppColor.primary
|
||||||
tabBar.unselectedItemTintColor = AppColor.textTabInactive
|
tabBar.unselectedItemTintColor = AppColor.textTabInactive
|
||||||
|
|||||||
@ -22,6 +22,10 @@
|
|||||||
#if __has_include(<UMCommon/UMCommon.h>)
|
#if __has_include(<UMCommon/UMCommon.h>)
|
||||||
#import <UMCommon/UMCommon.h>
|
#import <UMCommon/UMCommon.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if __has_include(<JPUSHService.h>)
|
||||||
|
#import <JPUSHService.h>
|
||||||
|
#endif
|
||||||
#import "Features/ScenicQueue/Services/AliyunNuiTTSBridge.h"
|
#import "Features/ScenicQueue/Services/AliyunNuiTTSBridge.h"
|
||||||
|
|
||||||
#if __has_include(<UMAPM/UMAPM.h>)
|
#if __has_include(<UMAPM/UMAPM.h>)
|
||||||
|
|||||||
@ -2,6 +2,8 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>aps-environment</key>
|
||||||
|
<string>$(APS_ENVIRONMENT)</string>
|
||||||
<key>com.apple.developer.associated-domains</key>
|
<key>com.apple.developer.associated-domains</key>
|
||||||
<array>
|
<array>
|
||||||
<string>applinks:www.zhifly.cn</string>
|
<string>applinks:www.zhifly.cn</string>
|
||||||
|
|||||||
306
suixinkanTests/PushNotificationTests.swift
Normal file
306
suixinkanTests/PushNotificationTests.swift
Normal file
@ -0,0 +1,306 @@
|
|||||||
|
import UIKit
|
||||||
|
import XCTest
|
||||||
|
@testable import suixinkan
|
||||||
|
|
||||||
|
/// 极光推送测试,覆盖 payload、Registration ID 上报、生命周期和冷启动路由。
|
||||||
|
@MainActor
|
||||||
|
final class PushNotificationTests: XCTestCase {
|
||||||
|
private var defaults: UserDefaults!
|
||||||
|
private var appStore: AppStore!
|
||||||
|
private var suiteName: String!
|
||||||
|
|
||||||
|
override func setUp() {
|
||||||
|
super.setUp()
|
||||||
|
suiteName = "PushNotificationTests.\(UUID().uuidString)"
|
||||||
|
defaults = UserDefaults(suiteName: suiteName)!
|
||||||
|
defaults.removePersistentDomain(forName: suiteName)
|
||||||
|
appStore = AppStore(defaults: defaults)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func tearDown() {
|
||||||
|
if let suiteName {
|
||||||
|
defaults.removePersistentDomain(forName: suiteName)
|
||||||
|
}
|
||||||
|
defaults = nil
|
||||||
|
appStore = nil
|
||||||
|
suiteName = nil
|
||||||
|
super.tearDown()
|
||||||
|
}
|
||||||
|
|
||||||
|
func testPayloadRoutesTopLevelAndKnownDestinations() {
|
||||||
|
XCTAssertEqual(PushPayload(userInfo: ["type": "1"]).destination, .payment)
|
||||||
|
XCTAssertEqual(PushPayload(userInfo: ["route": "photographer_orders"]).destination, .orders)
|
||||||
|
XCTAssertEqual(PushPayload(userInfo: ["route": "verification_order"]).destination, .verificationOrders)
|
||||||
|
XCTAssertEqual(PushPayload(userInfo: ["action": "task_management"]).destination, .task)
|
||||||
|
XCTAssertEqual(PushPayload(userInfo: ["uri": "/scenic-queue"]).destination, .queue)
|
||||||
|
XCTAssertEqual(PushPayload(userInfo: ["route": "message_center"]).destination, .messageCenter)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testPayloadRoutesNestedJSONStringAndUnknownFallsBackToMessageCenter() {
|
||||||
|
let nested = PushPayload(userInfo: [
|
||||||
|
"extras": #"{"data":{"action":"叫号提醒"}}"#,
|
||||||
|
])
|
||||||
|
|
||||||
|
XCTAssertEqual(nested.destination, .queue)
|
||||||
|
XCTAssertEqual(PushPayload(userInfo: ["title": "未知消息"]).destination, .messageCenter)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testPushAPIUsesAndroidCompatibleEndpointAndQuery() async throws {
|
||||||
|
let session = MockURLSession(responses: [try TestJSON.envelope(data: EmptyPayload())])
|
||||||
|
let api = PushAPI(client: APIClient(environment: .testing, session: session))
|
||||||
|
|
||||||
|
try await api.registerJPushID("registration-id-123")
|
||||||
|
|
||||||
|
let request = try XCTUnwrap(session.requests.first)
|
||||||
|
XCTAssertEqual(request.httpMethod, "POST")
|
||||||
|
XCTAssertEqual(request.url?.path, "/api/app/user/register-jpush-id")
|
||||||
|
let query = URLComponents(url: try XCTUnwrap(request.url), resolvingAgainstBaseURL: false)?.queryItems
|
||||||
|
XCTAssertEqual(query?.first { $0.name == "jpush_reg_id" }?.value, "registration-id-123")
|
||||||
|
}
|
||||||
|
|
||||||
|
func testPrivacyGatePreventsSDKInitialization() {
|
||||||
|
let sdk = PushSDKMock(registrationID: "reg-id")
|
||||||
|
let manager = makeManager(sdk: sdk)
|
||||||
|
|
||||||
|
manager.initializeIfPrivacyAccepted()
|
||||||
|
XCTAssertEqual(sdk.initializeCount, 0)
|
||||||
|
|
||||||
|
appStore.session.privacyAgreementAccepted = true
|
||||||
|
manager.initializeIfPrivacyAccepted()
|
||||||
|
manager.initializeIfPrivacyAccepted()
|
||||||
|
XCTAssertEqual(sdk.initializeCount, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testEmptyRegistrationIDDoesNotUpload() async {
|
||||||
|
authenticate(userID: "100")
|
||||||
|
let sdk = PushSDKMock(registrationID: nil)
|
||||||
|
let api = PushRegistrationAPIMock()
|
||||||
|
let manager = makeManager(sdk: sdk, api: api)
|
||||||
|
|
||||||
|
manager.handleLoginCompleted()
|
||||||
|
await Task.yield()
|
||||||
|
await Task.yield()
|
||||||
|
|
||||||
|
XCTAssertTrue(api.registrationIDs.isEmpty)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testLoggedOutStateDoesNotUpload() async {
|
||||||
|
appStore.session.privacyAgreementAccepted = true
|
||||||
|
let sdk = PushSDKMock(registrationID: "reg-id")
|
||||||
|
let api = PushRegistrationAPIMock()
|
||||||
|
let manager = makeManager(sdk: sdk, api: api)
|
||||||
|
|
||||||
|
manager.initializeIfPrivacyAccepted()
|
||||||
|
await Task.yield()
|
||||||
|
await Task.yield()
|
||||||
|
|
||||||
|
XCTAssertTrue(api.registrationIDs.isEmpty)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testLoginRequestsAuthorizationAndUploadsRegistrationIDOnce() async {
|
||||||
|
authenticate(userID: "100")
|
||||||
|
let sdk = PushSDKMock(registrationID: "reg-id")
|
||||||
|
let api = PushRegistrationAPIMock()
|
||||||
|
let manager = makeManager(sdk: sdk, api: api)
|
||||||
|
|
||||||
|
manager.handleLoginCompleted()
|
||||||
|
await waitUntil { api.registrationIDs.count == 1 }
|
||||||
|
manager.retryPendingRegistrationUpload()
|
||||||
|
await Task.yield()
|
||||||
|
|
||||||
|
XCTAssertEqual(sdk.initializeCount, 1)
|
||||||
|
XCTAssertEqual(sdk.authorizationRequestCount, 1)
|
||||||
|
XCTAssertEqual(api.registrationIDs, ["reg-id"])
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccountSwitchForcesRegistrationIDRebind() async {
|
||||||
|
authenticate(userID: "100")
|
||||||
|
let sdk = PushSDKMock(registrationID: "reg-id")
|
||||||
|
let api = PushRegistrationAPIMock()
|
||||||
|
let manager = makeManager(sdk: sdk, api: api)
|
||||||
|
|
||||||
|
manager.handleLoginCompleted()
|
||||||
|
await waitUntil { api.registrationIDs.count == 1 }
|
||||||
|
appStore.session.userId = "200"
|
||||||
|
manager.handleAccountSwitched()
|
||||||
|
await waitUntil { api.registrationIDs.count == 2 }
|
||||||
|
|
||||||
|
XCTAssertEqual(api.registrationIDs, ["reg-id", "reg-id"])
|
||||||
|
}
|
||||||
|
|
||||||
|
func testFailedRegistrationUploadRetriesOnNextActivation() async {
|
||||||
|
authenticate(userID: "100")
|
||||||
|
let sdk = PushSDKMock(registrationID: "reg-id")
|
||||||
|
let api = PushRegistrationAPIMock(errors: [PushTestError.expectedFailure, nil])
|
||||||
|
let manager = makeManager(sdk: sdk, api: api)
|
||||||
|
|
||||||
|
manager.handleLoginCompleted()
|
||||||
|
await waitUntil { api.registrationIDs.count == 1 }
|
||||||
|
await waitUntil { api.completedCallCount == 1 }
|
||||||
|
manager.retryPendingRegistrationUpload()
|
||||||
|
await waitUntil { api.registrationIDs.count == 2 }
|
||||||
|
|
||||||
|
XCTAssertEqual(api.registrationIDs, ["reg-id", "reg-id"])
|
||||||
|
}
|
||||||
|
|
||||||
|
func testNotificationTapRoutesButOrdinaryLifecycleDoesNot() {
|
||||||
|
authenticate(userID: "100")
|
||||||
|
let router = PushRouterMock()
|
||||||
|
let manager = makeManager(router: router)
|
||||||
|
|
||||||
|
manager.initializeIfPrivacyAccepted()
|
||||||
|
XCTAssertTrue(router.destinations.isEmpty)
|
||||||
|
|
||||||
|
manager.handleNotificationTap(
|
||||||
|
payload: PushPayload(userInfo: ["route": "task_management"]),
|
||||||
|
requestIdentifier: "request-1"
|
||||||
|
)
|
||||||
|
XCTAssertEqual(router.destinations, [.task])
|
||||||
|
}
|
||||||
|
|
||||||
|
func testRouteCoordinatorWaitsForLoginAndDeduplicatesColdStartResponse() {
|
||||||
|
let coordinator = PushRouteCoordinator(appStore: appStore)
|
||||||
|
let window = UIWindow(frame: UIScreen.main.bounds)
|
||||||
|
window.rootViewController = UINavigationController(rootViewController: UIViewController())
|
||||||
|
coordinator.attach(window: window)
|
||||||
|
|
||||||
|
coordinator.handle(destination: .queue, requestIdentifier: "cold-request")
|
||||||
|
authenticate(userID: "100")
|
||||||
|
appStore.session.currentScenicId = 9
|
||||||
|
let mainTab = MainTabBarController()
|
||||||
|
mainTab.loadViewIfNeeded()
|
||||||
|
window.rootViewController = mainTab
|
||||||
|
coordinator.routePendingIfPossible()
|
||||||
|
|
||||||
|
let navigationController = mainTab.selectedViewController as? UINavigationController
|
||||||
|
XCTAssertTrue(navigationController?.topViewController is ScenicQueueViewController)
|
||||||
|
|
||||||
|
coordinator.handle(destination: .messageCenter, requestIdentifier: "cold-request")
|
||||||
|
XCTAssertTrue(navigationController?.topViewController is ScenicQueueViewController)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func authenticate(userID: String) {
|
||||||
|
appStore.session.privacyAgreementAccepted = true
|
||||||
|
appStore.session.saveToken("token")
|
||||||
|
appStore.session.userId = userID
|
||||||
|
appStore.session.accountType = .storeUser
|
||||||
|
}
|
||||||
|
|
||||||
|
private func makeManager(
|
||||||
|
sdk: PushSDKMock? = nil,
|
||||||
|
api: PushRegistrationAPIMock? = nil,
|
||||||
|
router: PushRouterMock? = nil
|
||||||
|
) -> PushNotificationManager {
|
||||||
|
let resolvedSDK: PushSDKMock
|
||||||
|
if let sdk {
|
||||||
|
resolvedSDK = sdk
|
||||||
|
} else {
|
||||||
|
resolvedSDK = PushSDKMock(registrationID: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
let resolvedAPI: PushRegistrationAPIMock
|
||||||
|
if let api {
|
||||||
|
resolvedAPI = api
|
||||||
|
} else {
|
||||||
|
resolvedAPI = PushRegistrationAPIMock()
|
||||||
|
}
|
||||||
|
|
||||||
|
let resolvedRouter: PushRouterMock
|
||||||
|
if let router {
|
||||||
|
resolvedRouter = router
|
||||||
|
} else {
|
||||||
|
resolvedRouter = PushRouterMock()
|
||||||
|
}
|
||||||
|
|
||||||
|
return PushNotificationManager(
|
||||||
|
sdk: resolvedSDK,
|
||||||
|
api: resolvedAPI,
|
||||||
|
appStore: appStore,
|
||||||
|
defaults: defaults,
|
||||||
|
router: resolvedRouter
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func waitUntil(
|
||||||
|
timeoutIterations: Int = 100,
|
||||||
|
_ condition: () -> Bool
|
||||||
|
) async {
|
||||||
|
for _ in 0..<timeoutIterations {
|
||||||
|
if condition() { return }
|
||||||
|
await Task.yield()
|
||||||
|
}
|
||||||
|
XCTFail("等待异步条件超时")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 可控的极光 SDK 测试替身,记录初始化与通知授权行为。
|
||||||
|
@MainActor
|
||||||
|
private final class PushSDKMock: PushSDKProviding {
|
||||||
|
private let registrationID: String?
|
||||||
|
private(set) var initializeCount = 0
|
||||||
|
private(set) var authorizationRequestCount = 0
|
||||||
|
private(set) var deviceTokens: [Data] = []
|
||||||
|
|
||||||
|
init(registrationID: String?) {
|
||||||
|
self.registrationID = registrationID
|
||||||
|
}
|
||||||
|
|
||||||
|
func initialize(launchOptions: [UIApplication.LaunchOptionsKey: Any]?, isProduction: Bool) {
|
||||||
|
initializeCount += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func requestAuthorization(delegate: JPUSHRegisterDelegate) {
|
||||||
|
authorizationRequestCount += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func registerDeviceToken(_ deviceToken: Data) {
|
||||||
|
deviceTokens.append(deviceToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
func fetchRegistrationID(completion: @escaping (Int32, String?) -> Void) {
|
||||||
|
completion(0, registrationID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 可控制成功或失败结果的 Registration ID 上报接口测试替身。
|
||||||
|
@MainActor
|
||||||
|
private final class PushRegistrationAPIMock: PushRegistrationServing {
|
||||||
|
private var errors: [Error?]
|
||||||
|
private(set) var registrationIDs: [String] = []
|
||||||
|
private(set) var completedCallCount = 0
|
||||||
|
|
||||||
|
init(errors: [Error?] = []) {
|
||||||
|
self.errors = errors
|
||||||
|
}
|
||||||
|
|
||||||
|
func registerJPushID(_ registrationID: String) async throws {
|
||||||
|
registrationIDs.append(registrationID)
|
||||||
|
let error = errors.isEmpty ? nil : errors.removeFirst()
|
||||||
|
completedCallCount += 1
|
||||||
|
if let error { throw error }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 记录通知点击路由行为的测试替身。
|
||||||
|
@MainActor
|
||||||
|
private final class PushRouterMock: PushRouting {
|
||||||
|
private(set) var destinations: [PushDestination] = []
|
||||||
|
private(set) var resetCount = 0
|
||||||
|
|
||||||
|
func attach(window: UIWindow) {}
|
||||||
|
|
||||||
|
func handle(destination: PushDestination, requestIdentifier: String) {
|
||||||
|
destinations.append(destination)
|
||||||
|
}
|
||||||
|
|
||||||
|
func routePendingIfPossible() {}
|
||||||
|
|
||||||
|
func resetPendingRoute() {
|
||||||
|
resetCount += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 推送单元测试使用的可预期失败错误。
|
||||||
|
private enum PushTestError: Error {
|
||||||
|
case expectedFailure
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user