📎

App Clip 苦労話

5 min read

昨年末のアドカレ用に公開した記事の焼き直しです。情報が少し古いかもしれません 🙇

要約

  • App Clip 開発においては、Xcodeは最新版を使いましょう。
  • App Clip はエンタープライズプログラムに加入したアカウントでは利用できません。
  • App Clip 向けのプッシュ通知証明書を作る場合は親Appのプッシュ通知証明書を先に作成しましょう。
  • App Clip が利用する SDK 内に requestAlwaysAuthorization() の記述が 存在 してはいけません。

ことのはじまり

とあるiOSアプリ用SDKについて「AppClip上でも使用できるようにしたい」と相談されたものの、App Clip について何もわからなかったので、実装方法や挙動について調べたりしました。

ただ、当時[1]App Clip 自体の品質があまり高くない状態[2] だったので、調査自体もかなり難航しました。

以下、印象に残ったトラブルをいくつか紹介します。


App Clip ID のプレフィックスエラー

現象

Xcode12RCの少し前頃だったかと思うのですが、ある既存プロジェクトにApp Clipターゲットを追加し、App Clip をシミュレーターにインストールしようとすると、下記のようなエラーが出て、インストール自体が失敗する事象が続きました。

img

「App Clip の App ID」のプレフィックスが、 「親App の App ID」ではない というメッセージですが、実際はプレフィックスになっています。

原因

既存プロジェクトはCocoaPodsを利用していたのですが、AppClipターゲットを追加した際に なぜか Pods ディレクトリ以下にファイル一式を展開したらしく application identifier などを Pods.xcodeproj/project.pbxproj から拾って来てしまったのが原因で、 App ID の不整合を起こしていたようでした。

たまたまプロジェクトディレクトリ全体をXcodeの外から串刺し検索してみようと思い至らなかったら原因は永久にわからなかったかもしれません。
Xcode上だとディレクトリ構造が実際のディレクトリ構成とは異なるため、なかなか気づきませんでした。

対処

Pods.xcodeproj/project.pbxprojPRODUCT_BUNDLE_IDENTIFIER を直接修正[3]したらエラーは出なくなったのですが、そもそもPodsディレクトリ以下に展開されていることが問題なので、これは解決とは言えません。
結局、Xcodeが更新されるのを待ち、 Xcodeを最新にしたあとにターゲットを追加し直す ことで、ようやく現象が再現しなくなり、最終的な解決となりました。

プロジェクトの構造によっては起きないようで、現象が発生したケースにおいては、いまだ何が悪かったのか謎のままです...
一時的なXcodeの不具合と理解するのが良さそうですね。


On Demand Install Capable

現象

実機向けにビルドする場合など、署名が必要な段階で Provisioning profile ***** doesn't support the On Demand Install Capable capability. というメッセージが表示され、エラーになりました。

原因

プロジェクトに紐付いた Team ID がエンタープライズプログラムに加入しているのが原因でした。

App Clip はエンタープライズプログラムによる(In House ビルドによる)配布をサポートしていません。

https://developer.apple.com/forums/thread/654943?answerId=626595022#626595022

App Clips are unsupported in Enterprise apps.

そのため、On Demand Install Capable capability が自動的に付与されず、ビルドが失敗していました。

2020年9月当時、「エンタープライズプログラムだと利用できない」という情報はApple公式のドキュメント類には記載されていませんでした[4]

対処

新しく、エンタープライズプログラムに加入していない Apple アカウントを用意しました。


App Clip 用のプッシュ通知証明書

現象

App Clip にプッシュ通知を送るために、Apple Developer サイトからプッシュ通知証明書を生成したところ、異常な状態で出力されました。

具体的には friendlyName が 本来なら Apple Push Service となるところ(画像右側)、実際には Apple Distribution: xxx... のような文字列(画像左側)になっていました。

friendlyName が Apple Push Service で始まる書式でない場合、サードパーティプッシュ配信サービスにおいて証明書(PKCS#12ファイル)の登録に失敗する可能性があります。

img

原因

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 開発にて役立つ記事を集めました。ぜひ読んでみてください。

脚注
  1. 2020年9月ごろ ↩︎

  2. iOS 14.0.1 のころですら、AppClipの起動時に2〜3回に1回の割合でクラッシュする現象が確認できていたほどです。 ↩︎

  3. 記述した覚えのない文字列が埋まっていたので {team_id}.{App Clip の Bundle ID} の書式になるように修正しました。 ↩︎

  4. 探し方が悪いだけで実はあったのかもしれませんが...私は未だにフォーラム以外では見つけられてないです。 ↩︎

  5. -[CLLocationManager requestAlwaysAuthorization]到達不能コードにした状態でSDKをビルドし、アプリに実装して確認しましたが、 ITMS-90842: Invalid SDK usage を回避できませんでした。 ↩︎

  6. たやすく「すべて削除」と書いていますが、SDKの面倒な状態遷移に手を入れざるを得なくなり、そこそこ面倒くさかったです。 ↩︎

Discussion

ログインするとコメントできます