iOS小技能:【idfa的使用】(适配iOS15下无法弹出IDFA权限申请视图)

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

引言

问题背景:ios审核被拒,iOS15下无法弹出IDFA权限申请视图

We're looking forward to completing our review, but we need more information to continue. Your app uses the AppTrackingTransparency framework, but we are unable to locate the App Tracking Transparency permission request when reviewed on iOS 15.1.

在这里插入图片描述

I、适配idfa

需求背景:极光推送和开屏广告都需要使用idfa来进行个性化功能

iOS接入开屏广告教程 : 以腾讯优量汇为案例(适配iOS15)

1.1 开屏广告获取idfa用于推送个性化广告

为iOS14.5升级所需要的修改,目的是请求用户授权,访问与应用相关的数据以跟踪用户或设备。详情请访问developer.apple.com/documentati…

在Info.plist中添加NSUserTrackingUsageDescription,描述获取IDFA等广告标识符的用途

	<key>NSUserTrackingUsageDescription</key>
	<string>该ID将用于向您推送个性化广告</string>

复制代码

弹窗小字文案建议:

  1. 获取标记权限向您提供更优质、安全的个性化服务及内容,未经同意我们不会用于其他目的;开启后,您也可以前往系统“设置-隐私 ”中随时关闭。

  2. 获取IDFA等广告标识符权限向您提供更优质、安全的个性化服务及内容;开启后,您也可以前往系统“设置-隐私 ”中随时关闭。

展示授权弹窗需要调用requestTrackingAuthorizationWithCompletionHandler:方法。

建议流量主等待方法回调完成后处理广告相关逻辑,这样如果用户授权使用IDFA等广告标识符信息,优量汇iOS SDK可以使用IDFA等广告标识符进行广告请求。代码如下:

#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>
...
- (void)requestIDFA {
  [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
    //  授权完成回调
     [self loadGDTAd];// 先加载
  }];
}

复制代码

完整适配代码如下

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    BOOL result = [GDTSDKConfig registerAppId:@""];//
    
    
    if (result) {
//        [self setupGDTSplashAd];
        [self requestIDFA];
        

        NSLog(@"注册成功");
    }

    return YES;
}
- (void)setupGDTSplashAd{
    
    // splash LoadAd 逻辑
    GDTSplashAd *splash = [[GDTSplashAd alloc] initWithPlacementId:@""];
    
    splash.delegate = self; //设置代理

    
//    if ([[UIScreen mainScreen] bounds].size.height >= 568.0f) {
//     splash.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"LaunchImage-568h"]];
//    } else {
//     splash.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"LaunchImage"]];
//    }
    splash.fetchDelay = 5; //开发者可以设置开屏拉取时间,超时则放弃展示
    self.splash =splash;
    
    //根据iPhone设备不同设置不同背景图
    
    UIImage *splashImage = [UIImage imageNamed:@"SplashNormal"];
    if (isIPhoneXSeries()) {
        splashImage = [UIImage imageNamed:@"SplashX"];
    } else if ([UIScreen mainScreen].bounds.size.height == 480) {
        splashImage = [UIImage imageNamed:@"SplashSmall"];
    }
    // * 是否需要开屏视频V+功能

//    self.splash.needZoomOut = self.supportZoomoutViewSwitch.isOn;
    self.splash.backgroundImage = splashImage;
    self.splash.backgroundImage.accessibilityIdentifier = @"splash_ad";

    //
    
    [self.splash loadFullScreenAd];


    

}


#pragma mark - GDTSplashAdDelegate

- (void)splashAdDidLoad:(GDTSplashAd *)splashAd {
//    if (splashAd.splashZoomOutView) {
//        [self.view addSubview:splashAd.splashZoomOutView];
//        splashAd.splashZoomOutView.rootViewController = self;
//        // 支持拖拽
//        [splashAd.splashZoomOutView supportDrag];
//    }
    NSLog(@"%s", __func__);
    
    NSString *text = [NSString stringWithFormat:@"%@ 广告拉取成功", splashAd.adNetworkName];
    
    
    NSLog(@"ecpm:%ld ecpmLevel:%@ text:%@", splashAd.eCPM, splashAd.eCPMLevel,text);
    
    // splash show逻辑
    //设置开屏自定义 logo,展示半屏开屏广告
    
    UIWindow *window = [[UIApplication sharedApplication] keyWindow];
    [self.splash showFullScreenAdInWindow:window withLogoImage:[UIImage imageNamed:@"img_login_logo"] skipView:nil];

}

- (void)splashAdSuccessPresentScreen:(GDTSplashAd *)splashAd
{
    NSLog(@"%s",__FUNCTION__);
//    self.tipsLabel.text = ;
    NSLog(@"广告展示成功");
    

}



