IDFAの実装について(トラッキング関連)


広告のトラッキングの実装についてIDFAの実装が必要となります。
簡易的な方法となりますが、下記の実装方法があります。

※実装前にプロジェクトのコピー(バックアップ)をとってから実装することをお勧めします。

IDFA対応コードの実装
No必須・任意実装概要
1必須追加する広告の実装
2必須フレームワークの追加
3必須Info.plistの項目追加
4任意多言語化対応
5必須IDFAコード実装

1.追加する広告の実装
開発者ごとに異なると思います。
実装方法は各広告媒体会社にお問い合わせください。

2.フレームワークの追加
※下の画像をご覧ください。
(1) プロジェクトを選択します。
(2) TARGETSを選択します。
(3) Generalタブを選択します。
(4) 下方向にスクロールをすると
(5) 「Framework」の項目が見えます。
(6) +ボタンでフレームワークを追加します。


下記の2点のフレームワークを追加します。
(1)AdSupport.framework
(2)AppTrackingTransparency.framework

3.Info.plistの項目追加

「Info.plist」に次の項目を追加してください。
KeyPrivacy - Tracking Usage Description
Valueメッセージに表示する内容を入力します。
※xmlに直接追加する場合は「NSUserTrackingUsageDescription」となるはずです。

4.多言語化対応
多言語化処理は任意の情報となります。
日本語のみでなく、英語などの複数言語を公開している場合は
そのユーザに対応した言語を表示したいケースがあると思います。
その方法として「info.plist.stringの多言語化」があります。


4-1. 言語の追加

(1)プロジェクトを選択します。
(2)PROJECTを選択します。
(3)Infoタブを選択します。
(4)下にスクロールしていき、「Localizations」の項目の+ボタンを選択します。
(5)Japanese(ja)を選択します。

4-2.Strings Fileの追加

(1)プロジェクトを選択して「New File...」を選択します。
(2)iOSタブを選択して下方向にスクロールし、「Resource」グループの「Strings File」を選択します。
(3)Save Asテキストボックスに「InfoPlist.strings」を入力してCreateボタンを選択します。
※この名称を間違えると失敗するようですので、気をつけて入力してください。

4-3. Localizeの追加

(1)「Localize...」ボタンを選択します。
(2)追加する言語を選択します。

4-4. 多言語化のメッセージを追加

図のように言語ごとに表示するメッセージを入力してください。

5. IDFAコード実装
下記にコードの実装サンプルを記載します。
開発者の開発により、実装に適した実装にしてください。

今までは、下記のタイミングで実装していたと思います。
(1)AppDelegate
(2)SceneDelegate
(3)viewDidLoad
しかし、広告の実装を済ませてから、IDFAを実行するのが正規手順となったようで
iOS15からは上記(1)から(3)に実装しているとIDFAのメッセージダイアログが表示されません。

そのためにも、「UIApplicationStateActive」の値がtrueになっている場所での実装が必要となります。
(例)
if (UIApplication.sharedApplication.applicationState == UIApplicationStateActive)
{
    NSLog(@"UIApplicationStateActive is true.");
}


例えば、下記に記したviewDidAppearイベントではなく、
ボタンをタップしたタイミングで実装する開発者の方もいらっしゃるようです。

[コード実装例]
※Objective-C
-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self requestIDFA];
}

-(void)requestIDFA
{
    ASIdentifierManager *identifierManager = [ASIdentifierManager sharedManager];
    if (@available(iOS 14, *))
    {
        // iOS14以降の処理
        //IDFAダイアログを表示したいタイミングで次のコードを実行します。
        //この時にNSUserTrackingUsageDescriptionにメッセージの内容を追加しておく必要があります。
        [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status)
        {
            //広告の取得開始方法
            [GADMobileAds.sharedInstance startWithCompletionHandler:^(GADInitializationStatus * _Nonnull status) 
            {
                //ここで広告をリロードするなどしてください
            }];
            if (status == ATTrackingManagerAuthorizationStatusAuthorized
                || status == ATTrackingManagerAuthorizationStatusNotDetermined)
            {
                //ユーザがプライバシー設定で「トラックしない」を選択していない(オプトイン)
                //もしくはrequestTrackingAuthorizationWithCompletionHandlerでダイアログをまだ表示していません。
                //NSString *idfa = identifierManager.advertisingIdentifier.UUIDString;
                //NSLog(@"idfa:%@",idfa);
                // 取得したIDFAで何かするコード
            }
            else if (status == ATTrackingManagerAuthorizationStatusDenied)
            {
                // ユーザがプライバシー設定で「トラックしない」を選択(オプトアウト)
                // IDFAが取得できなかった場合のコード
            }
            else
            {
                // それ以外のなにか
            }
        }];
    }
    else
    {
        // iOS13以前の処理
        //ASIdentifierManager *identifierManager = [ASIdentifierManager sharedManager];
        if ([identifierManager isAdvertisingTrackingEnabled])
        {
            //NSString *idfa = identifierManager.advertisingIdentifier.UUIDString;
            //NSLog(@"idfa:%@",idfa);
            //取得したIDFAで何かするコード
        }
        else
        {
            //NSLog(@"failure");
            //IDFAが取得できなかった場合のコード
        }
    }
}

サンプルをコピー
UUIDについて
他の広告ではUUID文字列を引数に設定しているようですが、
GoogleのAdMobを使用している場合は、AdMob側でUUIDの実装判定をしているようで
その必要がないようです。

AdMobのSKAdNetwork 対応について
前提条件: Google Mobile Ads SDK 7.64.0 以降
上記前提条件を満たすと、何もしなくても自動的に登録されるようです。

[URL]
https://developers.google.com/admob/ios/ios14#skadnetwork
[審査についての補足情報]
2022年4月上旬に申請した時点では審査チームはiOS15以上でテストをしているようで
iOS15向けの実装をしておいた方がいいと思われます。
IDFAが正しく表示されているキャプチャでは審査を受け付けてもらえませんでした。
動画で撮影したものを準備した方がいいと思います。
シミュレーターでキャプチャをした画像を提出しましたが、
iPhone実機で撮影したものでなければ審査として受け付けないという返信をされました。

動画についてはiOSに標準で使用可能な画面録画アプリで問題ないと思います。

[提出をしたときにリジェクトされたときの文書抜粋]
Guideline 2.1 - Information Needed



We're looking forward to completing our review of your app. Before we can continue, we need a video that demonstrates the current version, 1.2.7, in use on a physical iOS device.

Specifically, we need a demo video that shows the App Tracking Transparency permission request in your app. The video should show what the user sees after selecting "Ask App Not to Track" and "Allow," as well as any prompts or messages that appear before the permission request.

Keep these requirements in mind as you make your demo video:

- Only use footage of your app running on a physical iOS device, not on a simulator.
- Make sure the video clearly documents all relevant app features, services, and user permission requests.
- You can use a screen recorder to capture footage of your app in use.

Next Steps

Create the demo video, add a link to the video in the App Review Information section of your app’s page in App Store Connect, and reply to this message in App Store Connect.

To add the video link:

- Sign in to App Store Connect.
- Click on My Apps.
- Select your app.
- Click on the app version on the left side of the screen.
- Scroll down to App Review Information.
- Provide the demo video link and any necessary access details in the Notes section.
- Click the Save button at the top of the Version Information page.

Please note that if your app can only be reviewed with a demo video, you’ll need to provide an updated demo video for every app submission.

Resources

To learn more about providing information to App Store Review in App Store Connect, see App Store Connect Help.


> Keep these requirements in mind as you make your demo video:
>
> - Only use footage of your app running on a physical iOS device, not on a simulator.
> - Make sure the video clearly documents all relevant app features, services, and user permission requests.
> - You can use a screen recorder to capture footage of your app in use.
上記に記載しているようにiPhone実機で動画を撮影したものを提出してね
といっています。

このことからも動画による提出が必要になるものと思われます。

iPhoneの画面録画のやり方を解説|内部音声や外部音声のみの設定方法
[URL]
https://www.nojima.co.jp/support/koneta/82292/?amp=1
iPhoneで画面録画(スクショ動画を撮影)する方法──できないときの対策も解説
[URL]
https://appllio.com/iphone-take-screenshots-video-capture
[動画の撮影ポイント]
※念のため、審査に提出した撮影した動画ファイルは言語を英語にして撮影したものを提出しました。

1. トラッキング画面
設定画面→プライバシー→トラッキングの順で開き、トラッキング画面の状態を表示します。
このとき、許可(ON:緑色)の状態で撮影しました。
IDFAダイアログ実行済みの(審査する)アプリがあると、IDFAダイアログは一度実行すると実行されなくなります。
IDFAの動作確認にならないため、必要に応じてアプリのデータバックアップなどをして、
一度、アプリを削除してから実行することになると思います。

2. IDFAダイアログの表示
iPhone実機をXcodeに接続し、アプリを実行します。
正しく実装されていると、実装した場所でIDFAの確認ダイアログが表示されるはずです。
「許可」ボタンを
選択して、広告が正しく表示される状態を表示します。

3. トラッキング画面を再表示
トラッキング画面に戻ります。
結果を反映させるため、一度、プライバシー画面に戻ります。
再度、トラッキング画面を開きます。
追加したアプリのIDFAの状態が正しく反映されている状態を表示します。

上記、結果を撮影してmp4動画ファイルにして審査に提出するといいはずです。

iOSのステータスバーの高さ取得について(iOS15以降)

iOSのステータスバーの高さの取得方法に変更になったようです。
※Objective-Cでの実装方法となります。

[コード実装例]
※Objective-C
CGFloat height = 0.0f;
NSSet *scenes = [[UIApplication sharedApplication] connectedScenes];
for (UIScene *scene in scenes)
{
    if ([scene isKindOfClass:[UIWindowScene class]])
    {
        UIWindowScene *windowScene = (UIWindowScene*)scene;
        height = windowScene.statusBarManager.statusBarFrame.size.height;
        break;
    }
}

