前言
在做项目过程中总免不了苹果隐私这个问题,广告标识符便是其中的一个让人琢磨的事情。
一、IDFA代码实现
1、也许你在项目中一直在info.plist里设置权限申请:
<key>NSUserTrackingUsageDescription</key>
<string>此标识符将用于向您推荐个性化广告。</string>
这个描述可能被拒,建议说明得详细点如:
请放心,开启权限不会获取您在其他站点的隐私信息,该权限仅用于标识设备、第三方广告、并保障服务安全与提示浏览体验
类似这样,就容易过审。
2、也许你在项目中也写了对应的广告标识符授权代码:
//导入框架
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/ASIdentifierManager.h>
if (@available(iOS 14, *)) {
// iOS14及以上版本需要先请求权限
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
// 获取到权限后,依然使用老方法获取idfa
if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
NSString *idfa = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];
NSLog(@"%@",idfa);
} else {
NSLog(@"请在设置-隐私-跟踪中允许App请求跟踪");
}}];
}else {
// iOS14以下版本依然使用老方法 // 判断在设置-隐私里用户是否打开了广告跟踪
if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
NSString *idfa = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString]; NSLog(@"%@",idfa);
} else {
NSLog(@"请在设置-隐私-广告中打开广告跟踪功能");
}
}
但是运行验证的时候却没有弹窗,下面是解决弹窗的方法:
1、iPhone手机没有设置广告标识符开关
检查设置---->隐私---->跟踪---->允许App请求跟踪开关是否打开。
2、iPhone手机iOS版本是否是iOS15以上
如果是iOS15以上,那么可能广告标识符不弹窗,因为iOS 15 对 AppTrackingTransparency 框架做了调整,需要满足以下 2 点:
- 应用当前的状态为 UIApplicationStateActive。
- 当前没有其他的授权弹窗。
当满足以上 2 点后,再检查 ATTrackingManagerAuthorizationStatus 和请求授权。因此,可以在以下的选项中选择一个作为调整方案:
1、启动应用后,延时 1~2 秒去检查和申请权限。
2、在主控制器的 “ViewDidAppear” 方法中检查和申请权限(推荐)。
3、在FinishLaunching和BecomeActive分别写请求授权方法请求
使用类似递归方式去获取授权:
-(void)initAds
{
UIApplication *applicaiton = [UIApplication sharedApplication];
if (applicaiton.applicationState == UIApplicationStateActive)
{
if (@available(iOS 14, *)) {
ATTrackingManagerAuthorizationStatus status = [ATTrackingManager trackingAuthorizationStatus];
if(status == ATTrackingManagerAuthorizationStatusNotDetermined){
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
// Tracking authorization completed. Start loading ads here.
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self loadBannerAd];
[self createAndLoadInterstitial];
}];
}];
}else{
[self loadBannerAd];
[self createAndLoadInterstitial];
}
}else{
// Fallback on earlier versions
}
}else{
[self performSelector:@selector(initAds)
withObject:nil
afterDelay:0.5f];
}
}
延迟调用方法:
if #available(iOS 14.0, *) {
DispatchQueue.main.asyncAfter(deadline: .now() +1) {
ATTrackingManager.requestTrackingAuthorization{ (status)in
}
}
}else{
if ASIdentifierManager.shared().isAdvertisingTrackingEnabled{
advertisingId =ASIdentifierManager.shared().advertisingIdentifier.uuidString
print(" 低于 iOS 14.0 advertisingId : ",advertisingId)
}else{
}
}
END.