【2024年版】App Clipの導入
概要
App Clipを使うと、完全版アプリをインストールしていないユーザーでも、アプリの一部機能を利用できます。例えば、コーヒーショップのApp Clipではドリンク注文機能のみ提供します。ユーザーがコーヒーショップを通り過ぎると、SiriがApp Clipを提案し、その場でドリンクを注文できます。App Clipは使用後に自動的に削除されますが、完全版アプリをインストールすると、以降は完全版アプリが起動します。
App Clip Flow
App Clipの起動方法
- NFCタグ
- QRコード
- 地図アプリ
- Siri
- Safari
- iMessageアプリ
前提条件
- Apple Developer Programに加入済み
- アプリはApp Store Connectと連携、開発済み
上記を踏まえて今回、新たにApp Clipを追加する
App Clipの実装範囲
- アプリマネージャー
App Clip用のProvisioning Profileを作成
App Store Connect上でApp Clipの設定 - サーバー
Apple-App-Site-Associationファイルの設定
Webページでバナーを設定 - デベロッパー
プロジェクトにApp Clipを追加
Associated Domainを設定
アプリが特定のURLを処理
App Clip用のプロビジョニングプロファイルを作成
Bundle IdがApp Clip用のプロビジョニングプロファイルを作成する。
必要であれば、Capabilitiesの項目にPush NotificationsやApp Group、Associated Domainにチェックをいれる。
App Store Connect上でApp Clipの設定
本体のAppとApp ClipをまとめてTestFlightにアップロードする。本体のAppとApp Clipで2段になる。
この状態でApp Store Connect上でApp Clipの設定が可能となる。
※App Clip Cardの設定もApp Store Connect上で行える。
Apple-App-Site-Associationの設定
{
"appclips": {
"apps": [ "<TEAM ID>.<Bundle Identifier of App Clip>" ]
},
...
}
Webページでバナーを設定
App Clipからの起動方法でSafariを起動する場合は、遷移先のWebページにhtmlを作成してmetaタグを設定しないと起動しないため、以下を設定する。
<meta name="apple-itunes-app"
content="app-clip-bundle-id={app-clip-bundle-id},
app-id={app-id}">
プロジェクトにApp Clipを追加
Xcode > File > New > Target > iOSタブから App Clipを選択
<補足情報>
相互にデータを共有する場合は、App Groupを使用することができる。
以下の設定が必要になる。
- Apple-App-Site-Association に記述が必要
- Provisioning ProfileのCapabilitiesにApp Groupを追加して発行
ファイルの共有はTarget Membershipを使用して共有することができる。
Associated Domainを設定
本体とApp ClipのTargetに追加する。
appclips:<fully qualified domain>
アプリが特定のURLを処理
import SwiftUI
struct AppClip: App {
var body: some Scene {
WindowGroup {
ContentView()
.onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { userActivity in
guard let incomingURL = userActivity.webpageURL,
let components = NSURLComponents(url: incomingURL,
resolvingAgainstBaseURL: true)
else {
return
}
// Direct to the linked content in your app clip.
}
}
}
}
トラブルシューティング
The CFBundleVersion of an App Clip ('221') must match that of its containing parent app ('4').
本体AppとApp Clipのビルド, バージョン番号を同じにする
Cycle inside <project name>; building could produce unreliable results.
Cycle details:
→ That command depends on command in Target '<project name>': script phase “[CP] Embed Pods Frameworks”
○ Target '<project name>'
○ That command depends on command in Target '<project name>': script phase “Run Script”
本体AppのTarget > Build Phases > Embed App ClipsをRun Scriptより上に移動する。
ITMS-90842: Invalid SDK usage
App clip '<App Clip pass>' uses the SDK selector 'requestAlwaysAuthorization', which is not supported. Ensure your app clip is using supported SDK features.
SDK内部に -[CLLocationManager requestAlwaysAuthorization] の記述が存在していたこと原因でした。
requestAlwaysAuthorizationの記述そのものが存在してはならないようにする。
参考文献
・https://developer.apple.com/jp/videos/play/wwdc2020/10146/
・https://developer.apple.com/documentation/appclip
Discussion
App Clipの規定サイズは10MB。
10MBを超えてアーカイブするとApp Connected testFlightのステータスが「バイナリ無効」になる。
何が原因かは、ログインしているアカウント宛にメールから確認できる。
ITMS-90876: Missing entitlement