- (void)requestIDFA {
    
    
    if([self isNeedrequestTrackingAuthorization]){
        
        if (@available(iOS 14, *)) {
            [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
              //  授权完成回调
               [self setupGDTSplashAd ];// 先加载loadGDTAd
            }];
              

        } else {
            [self setupGDTSplashAd ];// 先加载loadGDTAd


        }


    }else{
        
        [self setupGDTSplashAd ];// 先加载loadGDTAd

    }
    
    
    
    
}
- (BOOL)isNeedrequestTrackingAuthorization{

    
if (@available(iOS 14, *)) {
        ATTrackingManagerAuthorizationStatus status = ATTrackingManager.trackingAuthorizationStatus;
        switch (status) {
            case ATTrackingManagerAuthorizationStatusDenied:
                NSLog(@"用户拒绝");
                return YES;
                

                break;
            case ATTrackingManagerAuthorizationStatusAuthorized:
                NSLog(@"用户允许");
                break;
            case ATTrackingManagerAuthorizationStatusNotDetermined:
                NSLog(@"用户为做选择或未弹窗");
                return YES;

                break;
            default:
                break;
        }
    } else {
        // Fallback on earlier versions
       if ([ASIdentifierManager.sharedManager isAdvertisingTrackingEnabled]) {
       }else {
          NSLog(@"用户开启了限制广告追踪");
       }
    }
    
    
    return NO;
    
    
}



复制代码

对于用户拒绝授权 UserTracking 的情况,可以考虑接入苹果的 SKAdNetwork 框架进行广告分析。

developer.apple.com/documentati…

    <key>SKAdNetworkItems</key>
    <array>
        <dict>
            <key>SKAdNetworkIdentifier</key>
            <string>f7s53z58qe.skadnetwork</string>
        </dict>
        <dict>
             <key>SKAdNetworkIdentifier</key>
             <string>example200.skadnetwork</string>
        </dict>
    </array>

复制代码

SKAdNetworkIdentifier : f7s53z58qe.skadnetwork 在这里插入图片描述

在这里插入图片描述

1.2 极光推送

iOS14.5.1适配【To use the AppTrackingTransparency framework】使用AppTrackingTransparency以请求用户授权获取IDFA信息

———————————————— 版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/z929118967/…

注册极光

    [JPUSHService setupWithOption:launchOptions appKey:@"" channel:@"App Store" apsForProduction:YES advertisingIdentifier:[self testIDFA]];

复制代码

获取idfaString

#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>

- (NSString*)testIDFA {
    NSString  __block *idfaString = @"";
    
    
    
    if (@available(iOS 14, *)) {
        [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
            if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
                idfaString  = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
                
            }
        }];
    } else {
        // 使用原方式访问 IDFA
        if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
             idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
        }


    }
    NSLog(@"idfaString: %@", idfaString);

    return idfaString;
    
}


复制代码

1.3 上架权限配置

新增开屏广告功能,appstoreconnect后台的app隐私声明,采集数据需要包含idfa,需要添加idfa用于广告,否则会被拒绝。

具体配置:

app主页的隐私收集这次新增了标识符->广告标识符用于第三方广告,未与用户身份关联,会将设备ID用于追踪目的。 在这里插入图片描述

1.4 iOS15适配

在iOS15中如果在AppDelegate中的didFinishLaunchingWithOptions方法中调用 + (void)requestTrackingAuthorizationWithCompletionHandler:(void(^)(ATTrackingManagerAuthorizationStatus status))completion; ,则无法弹出权限申请的弹框。

解决方法采用 延迟调用: 推荐在- (void)applicationDidBecomeActive:(UIApplication *)application { 方法中弹出idfa权限申请视图。如果没有弹出,则延迟1秒调用

[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
              //  授权完成回调
               [self setupGDTSplashAd ];// 先加载loadGDTAd
            }];

复制代码

程序进入前台,才申请idfa权限


- (void)applicationDidBecomeActive:(UIApplication *)application {
    
    if([self isNeedrequestTrackingAuthorization]){
        if (@available(iOS 14, *)) {
            [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
              //  授权完成回调
    //           [self setupGDTSplashAd ];// 先加载loadGDTAd
            }];
                      
        }
    }
    
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
    [JPUSHService setBadge:0];



    
        
}

复制代码

see also

更多内容请关注 #小程序:iOS逆向,只为你呈现有价值的信息,专注于移动端技术研究领域;更多服务和咨询请关注#公众号:iOS逆向

Guess you like

Origin juejin.im/post/7032207765137588254