ハイライト
セッションは Charles Ying が主導し、4 つの新機能を中心にしました。App Clip のサイズ制限が 10MB から 15MB に増加しました (iOS 16 が必要)。 Universal Link 構成の問題のトラブルシューティングに役立つ、新しい App Clip Diagnostics 診断ツールが追加されました。 App Clip は CloudKit パブリック データベースを読み取ることができるようになりました。ユーザーが完全なアプリをインストールすると、キーチェーン データが自動的に移行されます。
主要内容
App Clip の目標は明確です。ユーザーは、レストラン、駐車場、Web ページ、またはメッセージでタスクに遭遇し、最初にアプリ全体をインストールしなくても、すぐにタスクを完了できます。
この目標により、開発者は 2 つの制約にさらされることになります。まず、サイズが小さくなければなりません。以前の 10 MB の上限により、アセットの削除、機能の分割、コンテンツの読み込みの遅延が余儀なくされました。次に、エクスペリエンスが完全なアプリに近いものでなければなりません。支払い、ログイン、メニューの読み取り、位置情報の表示、これらのプロセスはすべてデータと安全なストレージを必要とします。
WWDC 2022 のアップデートにより、これら 2 つの方向が一歩前進します。iOS 16 では、App Clip サイズの上限が 15MB に増加します。 App Clip Diagnostics は、URL、エンティティ コード、Safari、iMessage、ユニバーサル リンクの構成をチェックするのに役立ちます。 CloudKit パブリック データベースは直接読み取ることができます。キーチェーン アイテムは、ユーザーが完全なアプリをインストールした後に移行されます。
最後の部分は運用上の問題です。App Clip の高度なエクスペリエンスを習得すると、App Store Connect で場所、画像、ローカライズされた情報を手動で作成するのは繰り返しの作業になります。App Store Connect の App Clip エクスペリエンス Web API は、この部分をスクリプト可能なプロセスに変えます。
詳細
15MB の上限: 最初に最小システム バージョンを決定します。
(01:07) App Clip には、App Clip の最小システム バージョンが iOS 16 に設定されている場合に、新たに 15MB の制限が設けられました。iOS 15 以前のシステムと互換性を持たせたい場合でも、10MB 以内に抑える必要があります。
この変更により、より複雑なリアルタイム タスクに対応できる余地が生まれました。たとえば、食品注文の App Clip では、より多くの UI リソース、支払いプロセス、ステータス ページを予約できます。しかし、Charles Ying 氏は、依然としてスピードが App Clip の中核であることも強調しました。ユーザーは必ずしも高速なネットワーク環境にいるわけではありませんが、起動後に追加のリソースをダウンロードすることで、最初のダウンロードの負担を軽減できます。
概念上の判断:App Clip のサイズ目標
1. App Clip の最小バージョンが iOS 16 の場合:圧縮後のダウンロードサイズは 15MB 近くまで許容できます。
2. iOS 15 以前もサポートする場合:圧縮後のダウンロードサイズは引き続き 10MB 以内に抑える必要があります。
3. 起動後にだけ必要な大きなリソース:起動後に必要に応じて取得します。
キーポイント:
- 15MB の制限は、iOS 16 以降のバージョンの App Clip にのみ適用されます。
- iOS 15 以前のシステムとの互換性の制限は 10MB です。
- 起動後に追加のリソースをダウンロードすることは、スピーチで明確に述べられた補足的な戦略です。特定のダウンロード メカニズムは、アプリ独自のアーキテクチャに従って選択する必要があります。 ・サイズを小さくしても起動速度が無視できるわけではありません。 App Clip は依然としてリアルタイム シナリオを重視しています。
App Clip 診断: URL 構成の問題を直接指摘します
(02:10) App Clip には、物理的な App Clip コード、Safari、iMessage、ユニバーサル リンクなど、多くの入り口があります。これらの構成の間にも問題が存在することがよくあります。Safari バナーが表示されない場合、またはユーザーがリンクをクリックしても Web ページが開いた場合は、関連ドメイン、エクスペリエンス構成、または URL 一致に問題がある可能性があります。
iOS 16 の App Clip Diagnostics は、デバイスの開発者設定にあります。Xcode に接続した後、開発者設定を開き、App Clips Testing の診断に入り、URL を入力すると、システムが構成をチェックします。合格すると、緑色のチェックが表示されます。失敗した場合、インターフェイスは特定の問題を説明し、ドキュメントへのリンクを提供します。
概念フロー:App Clip Diagnostics の使用
1. iPhone または iPad を Xcode に接続し、Developer Settings を有効にします。
2. Developer Settings > App Clips Testing > Diagnostics を開きます。
3. テストする App Clip URL を入力します。
4. App Clip experience、Safari、iMessage、Universal Link の構成チェック結果を確認します。
5. 失敗項目にリンクされたドキュメントに従って構成を修正します。
キーポイント:
- 診断は、新しいコードをアプリに統合する必要のないオンデバイス開発者ツールです。
- Safari や iMessage だけでなく、物理コードを使用する App Clip エクスペリエンスもチェックします。
- ユニバーサル リンクの関連ドメイン構成もチェックします。
- 失敗結果では、「App Clip の代わりに Web ページが開かれる」などの問題のトラブルシューティングに適した具体的な設定手順が説明されます。
CloudKit: App Clip はパブリック データベースを読み取ることができます
(03:27) App Clip は CloudKit では動作しませんでした。App Clip がメニュー、製品、または場所のリソースを読み取る必要がある場合、一般的なアプローチは独自のサーバーに接続することです。
iOS 16 以降、App Clip は CloudKit パブリック データベースを読み取ることができます。このようにして、完全なアプリとアプリ クリップは、同じ CloudKit コンテナと同じ読み取りコードのセットを共有できます。境界も明確です。App Clip はパブリック データベースの読み取りのみが可能で、CloudKit への書き込みはできません。また、クラウド ドキュメントや Key-Value ストアも使用できません。
// Read your CloudKit public database from your App Clip
let container = CKContainer.default()
let publicDatabase = container.publicCloudDatabase
let record = try await publicDatabase.record(for:
CKRecord.ID(recordName: "A928D582-9BB6-E9C5-7881-E4EAF615E0CD"))
if let title = record["Title"] as? String,
let description = record["Description"] as? String {
print("Fetched a food item from CloudKit: \(title) \(description)")
}
キーポイント:
CKContainer.default()App Clipで使用されるCloudKitコンテナを取得します。container.publicCloudDatabaseパブリック データベースへの明示的なアクセス。これは App Clip サポートの範囲です。record(for:)使用CKRecord.ID指定されたレコードを取得します。record["Title"]そしてrecord["Description"]フィールドを読み取った後、文字列に変換します。- このコードはデータを読み取るだけであり、スピーチの「App Clips はパブリック データベースから読み取ることができますが、CloudKit にデータを書き込むことはできません」という制限に準拠します。
有効にする方法もスピーチの中で説明されています。App Clip ターゲットの署名と機能を開き、使用する CloudKit コンテナを選択します。このコンテナは、新しく作成することも、完全なアプリと共有することもできます。
キーチェーンの移行: 機密データを最初にアプリ グループに配置する必要はありません
(04:59) ログイン トークンや支払い情報などのデータは、キーチェーンに配置するのに適しています。以前は、App Clip が完全なアプリにアップグレードされるとき、開発者は転送に共有アプリ グループ コンテナを使用することがよくありました。App Clip は共有コンテナに書き込まれ、完全なアプリはインストール後に読み取られてキーチェーンに置かれていました。
iOS 16 ではこの回り道が修正されます。ユーザーが完全なアプリをインストールすると、App Clip キーチェーン内のアイテムが完全なアプリに転送されます。App Clip はセキュリティ データをキーチェーンに直接書き込むことができ、完全なアプリは同じキーチェーン クエリ コードを使用してセキュリティ データを読み取ることができます。
// Write authentication token to App Clip keychain
let addSecretsQuery: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecValueData as String: "smoothie-secret".data(using: .utf8),
kSecAttrLabel as String: "foodsample-appclip"
]
SecItemAdd(addSecretsQuery as CFDictionary, nil)
// Read authentication token from app or App Clip
var readSecretsQuery: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecReturnAttributes as String: true,
kSecAttrLabel as String: "foodsample-appclip",
kSecReturnData as String: true
]
var secretsCopy: AnyObject?
SecItemCopyMatching(readSecretsQuery as CFDictionary, &secretsCopy)
キーポイント:
kSecClassGenericPassword一般的なパスワード タイプのキーチェーン アイテムがここに保存されることを示します。kSecValueData例では、トークン データを保存しますsmoothie-secretUTF-8データの。kSecAttrLabelアイテムにラベルを追加して、完成したアプリがそれが App Clip からのものであることを識別できるようにします。SecItemAddApp Clipにキーチェーンを書き込みます。SecItemCopyMatchingこのクエリ コードを使用して、App と App Clip の両方で同じタグを持つアイテムを読み取ることができます。
ここにも境界があります。共有キーチェーン グループと iCloud キーチェーンはサポートされていません。これにより、App Clip の約束が守られています。iOS は、App Clip が使用されなくなった場合、App Clip とそのデータを削除します。
App Clip Experiences API: 高度なエクスペリエンスを自動的に作成
(06:28) 高度な App Clip エクスペリエンスは、情報または場所に関連付けられています。レストラン、店舗、駐車場が増えれば増えるほど、それらを手作業で維持するのは難しくなります。App Store Connect によって提供される App Clip エクスペリエンス Web API は、これらのエクスペリエンスの作成と更新を自動化するために使用されます。
スピーチのプロセスは 3 つのステップに分かれています。まず、App アイテム ID と App Clip バンドル ID を通じて App Clip リソース ID を取得します。次にヘッダー画像をアップロードします。最後に、App Clip リソース ID とヘッダー画像 ID を使用して、高度な App Clip エクスペリエンスを作成します。
# Get the App Clip resource ID
GET /v1/apps/1234567890/appClips?filter[bundleId]=com.example.foodsample.Clip
# Response
{
"data": {
"attributes": {
"bundleId": "com.example.foodsample.Clip"
},
"id": "726ad1bb-3e1b-40eb-a986-d8a9897e4f1e"
}
}
キーポイント:
GET /v1/apps/{appId}/appClipsアイテム ID を使用してアプリを見つけます。filter[bundleId]App ClipバンドルIDで絞り込みます。 -それに応じてdata.idApp Clip リソース ID です。これは、後でエクスペリエンスを作成するときに関係に含める必要があります。- 例の ID は、講演で指定されたサンプルのリソース ID であり、実際のリクエストに直接コピーしないでください。
ヘッダー画像のアップロードは 2 番目のステップです。
# Upload a header image for the advanced App Clip experience
POST /v1/appClipAdvancedExperienceImages
{
"data": {
"type": "appClipAdvancedExperienceImages",
"attributes": {
"fileName": "Hero_image_US.png",
"fileSize": 43500
}
}
}
# Response
{
"data": {
"attributes": "...",
"id": "91c52741-832b-48a2-8935-1797655edbe7"
}
}
キーポイント:
POST /v1/appClipAdvancedExperienceImages高度なエクスペリエンスで使用する画像アセットを作成します。fileNameそしてfileSizeアップロードする画像ファイルを記述します。 -それに応じてdata.idヘッダー画像のリソースIDです。- この ID は、高度なエクスペリエンスを作成するときに使用されます
headerImage人間関係で使用されます。
3 番目のステップは、高度な App Clip エクスペリエンスを作成することです。
# Create advanced App Clip experience
POST /v1/appClipAdvancedExperiences
{
"data": {
"type": "appClipAdvancedExperiences",
"attributes": {
"action": "OPEN",
"businessCategory": "FOOD_AND_DRINK",
"defaultLanguage": "EN",
"isPoweredBy": true,
"link": "https://fruta.example.com/restauraunt/simply_salad",
"place": {
"names": [ "Caffe Macs" ],
"mapAction": "RESTAURANT_ORDER_FOOD",
"displayPoint": {
"coordinates": { "latitude": 37.33611, "longitude": -122.00731 },
"source": "CALCULATED"
}
}
},
"relationships": {
"appClip": {
"data": {
"type": "appClip",
"id": "726ad1bb-3e1b-40eb-a986-d8a9897e4f1e"
}
},
"headerImage": {
"data": {
"type": "appClipAdvancedExperienceImages",
"id": "91c52741-832b-48a2-8935-1797655edbe7"
}
}
},
"included": {
"type": "appClipAdvancedExperienceLocalizations",
"attributes": {
"language": "EN",
"subtitle": "Fresh salad every day",
"title": "Simply Salad"
}
}
}
}
キーポイント:
attributes.action、businessCategory、defaultLanguageそしてlink体験そのものを説明します。place場所の名前、マップのアクション、座標など、マップの場所をバインドするために使用されます。relationships.appClip最初の手順で取得した App Clip リソース ID を関連付けます。relationships.headerImage2番目の手順で作成したヘッダー画像のリソースIDを関連付けます。includedローカライズされたタイトルとサブタイトルを入力します。例では英語になっています。Simply SaladそしてFresh salad every day。
重要ポイント
-
CloudKit 主導の軽量メニュー App Clip を作成します: メニュー、製品、またはストアの表示データを CloudKit パブリック データベースに配置します。実行する価値がある理由: App Clip は読み取りロジックを完全なアプリと共有できるため、読み取り専用データ用に別のサーバー インターフェイスのセットを維持する必要がありません。開始方法: App Clip ターゲットの署名と機能で CloudKit コンテナを選択し、使用します
CKContainer.default().publicCloudDatabase公的記録を読んでください。 -
App Clip ログイン トークンをキーチェーンに直接書き込む: ユーザーが App Clip でログインまたは支払い認証を完了した後、短期トークンをキーチェーン アイテムとして保存します。実行する価値がある理由: ユーザーが完全なアプリをインストールすると、キーチェーン項目がそこに移行され、完全なアプリはその状態を継続できます。開始方法: 使用する
SecItemAdd書き込みテープkSecAttrLabel完全なアプリで使用されるアイテムSecItemCopyMatching同じタグをクエリします。 -
起動ごとに URL 診断リストを追加: 公開する前に、実デバイスの開発者設定で主要な App Clip URL に対して App Clip 診断を実行します。実行する価値がある理由: Safari バナー、iMessage、物理的エクスペリエンス、ユニバーサル リンク構成に関する問題を直接特定できます。開始方法: Xcode に接続し、開発者設定を開き、各タイプのエントリの URL を入力し、失敗した項目を公開ブロック条件として使用します。
-
スクリプトを使用してストアの App Clip エクスペリエンスをバッチ作成: ケータリング、駐車場、予約アプリは、ストア データを App Store Connect API リクエストに変換できます。実行する価値がある理由: 高度な App Clip エクスペリエンスは通常、場所、写真、ローカライズされたタイトルに関連付けられており、その数が増えると手動メンテナンスではエラーが発生しやすくなります。開始方法: 最初の電話
GET /v1/apps/{appId}/appClipsApp Clip リソース ID を取得し、ヘッダー画像をアップロードして、最後に呼び出しますPOST /v1/appClipAdvancedExperiences体験を創造します。 -
App Clips の最小バージョン戦略を再評価します: 製品により多くのリソースが必要な場合は、App Clips の最小バージョンを iOS 16 に設定することを検討してください。価値がある理由: 15MB の上限により、より完全なオンザフライ プロセスに対応できます。開始方法: Xcode のサイズ レポートを使用して圧縮サイズを確認し、iOS 15 との互換性を維持するか、iOS 16 を 15MB のスペースと交換するかを決定します。
関連セッション
- App Clips の新機能 - iOS 15 での App Clip の検出、レビュー、テストのプロセスに関する補足的な更新。2022 年の更新前に読むのに適しています。
- App Clips を探索する — App Clip の概要を紹介し、トリガー エントリ、ライフ サイクル、基本的な開発モデルを説明します。
- App Clip を効率化する — このセッションの 15MB の上限と速度リマインダーに直接対応する、サイズ、起動速度、リソース分割について説明します。
- 他のビジネス向けの App Clip の作成 — 高度なエクスペリエンス バッチ管理シナリオに関連して、プラットフォーム ベースのアプリが販売者向けの App Clip を作成する方法について説明します。
- App Store Connect API による自動化の拡張 — App Clip Experiences API のワークフローを理解するのに役立つ、App Store Connect API 自動化に関する基本的な背景。
コメント
GitHub Issues · utterances