サンプルをコピー
[経緯]
今までは下記の実装によりステータスバーの高さを取得していました。
CGFloat height = [UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.statusBarFrame.size.height;

しかし、iOS15からはDeprecatedになっているため変更の必要が生じました。
[警告メッセージ]
'windows' is deprecated: first deprecated in iOS 15.0 - Use UIWindowScene.windows on a relevant window scene instead

statusBarFrameを参照するとAPI_DEPRECATEDメッセージが下記のように表示されていました。
Use the statusBarManager property of the window scene instead.

そのため、下記のようにしてSceneオブジェクトを生成しようとしたのですが下記の警告メッセージが表示されました。
UIWindowScene *scene = UIApplication.sharedApplication.connectedScenes;
[警告メッセージ]
Incompatible pointer types initializing 'UIWindowScene *' with an expression of type 'API_AVAILABLE(ios(13.0)) NSSet *'

ここでNSSetを使用してくださいというメッセージが表示されているので、
オブジェクトを生成するために下記のように宣言をしました。
NSSet *scenes = [[UIApplication sharedApplication] connectedScenes];

上記のままではsceneオブジェクトの中にUIWindowSceneがどれなのかがわかりません。
そのため、for文を使用して判定処理をした後、UIWindowSceneでキャストをしたオブジェクトに対して
statusBarFrameプロパティからステータスバーの高さを取得しました。

迷惑メールに気をつけて
1/2
迷惑メールの例
迷惑メールの対策については、下記が参考になります。
迷惑メールが届いてい困った場合や、迷惑メールの相談先が掲載されています。
迷惑メールに気をつけて安心して、ご利用くださいね。
もしかして迷惑メールだと思ったら開かないように気をつけてください。
迷惑メールにはフィルタリングの設定も有効です。
パソコンやスマートフォンにフィルタリングの設定をていない場合はフィルタリングの設定をすることをお勧めします。
例えば、ドコモのスマホにフィルタリングを設定するため
Yahoo!やGoogleなどの検索ボックスから「迷惑メール フィルタリング ドコモ」と入力して検索すると設定の一覧が表示されます。
また、身に覚えのないメールには返信しないように心がけるとか
添付ファイルやリンクは不用意に開かないことをお勧めします。
間違えてリンクをクリック(タップ)しても画面が開いても何もしないで閉じることをお勧めします。
また、ウイルス対策ソフトをインストールしている場合はウイルスチェックをしてください。

[総務省関連]
「総務省トップ > 政策 > 情報通信(ICT政策) > 電気通信政策の推進 > 電気通信消費者情報コーナー > 迷惑メール対策 」を開く
[国民生活センター関連]
「独立行政法人 国民生活センター」を開く
[迷惑メール相談センター関連]
「日本データ通信協会 迷惑メール相談センター」を開く
[J:COMサポート 迷惑メール撃退サービス関連]
「J:COMサポート 迷惑メール撃退サービス関連」を開く
できるかな (WEBアプリ)
全部で10問あります。
例題→問題の繰り返しでゲームを実行します。
ゲームを中止したい場合は「中止」ボタンをタップしてください。
10問すべて答えると「こたえあわせ」の画面が開きます。
問題の答えと結果を確認することができます。
「できるかな」画面を開きます
ミニ脳トレ (WEBアプリ)
何が来たの?
一番前の絵と同じ絵のボタンを次々にタップしてください。
「何が来たの?」画面を開きます
旗あげ
指示通りに旗をあげさげしてしてください。
赤について指示があれば赤の旗をあげさげしてください。
「旗あげ」画面を開きます
順に消してね
上のグループの並び順とおなじ絵を順番にタップしてね。
上のグループがすべて消えたら次の問題が表示されるよ。
「順に消してね」画面を開きます
重複してるのは?
重複してるものをすべて選んで決定してね。
正解すると次の問題が表示されるよ。
「重複してるのは?」画面を開きます
神経衰弱
すべてのペアを選んでね。
すべてめくると次の問題が表示されるよ。
「神経衰弱」画面を開きます
じゃんけん
指示にあったじゃんけんをしてね。
勝つ指示があった場合、相手がグーを出したらパーを選んでね。
「じゃんけん」画面を開きます
計算
指示に従った計算をしてね。
左上の画像の指示と同じ絵を計算してね。
「計算」画面を開きます
いなかったのは誰?
最初にいなかったキャラを選んでね。
最初に表示されたキャラと比較して次に表示された最初にいないキャラを選んでね。
「いなかったのは誰?」画面を開きます

今日の「ことわざ」の問題
ことわざ雨が降ろうが槍が降ろうが
適切な「ことわざ」の意味を3択から選んでね。
威厳はあるが威張っていない。
どんな困難があっても必ずやりとげるという強い決意のたとえ。
医者は不養生しがちで若死にをし、僧侶は堕落して地獄に落ちる者が多いということ。他人を救う立場にある人も、自分のこととなるとついおろそかになることのたとえ。


今日の「四字熟語」の問題
四字熟語以貌取人
適切な「四字熟語」の意味を3択から選んでね。
その場その場に対応して仏法の真理を悟らせようとする説法。
人の能力や言動を考えないで、容貌だけを見て人を採用すること。顔つきで人を判断する。
口先の弁舌で自分の知識を飾り立てようとすること。実力がないのに巧みな弁舌で知識があるようにみせかけること。


今日の「おさかな」の問題
「おさかな」の「漢字」
適切な「おさかな」の「ふりがな」を3択から選んでね。
なまず
たい
いるか

今日の誕生花
誕生花ヒメハギ
花言葉隠者

AppStoreおよびObjective-Cのお知らせ

AppStoreのお知らせ
参考までに(迷惑メールに気をつけて)
AppStoreを開く
参考までに(迷惑メールに気をつけて)
すごろく(おばけやしき)
おばけやしきの入り口から屋敷内を通って出口のゴールするすごろくゲームです。
コマを進める手段は
(1)サイコロ
(2)カード
のいずれかとなります。
(1)サイコロ
「サイコロ」ボタンをタップするとサイコロが回ります。
サイコロが表示されると次のボタンが表示されます。
(1)キャンセルボタン
サイコロを中止してキャンセルします。
(2)決定ボタン
サイコロが回っているのを停止してサイコロの目を決定します。
[ゴール]
ゴールのマス目にピッタリ止まってくださいね。
[New Game]
1人から3人まで選んでください。
[コンティニュー]
前回の続きをロードできます。
コンティニューに使われるオートセーブは
ターン終了後に実行します。
そのため、「ロード」をしたり、
再度ゲームをして「New Game」にすると
コンティニュー用の保存データは上書きされ、
前回保存していたコンティニューデータは消えます。
1人であればユーザ終了後、
3人でゲームした場合は
各ユーザのターン終了後にオートセーブされます。
[ロード]
セーブしたデータがあれば、その中から選んだデータをロードできます。
[セーブ]
各ユーザのターン終了後に保存できます。
3人でゲームした場合は
(1)1人目のターン終了後
(2)2人目のターン終了後
(3)3人目のターン終了後
の3種類のいずれかのタイミングでセーブができます。
[マップ]
1.マップ
その部屋のマップを確認できます。
マップは左右上下の方向ボタンで切り替えて確認できます。
2.イベント
カードやおばけとのバトルが発生します。
3.宝箱
おばけとバトルに使うソードや弓が入っています。
一度開けると空箱になります。
4.扉
隣の部屋に通じる場所です。
5.階段
上の階もしくは下の階に降りる場合に使用します。
6.壁
通り抜けはできません。
7.通り道
隣の屋敷に通じる通路です。
[カード]
1.所持可能枚数
20枚が限度です。
20枚を所持し、カードを取得した場合は、いずれか一枚を捨てることになります。
カードの順番は順不同です(カードを引いた順番)。
カードを持っている場合は、カードボタンをタップするとカード画面が開きます。
左右ボタンでカードを切り替えて選択してください。
2.カードの種類
(1)コマを進めるカード
1から6まで進めるカードがあります。
(2)対決カード
各おばけ専用の対決カードがあります。
(3)護符カード
おばけと対決するためのカードです。
(4)その他
ゲーム内で確認してください。
[バトル]
おばけとのバトル
(1)逃げる
(2)カード
(3)攻撃
のいずれかを選択してください。
バトルに勝つと恐怖心がゼロに戻ります。
(1)逃げる
バトルはしないで逃げます。
逃げる際に失敗すると恐怖心ダメージを負います。
恐怖心のダメージがMAXになるとリタイアとなります。
(2)カード
バトルが面でカードボタンが表示されます。
このカードはおばけと戦うためのカードを所持している場合のみ有効です。
カードをについて左右ボタンで使用するカードを切り替えて攻撃に使用するカードを選んでください。
(3)攻撃
ソードもしくは弓の2種類から選択してください。
ソードもしくは弓は宝箱(ランダム)に入っています。
もしも開けたしまった宝箱からはとることができません。
ソードと弓の2つを所持している場合は、攻撃を選択すると、どちらを使用するか?の確認ボタンが表示されます。
攻撃に使用する方を選んでください。
ソード:弓と比較するとダメージが少ない可能性があります。
弓:ソードと比較すると攻撃が当たらない可能性があります。
戦うカードもしくはソードや弓がない場合は、逃げるボタンをタップするしかありません。
恐怖心がマックスになるとゲームリタイアになります。
[情報]
情報ボタンをタップすると
参加したプレイヤーの情報を表示します。
見えない部分はスクロールをして、ご確認ください。
[結果発表]
全員のゴールもしくはリタイアが決まった後に一覧で表示します。
見えない部分はスクロールをして、ご確認ください。
ゲーム終了ボタンをタップすると前の画面に戻ります。

下記は日本語のみとなります。

[計算]
計算問題です。

[暗記]
ストーリー形式の暗記問題です。

[観察]
(1) あの人です
(2) だるまさんがころんだ
(3) いのししハンティング
(4) またぎ
(5) いなばのうさぎを連れてって

[占い]
おみくじタイプの占いです。

[判断]
判断が必要な問題です。
(1) 素数ジャッジメント
(2) 連続していない数字はどれ
(3) 数字を並び替え
(4) 見つけてね
(5) プレゼントを間違えないで

[お知らせ]
迷惑メールについて

[ヘルプ]
各ヘルプがあります。

今後とも、abc3.meをよろしくお願いします。

by abc3.me
abc3.me02(水道光熱費)
AppStoreを開く
abc3.me02(水道光熱費管理)

[ver 1.2.7]

[修正概要]
IDFA確認ダイアログ表示処理追加
AdMobのトラッキング処理のため確認ダイアログが一度だけ表示されます。
「プライバシー」設定で、アクティビティを追跡してもよいか許可を変更したい場合は
設定」>「プライバシー」>「トラッキング」の順に選択して変更をすることができるようです。
IDFAはアプリ個別に許可の変更を設定できます。
Googleが端末識別番号UUIDを使用してユーザが見てみたい広告を表示してもいいか?(許可)、ランダムに表示される広告で構わない(許可しない)?を選択してください。
(1) 許可ボタン:
おすすめの広告を表示します。
(2) Appにトラッキングしないように要求ボタン:
ユーザが興味ない広告を表示します。
※いずれにせよ、広告は表示されます。
[開発ユーザへのメモ]
iOS15以上の対応として
広告にトラッキング処理を実装するため、例えば下記のような
(1) AppDelegate
(2) SceneDelegate
(3) 起動画面のモジュールの- (void)viewDidLoad
場所に処理を実装すると、IDFAの確認画面が表示されません。
そのため、UIApplicationStateActiveである場所での実装が必要となります。
例えば、画面モジュールで画面作成し準備が整った後で実行されるメソッド
-(void)viewDidAppear:(BOOL)animated
※Objective-Cのケース
などが対象となります。
どの時点で実行するか?については各開発者が設計に適した場所で実装してください。

OS最小バージョン変更
今回使用したXcodeのiOSバージョンのターゲットが最小9.0でしたので
iOSのバージョンを引きあげざるをえませんでした。
※TARGETSのGeneralのVersionテキストボックスに直接入力してもダメぽかったので9.0にしました。
総務省で公開している2021年度データの比較用データを追加
※総務省に問合わせをし、利用目的を説明し了解を得ております。
無断で総務省の公開データを使用しないよう、ご留意ください。

今後とも、abc3.meをよろしくお願いします。

by abc3.me
ESP TEST
AppStoreを開く
[ver 1.3]
[修正概要]
AdMobをWKWebViewを使用するSDKに対応しました。
[修正内容]
iOS向けのGoogle Mobile Ads SDKに更新をしました。
巫女うらない
AppStoreを開く
[ver 1.2]
[修正概要]
AdMobをWKWebViewを使用するSDKに対応しました。
[修正内容]
iOS向けのGoogle Mobile Ads SDKに更新をしました。
おぼえる英単語
AppStoreを開く
[ver 1.10]
iPhone XS/XR画面の画面上部のレイアウトを修正しました。
AdMobをWKWebViewを使用するSDKに対応しました。
[修正概要]
AdMobをWKWebViewを使用するSDKに対応しました。
[修正内容]
iOS向けのGoogle Mobile Ads SDKに更新をしました。
ミニ脳トレ
AppStoreを開く
[ver 4.51]
[修正概要]
(1)ステータスバーの高さ
iPhone XS/XR画面の画面上部のステータスバーの高さをiOS13.0以降と未満に分岐処理変更処理をしました。
(2)AdMob更新
AdMobをWKWebViewを使用するSDKに対応しました。
[修正内容]
(修正例)
(1)ステータスバーの高さ
[iOS13.0以降]
[UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.statusBarFrame.size.height;
[iOS13.0未満]
UIApplication.sharedApplication.statusBarFrame.size.height;
(2)AdMob更新
AdMobをGoogle Mobile Ads SDK(WKWebViewを使用するSDK)に更新をしました。
ミニすごろく
AppStoreを開く
[ver 1.1]
[修正概要]
(1)ステータスバーの高さ
iPhone XS/XR画面の画面上部のステータスバーの高さをiOS13.0以降と未満に分岐処理の変更をしました。
(2)AdMob更新
AdMobをWKWebViewを使用するSDKに対応しました。
[修正内容]
(修正例)
(1)ステータスバーの高さ
[iOS13.0以降]
[UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.statusBarFrame.size.height;
[iOS13.0未満]
UIApplication.sharedApplication.statusBarFrame.size.height;
(2)AdMob更新
AdMobをGoogle Mobile Ads SDK(WKWebViewを使用するSDK)に更新をしました。
給与レポート
AppStoreを開く
[ver 1.17]
[修正概要]
(1)ステータスバーの高さ
iPhone XS/XR画面の画面上部のステータスバーの高さをiOS13.0以降と未満に分岐する処理に変更しました。
(2)AdMob更新
AdMobをWKWebViewを使用するSDKに対応しました。
[修正内容]
(修正例)
(1)ステータスバーの高さ
[iOS13.0以降]
[UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.statusBarFrame.size.height;
[iOS13.0未満]
UIApplication.sharedApplication.statusBarFrame.size.height;
(2)AdMob更新
AdMobをGoogle Mobile Ads SDK(WKWebViewを使用するSDK)に更新をしました。

Objective-Cのお知らせ
ステータスバーの高さ取得について
[ステータスバーの高さの取得例]
※Xcode 11.5を使用したケース
※iOS 13.0以降を想定したケース

ヘッダの宣言
//UIApplicationを実行するためにUIKitを宣言します
#import <UIKit/UIKit.h>

+(CGFloat)getStatusBarHeight;

モジュールの実装
+(CGFloat)getStatusBarHeight
{
    CGFloat height = 0.0f;
    if (@available(iOS 13.0, *))
    {
        //iOS 13.0以降のケース
        height = [UIApplication sharedApplication].windows.firstObject.windowScene.statusBarManager.
statusBarFrame.size.height;
    }
    else
    {
        //iOS 13.0未満のケース
        height = UIApplication.sharedApplication.statusBarFrame.size.height;
    }
    return height;
}

AppStore申請について
Info.plistのprivacy項目について
[NSBluetoothAlwaysUsageDescription]
上記項目はInfo.plistにある項目となります。
開発者様が作成されたアプリにprivacy項目を含む機能がある場合、その通知メッセージをユーザに表示することができる機能です。

iOSではユーザに通知をする場合、iOS側で用意したデフォルトメッセージを表示してくれますが、開発者側で用意したメッセージを表示するようにして欲しいようです。
そのため申請によっては通知メッセージを表示してくださるように、再提出の依頼がある可能性があります。

it attempted to access privacy-sensitive data without a usage description.
The app's Info.plist must contain an NSBluetoothAlwaysUsageDescription key with a string value explaining to the user how the app uses this data.

Bluetoothの機能を使用する可能性がある場合は、privacy項目に該当するため上記privacy項目を追加し、必要なメッセージを設定してください。
また、Bluetoothには次のprivacy項目があると思います。
[NSBluetoothPeripheralUsageDescription]
上記privacy項目はDeprecatedになっていました。

[参考ページ]
「NSBluetoothPeripheralUsageDescription」の記事を開く
そのため、Bluetoothの機能を使用する可能性があるアプリを作成した場合は
[NSBluetoothAlwaysUsageDescription]
のprivacy項目をInfo.plistに設定して必要なメッセージを追加した方がいいと思います。

おそらくprivacy項目全般について、メッセージを追加していない場合等は、申請の際、再提出の依頼があるかもしれないため、見直しをした方がいいかもしれません。

Bluetoothのユーザ向けの通知

Info.plistには公開するアプリ固有のBluetoothの使用方法を明記し、ユーザに確認を取る必要があるようです。

ちなみに「What to use bluetooth」では、このアプリの使用目的を説明していないとしてダメでした。

[参考レビュー抜粋]
Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage

We noticed that your app requests the user’s consent to access their Bluetooth but does not clarify the use of the Bluetooth in the applicable purpose string.


App Storeプレビューで表示されるAppサポートのリンクで表示されるホームページにコンタクト情報について
[コンタクト情報について]
ホームページにはコンタクト情報を表示する必要があるようです。
申請の際、Appサポートのリンクの表示ページにコンタクト情報がない場合はリジェクトの原因となります。
ユーザからのコンタクト情報がわかるように設置されている必要があるようです。

[参考レビュー抜粋]
1. 5 Safety: Developer Information
5. 1.1 Legal: Privacy - Data Collection and Storage

Guideline 1.5 - Safety - Developer Information

The support URL specified in your app’s metadata, (ホームページのURL), does not properly navigate to the intended destination. Specifically, it do not contain contact info.

Next Steps

To resolve this issue, please revise your app’s support URL to ensure it directs users to a webpage with support information.
Xcodeのビルドエラー
[エラー] Command CodeSign failed with a nonzero exit code
[事象]
ビルドをしたとき、次のエラーが発生しました。
※Xcode10.1でビルドをしていたプロジェクトを11.5でビルドしたときに発生。
CodeSign /(パス)/Build/Products/Debug-iphonesimulator/(プロジェクト名).app (in target '(プロジェクト名)' from project '(プロジェクト名)')
cd (パス)
export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate

Signing Identity: "-"

/usr/bin/codesign --force --sign - --entitlements /(パス)等

/(パス)等/Promises-LICENSE

Command CodeSign failed with a nonzero exit code
[実行した対策]
Automatically manage signingのチェックを外し、個別に設定し、ビルドする。

下記はバックアップを取った後に実行することをお勧めします。

Signingのエラーだったため、Xcodeで作成したプロジェクトがサインインできるプロジェクトかどうか?
を焦点とし、次の操作をしたところ、私のケースでは上記が解消されました。
※既存のXcodeで作成したプロジェクトのビルドエラーについてとなります。
サインインに成功していたプロジェクトですが、Xcodeのバージョンをあげたところプロジェクトが認証可能状態にないため、このエラーが発生していることが考えられます。
また、Apple Developer Programのプロビジョニングファイル情報の更新処理のタイミングのケースにも影響が考えられます。

1.「Download Manual Profiles」を最新にする
Xcodeのメニューバーにある
Xcode → Preferences...を選択
AccountsタブのDownload Manual Profilesを実行し最新の状態を取得します。

2. SigningをAutoにしている場合は個別に設定してみる
(1) Distributionの追加
PROJECTのInfoタブにConfigurationsがあります。
そこで「+」ボタンでDistributionは追加できます。
ReleaseにDistributionを含めるのがよくある手法と思いますが、個別に追加してみました。

(2) Autoのチェックを外し、個別に認証を設定
TARGETSの「Signing & Capabilities」タブを選択します。
Xcodeが以前の情報を参照している可能性があるため、認証をAutomatically manage signingにしている場合は
・ Debug
・ Release
・ Distribution
を個別に設定しました。
(1) Team
(2) Provisoning Profile
この時、Signing Certificateはキーチェーンで設定されている現在使用するために登録したキーチェーンのIDになっていること。

クリーン(Shift + Comand + k)をした後、ビルドしました。

テストした環境では個別のビルドが成功した後、Automatically manage signingに戻してもビルドが成功しました。
※entitlementsファイルが生成されていないケースでも成功したので、一概にentitlementsの有無とは言えないかもしれません。

Xcodeが認証判定処理に使用する設定ファイル等の情報をクリアするなどの処理が必要なケースがあるため、この方法で解決するとは限りません。
以外の方法として、下記の記事を紹介します。

[参考ページ]
「fastlaneでcodesignに失敗する場合」の記事を開く
[参考ページ]
「command/usr/bin/codesign failed with exit code 1- code sign error」の記事を開く
[参考ページ]
「Xcode: codesignのunknown errorは本当にわけがわからないよ」の記事を開く
[参考ページ]
「iOSアプリ開発でのキャッシュ削除方法まとめ」の記事を開く

みなさんへのお知らせ
[ミニ脳トレ]「いなかったのは誰?」を追加しました。今後ともよろしくお願いします。
その他のURLはこちらから
選択App Storeアプリ
選択Googleアプリ
選択コンピュータ情報
選択暮らしの情報
選択その他
著作権情報
本ホームページに掲載されている情報等については、いかなる保証もいたしません。
本ホームページを通じて入手したいかなる情報も複製、販売、出版または使用させたり、
または公開したりすることはできません。
当方は、本ホームページを利用したいかなる理由によっての障害等が発生しても、
その結果本ホームページを利用された本人または他の第三者が被った損害について
一切の責任を負わないものとします。