Commit 2033e44d authored by 艾娇平's avatar 艾娇平

增加钥匙串读取 和 删除api

parent 70630763
...@@ -9,9 +9,14 @@ ...@@ -9,9 +9,14 @@
#import <AppTrackingTransparency/AppTrackingTransparency.h> #import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/ASIdentifierManager.h> #import <AdSupport/ASIdentifierManager.h>
NS_ASSUME_NONNULL_BEGIN // 钥匙串账户
extern NSString *const keyChainAccount;
// 钥匙串存储idfa
extern NSString *const IDFA;
/// 本地存储是否同意隐私弹框的标记
extern NSString *const KprivatePolicyNotification; extern NSString *const KprivatePolicyNotification;
NS_ASSUME_NONNULL_BEGIN
typedef void (^PhobosGetIDFACompleteBlock)(NSString *idfa, NSInteger authoriza); typedef void (^PhobosGetIDFACompleteBlock)(NSString *idfa, NSInteger authoriza);
...@@ -20,8 +25,9 @@ typedef void (^PhobosGetIDFACompleteBlock)(NSString *idfa, NSInteger authoriza); ...@@ -20,8 +25,9 @@ typedef void (^PhobosGetIDFACompleteBlock)(NSString *idfa, NSInteger authoriza);
/// 获取IDFA,同步获取 从钥匙串中获取 /// 获取IDFA,同步获取 从钥匙串中获取
+ (NSString *)getIDFA; + (NSString *)getIDFA;
/// 获取IDFA,异步获取IDFA 适配 ATTrackingManager的时候再打开 /// 请求获取IDFA授权 (ios14 异步回调, ios14之前直接回调)
//+ (void)getIDFAString:(PhobosGetIDFACompleteBlock)completeBlock; /// @param completeBlock 回调执行结果
+ (void)requestTrackingAuthorizaWithCompletionHandler:(PhobosGetIDFACompleteBlock)completeBlock;
/// 获取IDFV /// 获取IDFV
+ (NSString *)getIDFV; + (NSString *)getIDFV;
...@@ -29,16 +35,23 @@ typedef void (^PhobosGetIDFACompleteBlock)(NSString *idfa, NSInteger authoriza); ...@@ -29,16 +35,23 @@ typedef void (^PhobosGetIDFACompleteBlock)(NSString *idfa, NSInteger authoriza);
/// 获取DEVICEID,先获取idfa 获取不到会获取钥匙串中idfv 如果没有用idfv 生成 /// 获取DEVICEID,先获取idfa 获取不到会获取钥匙串中idfv 如果没有用idfv 生成
+ (NSString *)getDEVICEID; + (NSString *)getDEVICEID;
/// 获取UQID,同步获取取出的是默认第一次的idfv 如果没有用idfv 生成 /// 获取UQID,同步获取取出的是默认第一次的idfv 如果没有用idfv 生成
+ (NSString *)getUQID; + (NSString *)getUQID;
//检查idfa 是否为空
+ (BOOL)checkIdfaIsNull:(NSString *)idfa;
#pragma mark - 钥匙串对外API
/*** @brief 给特定的键,标记钥匙串数据并存储 */
+ (void)storeObjectAtKeyChainWithkey:(NSString *)key object:(id <NSCoding>)object;
/*** @brief 给特定的键,获取对于的钥匙串数据 */
+ (id)fetchObjectAtKeyChainWithkey:(NSString *)key;
/*** @brief 删除特定的键,对应的钥匙串数据 */
+ (void)removeObjectAtKeyChainWithkey:(NSString *)key;
/// 用户是否点击了隐私协议 点击同意之后才会获取 device_id /// 用户是否点击了隐私协议 点击同意之后才会获取 device_id
+ (BOOL)showPrivatePolicy; + (BOOL)showPrivatePolicy;
/// 请求获取IDFA授权 (ios14 异步回调, ios14之前直接回调)
/// @param completeBlock 回调执行结果
+ (void)requestTrackingAuthorizaWithCompletionHandler:(PhobosGetIDFACompleteBlock)completeBlock;
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
#import "PhobosDevice.h" #import "PhobosDevice.h"
#import <AdSupport/ASIdentifierManager.h> #import <AdSupport/ASIdentifierManager.h>
#import <SAMKeychain/SAMKeychain.h>
#import <GMCache/GMCache.h> #import <GMCache/GMCache.h>
#import <SAMKeychain/SAMKeychain.h>
#import "PhobosUtil.h" #import "PhobosUtil.h"
NSString *const KprivatePolicyNotification = @"gm_popup_private_policy_notification"; NSString *const KprivatePolicyNotification = @"gm_popup_private_policy_notification";
...@@ -21,33 +21,11 @@ NSString *const IDFA = @"idfa"; ...@@ -21,33 +21,11 @@ NSString *const IDFA = @"idfa";
// 默认获取不到的idfa // 默认获取不到的idfa
NSString *defaultIDFA = @"00000000-0000-0000-0000-000000000000"; NSString *defaultIDFA = @"00000000-0000-0000-0000-000000000000";
static dispatch_queue_t queue; static dispatch_queue_t queue;
@implementation PhobosDevice @implementation PhobosDevice
#pragma mark - getIDFA #pragma mark - IDFA
/*同步获取IDFA 直接从钥匙串中获取 适配ATTrackingManagerAuthorization可使用下面方法
+ (NSString *)getIDFA {
if (![PhobosDevice showPrivatePolicy]) {
return defaultIDFA;
}
//直接从钥匙串中获取
NSString *keyChainIDFA = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
if ([self checkIdfaIsNull:keyChainIDFA]) {
//如果为空从钥匙串中取获取
keyChainIDFA = [self getKeyChainService:IDFA account:keyChainAccount];
} else {
//如果获取到存储到钥匙串中
[self saveKeyChainWithValue:keyChainIDFA service:IDFA account:keyChainAccount];
}
if ([self checkIdfaIsNull:keyChainIDFA]) {
keyChainIDFA = defaultIDFA;
}
return keyChainIDFA;
}*/
/** iOS 14 适配 ATTrackingManagerAuthorizationStatus */ /** iOS 14 适配 ATTrackingManagerAuthorizationStatus */
//同步获取IDFA 直接从钥匙串中获取 //同步获取IDFA 直接从钥匙串中获取
+ (NSString *)getIDFA { + (NSString *)getIDFA {
...@@ -55,8 +33,8 @@ static dispatch_queue_t queue; ...@@ -55,8 +33,8 @@ static dispatch_queue_t queue;
return defaultIDFA; return defaultIDFA;
} }
//直接从钥匙串中获取 //直接从钥匙串中获取
NSString *keyChainIDFA = [self getKeyChainService:IDFA account:keyChainAccount]; NSString *keyChainIDFA = [PhobosDevice fetchObjectAtKeyChainWithkey:IDFA];
if ([self checkIdfaIsNull:keyChainIDFA]) { if ([PhobosDevice checkIdfaIsNull:keyChainIDFA]) {
keyChainIDFA = defaultIDFA; keyChainIDFA = defaultIDFA;
} }
return keyChainIDFA; return keyChainIDFA;
...@@ -73,8 +51,8 @@ static dispatch_queue_t queue; ...@@ -73,8 +51,8 @@ static dispatch_queue_t queue;
NSString *idfaString; NSString *idfaString;
if (status == ATTrackingManagerAuthorizationStatusAuthorized) { if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString; idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
if (![self checkIdfaIsNull:idfaString]) { if (![PhobosDevice checkIdfaIsNull:idfaString]) {
[self saveKeyChainWithValue:idfaString service:IDFA account:keyChainAccount]; [PhobosDevice storeObjectAtKeyChainWithkey:IDFA object:idfaString];
} }
} else { } else {
// NSLog(@"请在设置-隐私-跟踪中允许App请求跟踪"); // NSLog(@"请在设置-隐私-跟踪中允许App请求跟踪");
...@@ -91,10 +69,10 @@ static dispatch_queue_t queue; ...@@ -91,10 +69,10 @@ static dispatch_queue_t queue;
NSString *idfaString; NSString *idfaString;
if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) { if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
idfaString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; idfaString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
if (![self checkIdfaIsNull:idfaString]) { if (![PhobosDevice checkIdfaIsNull:idfaString]) {
// 标示 用户已授权打开 // 标示 用户已授权打开
status = 3; status = 3;
[self saveKeyChainWithValue:idfaString service:IDFA account:keyChainAccount]; [PhobosDevice storeObjectAtKeyChainWithkey:IDFA object:idfaString];
} }
} else { } else {
// 表示用户拒绝打开 // 表示用户拒绝打开
...@@ -113,7 +91,7 @@ static dispatch_queue_t queue; ...@@ -113,7 +91,7 @@ static dispatch_queue_t queue;
return !idfa.length || [idfa isEqualToString:defaultIDFA]; return !idfa.length || [idfa isEqualToString:defaultIDFA];
} }
#pragma mark - getIDFV #pragma mark - IDFV
+ (NSString *)getIDFV { + (NSString *)getIDFV {
if (![PhobosDevice showPrivatePolicy]) { if (![PhobosDevice showPrivatePolicy]) {
return defaultIDFA; return defaultIDFA;
...@@ -121,7 +99,7 @@ static dispatch_queue_t queue; ...@@ -121,7 +99,7 @@ static dispatch_queue_t queue;
return [[[UIDevice currentDevice] identifierForVendor] UUIDString]; return [[[UIDevice currentDevice] identifierForVendor] UUIDString];
} }
#pragma mark - getDEVICEID #pragma mark - DEVICEID
+ (NSString *)getDEVICEID { + (NSString *)getDEVICEID {
if (![PhobosDevice showPrivatePolicy]) { if (![PhobosDevice showPrivatePolicy]) {
return defaultIDFA; return defaultIDFA;
...@@ -133,19 +111,19 @@ static dispatch_queue_t queue; ...@@ -133,19 +111,19 @@ static dispatch_queue_t queue;
return idfa; return idfa;
} }
#pragma mark - UQID
+ (NSString *)getUQID { + (NSString *)getUQID {
if (![PhobosDevice showPrivatePolicy]) { if (![PhobosDevice showPrivatePolicy]) {
return defaultIDFA; return defaultIDFA;
} }
NSString *deviceId = [self getKeyChainService:DEVICEID account:keyChainAccount]; NSString *deviceId = [PhobosDevice fetchObjectAtKeyChainWithkey:DEVICEID];
if ([self checkIdfaIsNull:deviceId]) { if ([PhobosDevice checkIdfaIsNull:deviceId]) {
deviceId = [self getIDFV]; deviceId = [self getIDFV];
[self saveKeyChainWithValue:deviceId service:DEVICEID account:keyChainAccount]; [PhobosDevice storeObjectAtKeyChainWithkey:DEVICEID object:deviceId];
} }
return deviceId; return deviceId;
} }
#pragma mark - 钥匙串封装 #pragma mark - 钥匙串封装
+ (void)saveKeyChainWithValue:(NSString *)value service:(NSString *)service account:(NSString *)account { + (void)saveKeyChainWithValue:(NSString *)value service:(NSString *)service account:(NSString *)account {
//避免在重复相同的key 重复设置 //避免在重复相同的key 重复设置
...@@ -162,9 +140,43 @@ static dispatch_queue_t queue; ...@@ -162,9 +140,43 @@ static dispatch_queue_t queue;
} }
} }
//根据 service 与账户keyChain 获取存储的值 /*** @brief 给特定的键,标记钥匙串数据并存储 */
+ (NSString *)getKeyChainService:(NSString *)service account:(NSString *)account { + (void)storeObjectAtKeyChainWithkey:(NSString *)key object:(id <NSCoding>)object {
return [SAMKeychain passwordForService:service account:account]; NSAssert([PhobosDevice gmKeyChain_isNonEmpty:key], @"key不能为空");
if (![PhobosDevice gmKeyChain_isNonEmpty:key]) {
return;
}
[self saveKeyChainWithValue:object service:key account:keyChainAccount];
}
/*** @brief 给特定的键,获取对于的钥匙串数据 */
+ (id)fetchObjectAtKeyChainWithkey:(NSString *)key {
NSAssert([PhobosDevice gmKeyChain_isNonEmpty:key], @"key不能为空");
if (![PhobosDevice gmKeyChain_isNonEmpty:key]) {
return nil;
}
return [SAMKeychain passwordForService:key account:keyChainAccount];
}
/*** @brief 删除特定的键,对应的钥匙串数据 */
+ (void)removeObjectAtKeyChainWithkey:(NSString *)key {
NSAssert([PhobosDevice gmKeyChain_isNonEmpty:key], @"key不能为空");
if (![PhobosDevice gmKeyChain_isNonEmpty:key]) {
return;
}
[SAMKeychain deletePasswordForService:key account:keyChainAccount];
}
+ (BOOL)gmKeyChain_isNonEmpty:(NSString *)key {
NSMutableCharacterSet *emptyStringSet = [[NSMutableCharacterSet alloc] init];
[emptyStringSet formUnionWithCharacterSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
[emptyStringSet formUnionWithCharacterSet: [NSCharacterSet characterSetWithCharactersInString: @" "]];
if ([key length] == 0) {
return NO;
}
NSString* str = [key stringByTrimmingCharactersInSet:emptyStringSet];
return [str length] > 0;
} }
+ (BOOL)showPrivatePolicy { + (BOOL)showPrivatePolicy {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment