App Clip 苦労話
要約
- App Clip 開発においては、Xcodeは最新版を使いましょう。
- App Clip はエンタープライズプログラムに加入したアカウントでは利用できません。
- App Clip 向けのプッシュ通知証明書を作る場合は親Appのプッシュ通知証明書を先に作成しましょう。
- App Clip が利用する SDK 内に
requestAlwaysAuthorization()
の記述が 存在 してはいけません。
ことのはじまり
とあるiOSアプリ用SDKについて「AppClip上でも使用できるようにしたい」と相談されたものの、App Clip について何もわからなかったので、実装方法や挙動について調べたりしました。
- 公式ドキュメント(App Clips)
- WWDCのビデオ(Explore App Clips)
ただ、当時[1]は App Clip 自体の品質があまり高くない状態[2] だったので、調査自体もかなり難航しました。
以下、印象に残ったトラブルをいくつか紹介します。
App Clip ID のプレフィックスエラー
現象
Xcode12RCの少し前頃だったかと思うのですが、ある既存プロジェクトにApp Clipターゲットを追加し、App Clip をシミュレーターにインストールしようとすると、下記のようなエラーが出て、インストール自体が失敗する事象が続きました。
「App Clip の App ID」のプレフィックスが、 「親App の App ID」ではない というメッセージですが、実際はプレフィックスになっています。
原因
既存プロジェクトはCocoaPodsを利用していたのですが、AppClipターゲットを追加した際に なぜか Pods ディレクトリ以下にファイル一式を展開したらしく application identifier などを Pods.xcodeproj/project.pbxproj
から拾って来てしまったのが原因で、 App ID の不整合を起こしていたようでした。
対処
Pods.xcodeproj/project.pbxproj
の PRODUCT_BUNDLE_IDENTIFIER
を直接修正[3]したらエラーは出なくなったのですが、そもそもPodsディレクトリ以下に展開されていることが問題なので、これは解決とは言えません。
結局、Xcodeが更新されるのを待ち、 Xcodeを最新にしたあとにターゲットを追加し直す ことで、ようやく現象が再現しなくなり、最終的な解決となりました。
On Demand Install Capable
現象
実機向けにビルドする場合など、署名が必要な段階で Provisioning profile ***** doesn't support the On Demand Install Capable capability. というメッセージが表示され、エラーになりました。
原因
プロジェクトに紐付いた Team ID がエンタープライズプログラムに加入しているのが原因でした。
App Clip はエンタープライズプログラムによる(In House ビルドによる)配布をサポートしていません。
App Clips are unsupported in Enterprise apps.
そのため、On Demand Install Capable capability が自動的に付与されず、ビルドが失敗していました。
対処
新しく、エンタープライズプログラムに加入していない Apple アカウントを用意しました。
App Clip 用のプッシュ通知証明書
現象
App Clip にプッシュ通知を送るために、Apple Developer サイトからプッシュ通知証明書を生成したところ、異常な状態で出力されました。
具体的には friendlyName が 本来なら Apple Push Service となるところ(画像右側)、実際には Apple Distribution: xxx... のような文字列(画像左側)になっていました。
原因
App Clip 向けのプッシュ通知証明書を、親Appのプッシュ通知証明書よりも先に作成したのが原因のようでした。
対処
親Appのプッシュ通知証明書を作成したあとにApp Clip 向けのプッシュ通知証明書を作成したところ、現象は発生しなくなりました。
ITMS-90842: Invalid SDK usage
現象
位置情報を利用するSDKを App Clip に組み込み、親App と一緒に App Store に提出したところ、デリバリが成功した後に、処理中の状態だった App が消失する現象が起きました。
不審に思いメールボックスを確認すると、App Store から ITMS-90842: Invalid SDK usage が発生した旨のメールが届いていました。
つまり、App Store 上で 「ITMS-90842 を理由に App が消去された」ということでした。
原因
SDK内部に -[CLLocationManager requestAlwaysAuthorization]
の記述が存在していたこと原因でした。
一応、SDKの中では「App Clip 上で起動した場合のみ -[CLLocationManager requestAlwaysAuthorization]
をコールしない」ように実装していたのですが、それだけでは不十分で[5]、 -[CLLocationManager requestAlwaysAuthorization]
の記述そのものが存在してはならない ようでした。
対処
SDKの中から -[CLLocationManager requestAlwaysAuthorization]
の記述をすべて削除[6]したところ、現象が発生しなくなりました。
最後に
App Clip 開発を取り巻く環境は時間とともに改善されており、現在 Xcode12.4 がリリースされている時点においては、β版だった頃と比較して、特に苦労することもなく実装できるようになったのではないかと思います。
ただ、そうはいってもまだまだハマりどころがどこに隠れているかわからない節はあるので、App Clip開発は依然として「ある程度のiOS開発経験がある人向けのタスク」と位置づけるのが無難かもしれません。
参考
公式ドキュメント:
その他、App Clip 開発にて役立つ記事を集めました。ぜひ読んでみてください。
- 君はAppClipを見たか
- App Clipsに対応する
- App Clipの完全ガイド:App Clipの作成、Safariのバナーに追加したら、QRコードを生成し、情報を保存して位置情報と呼び出しURLを確認し、そして主要アプリを推奨します。
-
2020年9月ごろ ↩︎
-
iOS 14.0.1 のころですら、AppClipの起動時に2〜3回に1回の割合でクラッシュする現象が確認できていたほどです。 ↩︎
-
記述した覚えのない文字列が埋まっていたので
{team_id}.{App Clip の Bundle ID}
の書式になるように修正しました。 ↩︎ -
探し方が悪いだけで実はあったのかもしれませんが...私は未だにフォーラム以外では見つけられてないです。 ↩︎
-
-[CLLocationManager requestAlwaysAuthorization]
を到達不能コードにした状態でSDKをビルドし、アプリに実装して確認しましたが、 ITMS-90842: Invalid SDK usage を回避できませんでした。 ↩︎ -
たやすく「すべて削除」と書いていますが、SDKの面倒な状態遷移に手を入れざるを得なくなり、そこそこ面倒くさかったです。 ↩︎
Discussion