はじめに
本記事は、仕事とは無関係の個人で開発しているショッピングアプリでの開発での問題解決の記事です。
勤務先の仕事とは一切関係ありません。
お悩み
iOSアプリのiOS17.1対応をしていた際に、App Tracking Transparency(ATT)のダイアログが表示されなくなってリジェクトを食らった。
ローカルビルドの実機テストの際には表示されるのに、TestFlightにあげてインストールすると表示されなくなる。
不具合発生時の実装
viewDidLoadで以下のようなコードを実装していた。
#pragma mark - viewDidLoad
- (void)viewDidLoad {
[super viewDidLoad];
//〜中略
//広告のATT許可チェック
BOOL isTrackingEnabled = [[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled];
NSLog(@"isTrackingEnabled=%d",isTrackingEnabled);
if(!isTrackingEnabled){
[self requestTrackingAuthorization];
}
}
- (void)requestTrackingAuthorization {
if (@available(iOS 14, *)) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
switch (status) {
case ATTrackingManagerAuthorizationStatusAuthorized:
NSLog(@"トラッキングが許可されました");
break;
case ATTrackingManagerAuthorizationStatusDenied:
NSLog(@"トラッキングが拒否されました");
break;
case ATTrackingManagerAuthorizationStatusNotDetermined:
NSLog(@"トラッキングの許可がまだ選択されていません");
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
// ユーザーがトラッキングの許可または拒否を選択した後の処理
//〜中略
}];
break;
case ATTrackingManagerAuthorizationStatusRestricted:
NSLog(@"トラッキングが制限されています");
break;
default:
break;
}
}];
}
}
解決方法
どうやら、iOS17では、viewDidLoadで即座に
- requestTrackingAuthorization
を呼び出すと、表示されなくなっているっぽい。
(今回iOS17.1対応をしていたので、それ以下のVerの動作は確認していない。今までは問題なかった。)
「- (void)applicationDidBecomeActive:(UIApplication *)application に実装すれば良い。」
というような情報も見かけたが、自分はうまく動かなかった。(ローカルビルドの実機テストでは動くが、TestFlightからインストールするとダメ)
そこで、以下のように「requestTrackingAuthorization」の実行を意図的に遅延させることで、無事表示されるようになった。
#pragma mark - viewDidLoad
- (void)viewDidLoad {
[super viewDidLoad];
//〜中略
// viewDidLoadでATT許可チェックの呼び出しを1秒遅延させる
[self performSelector:@selector(delayedMethod) withObject:nil afterDelay:1.0];
}
-(void)delayedMethod
{
//広告のATT許可チェック
BOOL isTrackingEnabled = [[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled];
NSLog(@"isTrackingEnabled=%d",isTrackingEnabled);
if(!isTrackingEnabled){
[self requestTrackingAuthorization];
}
}
- (void)requestTrackingAuthorization {
//〜実装同じなので割愛
}
無事、AppStoreレビュー通りました!
iPhone / iPadともに同じ実装で大丈夫でした。
別の方法もあるのかもしれませんが、自分はこのような対応で今回の問題を解決しました。