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

增加钥匙串读取 和 删除api

parent 70630763
......@@ -9,9 +9,14 @@
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/ASIdentifierManager.h>
NS_ASSUME_NONNULL_BEGIN
// 钥匙串账户
extern NSString *const keyChainAccount;
// 钥匙串存储idfa
extern NSString *const IDFA;
/// 本地存储是否同意隐私弹框的标记
extern NSString *const KprivatePolicyNotification;
NS_ASSUME_NONNULL_BEGIN
typedef void (^PhobosGetIDFACompleteBlock)(NSString *idfa, NSInteger authoriza);
......@@ -20,8 +25,9 @@ typedef void (^PhobosGetIDFACompleteBlock)(NSString *idfa, NSInteger authoriza);
/// 获取IDFA,同步获取 从钥匙串中获取
+ (NSString *)getIDFA;
/// 获取IDFA,异步获取IDFA 适配 ATTrackingManager的时候再打开
//+ (void)getIDFAString:(PhobosGetIDFACompleteBlock)completeBlock;
/// 请求获取IDFA授权 (ios14 异步回调, ios14之前直接回调)
/// @param completeBlock 回调执行结果
+ (void)requestTrackingAuthorizaWithCompletionHandler:(PhobosGetIDFACompleteBlock)completeBlock;
/// 获取IDFV
+ (NSString *)getIDFV;
......@@ -29,16 +35,23 @@ typedef void (^PhobosGetIDFACompleteBlock)(NSString *idfa, NSInteger authoriza);
/// 获取DEVICEID,先获取idfa 获取不到会获取钥匙串中idfv 如果没有用idfv 生成
+ (NSString *)getDEVICEID;
/// 获取UQID,同步获取取出的是默认第一次的idfv 如果没有用idfv 生成
+ (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
+ (BOOL)showPrivatePolicy;
/// 请求获取IDFA授权 (ios14 异步回调, ios14之前直接回调)
/// @param completeBlock 回调执行结果
+ (void)requestTrackingAuthorizaWithCompletionHandler:(PhobosGetIDFACompleteBlock)completeBlock;
@end
NS_ASSUME_NONNULL_END
......@@ -7,8 +7,8 @@
#import "PhobosDevice.h"
#import <AdSupport/ASIdentifierManager.h>
#import <SAMKeychain/SAMKeychain.h>
#import <GMCache/GMCache.h>
#import <SAMKeychain/SAMKeychain.h>
#import "PhobosUtil.h"
NSString *const KprivatePolicyNotification = @"gm_popup_private_policy_notification";
......@@ -21,33 +21,11 @@ NSString *const IDFA = @"idfa";
// 默认获取不到的idfa
NSString *defaultIDFA = @"00000000-0000-0000-0000-000000000000";
static dispatch_queue_t queue;
@implementation PhobosDevice
#pragma mark - getIDFA
/*同步获取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;
}*/
#pragma mark - IDFA
/** iOS 14 适配 ATTrackingManagerAuthorizationStatus */
//同步获取IDFA 直接从钥匙串中获取
+ (NSString *)getIDFA {
......@@ -55,8 +33,8 @@ static dispatch_queue_t queue;
return defaultIDFA;
}
//直接从钥匙串中获取
NSString *keyChainIDFA = [self getKeyChainService:IDFA account:keyChainAccount];
if ([self checkIdfaIsNull:keyChainIDFA]) {
NSString *keyChainIDFA = [PhobosDevice fetchObjectAtKeyChainWithkey:IDFA];
if ([PhobosDevice checkIdfaIsNull:keyChainIDFA]) {
keyChainIDFA = defaultIDFA;
}
return keyChainIDFA;
......@@ -73,8 +51,8 @@ static dispatch_queue_t queue;
NSString *idfaString;
if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
if (![self checkIdfaIsNull:idfaString]) {
[self saveKeyChainWithValue:idfaString service:IDFA account:keyChainAccount];
if (![PhobosDevice checkIdfaIsNull:idfaString]) {
[PhobosDevice storeObjectAtKeyChainWithkey:IDFA object:idfaString];
}
} else {
// NSLog(@"请在设置-隐私-跟踪中允许App请求跟踪");
......@@ -91,10 +69,10 @@ static dispatch_queue_t queue;
NSString *idfaString;
if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
idfaString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
if (![self checkIdfaIsNull:idfaString]) {
if (![PhobosDevice checkIdfaIsNull:idfaString]) {
// 标示 用户已授权打开
status = 3;
[self saveKeyChainWithValue:idfaString service:IDFA account:keyChainAccount];
[PhobosDevice storeObjectAtKeyChainWithkey:IDFA object:idfaString];
}
} else {
// 表示用户拒绝打开
......@@ -113,7 +91,7 @@ static dispatch_queue_t queue;
return !idfa.length || [idfa isEqualToString:defaultIDFA];
}
#pragma mark - getIDFV
#pragma mark - IDFV
+ (NSString *)getIDFV {
if (![PhobosDevice showPrivatePolicy]) {
return defaultIDFA;
......@@ -121,7 +99,7 @@ static dispatch_queue_t queue;
return [[[UIDevice currentDevice] identifierForVendor] UUIDString];
}
#pragma mark - getDEVICEID
#pragma mark - DEVICEID
+ (NSString *)getDEVICEID {
if (![PhobosDevice showPrivatePolicy]) {
return defaultIDFA;
......@@ -133,19 +111,19 @@ static dispatch_queue_t queue;
return idfa;
}
#pragma mark - UQID
+ (NSString *)getUQID {
if (![PhobosDevice showPrivatePolicy]) {
return defaultIDFA;
}
NSString *deviceId = [self getKeyChainService:DEVICEID account:keyChainAccount];
if ([self checkIdfaIsNull:deviceId]) {
NSString *deviceId = [PhobosDevice fetchObjectAtKeyChainWithkey:DEVICEID];
if ([PhobosDevice checkIdfaIsNull:deviceId]) {
deviceId = [self getIDFV];
[self saveKeyChainWithValue:deviceId service:DEVICEID account:keyChainAccount];
[PhobosDevice storeObjectAtKeyChainWithkey:DEVICEID object:deviceId];
}
return deviceId;
}
#pragma mark - 钥匙串封装
+ (void)saveKeyChainWithValue:(NSString *)value service:(NSString *)service account:(NSString *)account {
//避免在重复相同的key 重复设置
......@@ -162,9 +140,43 @@ static dispatch_queue_t queue;
}
}
//根据 service 与账户keyChain 获取存储的值
+ (NSString *)getKeyChainService:(NSString *)service account:(NSString *)account {
return [SAMKeychain passwordForService:service account:account];
/*** @brief 给特定的键,标记钥匙串数据并存储 */
+ (void)storeObjectAtKeyChainWithkey:(NSString *)key object:(id <NSCoding>)object {
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 {
......
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