kumamotone’s blog

iOS/Android アプリエンジニアです https://twitter.com/kumamo_tone

iOS14 で追加された App Clips の概要と作り方

App Clip の概要

App Clipは、ユーザーが必要なときに必要な場所で、機能の一部を提供する機能です。

コーヒーショップのアプリを例に考えてみましょう。App Clipは、ドリンクを注文するだけの機能しか提供しません。

ユーザーがコーヒーショップの前を通ると、「Siri からの提案」で位置情報に基づいたサジェストがデバイスに表示されます。ユーザーはサジェストをタップすると、システムが提供するClip Card から、 すぐに App Clipを使ってドリンクを注文することができます。

f:id:kumamotone:20200623162508p:plain
https://developer.apple.com/documentation/app_clips

「Siriからの提案」からの位置情報ベースのサジェストのほかにも、NFCタグをスキャンしたりするなどの起動経路があります。

App Clipは瞬時に起動し、ユーザーが日常的なタスクをできるだけすばやく実行できるようにし、必要な時間だけユーザーのデバイスに残ります。

ユーザーがApp Clip対応のアプリをインストールすると、完全なアプリがApp Clipに置き換わります。この時点から、すべての呼び出しはApp Clipの代わりに完全なアプリに切り替わります。

ユーザーがアプリをインストールせず、一定期間使われない場合は、システムは自動的にApp Clipを削除します。

またコーヒーショップの例で考えてみましょう。

App Clipは対応するアプリをユーザーにおすすめして、ユーザーはおすすめからそのアプリをダウンロードします。次に位置情報ベースの提案を見てそれをタップすると、App Clipの代わりに完全なアプリを起動します。アプリをインストールしていない場合は、App Clipが起動します。

App Clip の開発の概要

Xcodeプロジェクトにおいては、App Clipは、アプリのターゲットとコードとアセットを共有する追加のターゲットです。また、App Clipは、アプリで利用できるのと同じフレームワークにアクセスすることができます。

たとえば、以下のようなことを行うことができます。

  • カメラへのアクセスを要求
  • ローカルキーチェーンに機密データを保存
  • Bluetooth デバイスに接続する

ただし、App Clipには、ユーザーのプライバシー保護などの観点から、機能に制限がかけられています。アプリは1つの対応する App Clip を持ち、App Clipの機能はアプリで完全にサポートされている必要があります。

起動経路

App Clip は以下の起動経路があります。

  • 物理的な場所でNFCタグまたはビジュアルコードをスキャンする
  • 「Siriからの提案」の位置情報ベースのサジェストをタップする
  • マップアプリのリンクをタップする
  • ウェブサイト上でスマートアプリのバナーをタップする
  • メッセージアプリで誰かが共有したリンクをタップする

f:id:kumamotone:20200623164038p:plain
https://developer.apple.com/documentation/app_clips/developing_a_great_app_clip

起動時に、システムはメタデータとURLを検証します。次に、この URL を使用して、起動時に提示されるClip Cardと呼ばれるシートを生成します。

Clip Cardには、追加情報を提供し、ユーザーがApp Clipを起動するためにタップするボタンを表示されます。起動ボタンがタップされると、URLがApp Clipに渡され、URLの情報を使用してUIを更新します。

UXについて

App Clipはホーム画面に表示されず、ユーザーは通常のアプリを管理するような方法では管理しません。その代わり、システムは一定期間使用していないと、デバイスから削除されます。そのため、洗練されたUXを提供することが重要です。

タブバーや複雑なフォームのような複雑なUI要素を避け、直線的で焦点を絞ったUXを提供しましょう。

より複雑なタスクを実行する必要がある場合は、複雑さを軽減するテクノロジーを利用しましょう。例えば、サービスや商品の支払いにApple Payを提供したり、複雑な登録フォームを避けるためにSign in with Appleを利用したりすることができます。

デザインの指針については、Human Interface Guidelines を参照してください。

バイナリサイズの制限

アプリのクリップは、瞬時に起動できるようにするために、10 MB 以下の小さなサイズにする必要があります。可能であれば、App Clip はこの制限以下にしてください。

使用可能なフレームワーク

App Clip は SwiftUIとUIKit の両方を利用しており、アプリと同じフレームワークにアクセスすることができます。

ただし、以下のフレームワークはApp Clipでは利用できません。

  • CallKit
  • CareKit
  • CloudKit
  • HealthKit
  • HomeKit
  • ResearchKit
  • SensorKit
  • Speech

これらのフレームワークを使用してもコンパイルエラーは発生しませんが、これらのフレームワークの API は、実行時に使用不可、空のデータ、またはエラーコードを示す値を返します。たとえば、HealthKit の isHealthDataAvailable() は、App Clipから呼び出すと false を返します。

プライバシーの保護

App Clipでは、SKOverlayやSKStoreProductViewControllerを使用して広告を表示したり、他のアプリをおすすめしたりすることができます。しかし、ユーザーのプライバシーを保護し、アプリやApp Clip間でのユーザー追跡を防止するため、Limit App Trackingが常に有効になっています。

App Clipは、AppTrackingTransparency (iOS14.0+の機能)でユーザーを追跡する権限を要求することはできず、nameとidentifierForVendorはどちらも空の文字列を返します。さらに、URLSessionでバックグラウンドのネットワーク処理を行ったり、App Clipが使用されていないときにBluetooth接続を維持したりするなどのバックグラウンド処理を実行することができません。また、位置情報アクセスを要求することもできません(次の日の午前4時に自動的にリセットされる一時的な位置情報権限は要求することはできます)。

ユーザーデータを保護するため、App Clipは以下にアクセスできません。また、自身の本体アプリ以外の他のアプリとデータを共有することはできません。

  • モーションデータとフィットネスデータ
  • Apple Musicとメディア
  • 連絡先、ファイル、メッセージ、リマインダー、写真などのアプリのデータ

本体アプリで行うべき機能

App Clipは、その場限りの体験を提供し、日常のタスクに対して可能な限り迅速な解決策を提供することに重点を置いています。以下のような機能は、本体アプリで行いましょう。

  • Bonjourのような高度なネットワーク機能、またはローカルWi-Fiネットワークの設定
  • App extensions
  • カスタマイズと設定; たとえば、設定バンドルの作成
  • データのHandOffとドキュメントのオープン
  • アプリ内購入とペイメントカードのアプリ内提供
  • 低レベルの Unix 機能; 例えば BSD 通知
  • iPadでのマルチ画面対応
  • カスタムURLスキームの登録
  • StoreKitのrequestReview(in:)メソッドを使用したレビュー訴求
  • ペアリングされたBluetoothデバイスの検索

App Clip を作成する

Xcodeを使用して、アプリのXcodeプロジェクトにApp Clip用のターゲットを追加し、アプリとの間でコードとアセットを共有することができます。プロジェクト内の他のターゲットと同様に、Xcode を使用して、シミュレータやデバイス上でApp Clipをビルド、実行、デバッグします。さらに、App Clip の妥当性(authenticity)をシステムが検証できるように、ウェブサーバを設定する必要があります。

App Clip Targetの追加

App Clipは、少なくともApp Clipと同じ機能を提供する対応するアプリが必要で、通常、アプリとApp Clipの両方に同じXcodeプロジェクトを使用します。

新しいアプリプロジェクトを作成する場合は、まずXcodeで新しいiOSプロジェクトを作成します。既存のアプリにApp Clipを追加したい場合は、そのXcodeプロジェクトを開きます。次に、XcodeプロジェクトにApp Clip Targetを追加します。

  1. App Clip テンプレートを使用して、新しいターゲットを追加します。
  2. Product Name を入力し、App Clipに適用可能なオプションを選択して、[Finish] をクリックします。

f:id:kumamotone:20200623172301p:plain
https://developer.apple.com/documentation/app_clips/creating_an_app_clip

[Finish] がクリックされると、Xcodeは選択したオプションに必要なファイルと、以下を追加します。

  • App Clipとそのテストをビルドして実行するためのScheme(本体アプリをビルドして実行するには、既存のSchemeを引き続き使用します)
  • On Demand Install Capable という名前の新しい機能
  • Parent Application Identifiers Entitlement
  • アプリ識別子
    • たとえば、完全なアプリのIdentifierが $(AppIdentifierPrefix)com.example.MyApp の場合、App Clip の Identifierは $(AppIdentifierPrefix)com.example.MyApp.Clip.Clip となります。
  • App ClipのSchemeの一部としての環境変数 _XCAppClipURL は、呼び出しをテストできるようにする
  • 本体アプリと同じデバイスのサポート(Universal なら iOS と iPadOS) (ただしmacOSを除く)

さらに、Xcodeでは、アプリにApp Clipを埋め込むための新しいBuild Phaseを作成します。

コードを追加する前に、まずシミュレータまたはデバイス上でApp Clipを実行しましょう。この時点では、まだコードやアセットを追加していないので、App Clipは空の白い画面を表示します。

Associated Domains Entitlement の追加

ユーザーは 呼び出しURL を使って App Clipを起動します。どの呼び出しをサポートする場合でも、アプリとApp Clipのターゲットに Associated Domains Entitlement を追加する必要があります。

Xcode でプロジェクトを開き、プロジェクト設定で Associated Domains を有効にして Associated Domains Entitlement を追加します。

App Clipまたはアプリを起動する各URLに対して、そのドメインを以下のパターンを使用して Associated Domainsに追加します。(例) appclips:example.com

appclips:<fully qualified domain>

Associated Domains Entitlement を追加することに加えて、起動前にシステムがApp Clipを検証できるようにサーバーを設定する必要があります。詳細については、Configuring Your App Clip’s Launch Experienceを参照してください。

コードとアセットの追加

App Clip はアプリと同じフレームワークを使用し、App Clipのターゲットにコードやアセットを追加すると、他のターゲットと同じように動作します。新しいソースファイルとアセットを作成したり、既存のソースファイルとアセットをApp Clipのターゲットのメンバーとして使用したりできます。プロジェクトの保守性を確保するために、アプリとApp Clipの両方で可能な限り多くのコードを共有する必要があります。

たとえば、

  • 新しいアプリを作成する場合は、App Clipを作成することを念頭に置いて構築し、モジュール化のベストプラクティスに従います。
    • たとえば、再利用可能なコンポーネントを作成したり、 Swift のライブラリとして切り出したりして、アプリとApp Clipの両方で同じコードを使用します。
  • 既存のアプリにApp Clipを追加する場合、コードの重複を避けるために、コードベースをモジュール化し、App Clip とアプリの間でコードを共有するための時間を確保してください。
  • 共有アセットを新しいAsset Catalogに追加し、アプリとApp Clipの両方で同じアセットを使用します。

Active Compilation Conditions 設定

App Clipとアプリの間でコードを共有する場合、アプリのコードの一部がApp Clipで使用できない場合があります。このような場合は、Active Compilation Conditions を使用して、コードを除外するための条件を指定してください。

まず、App ClipのTargetのビルド設定に移動し、 Build Settings の Active Compilation Conditions に新しい値を作成します。次に、必要に応じて共有コードにチェックを追加し、App Clipで使用したくないコードを除外します。

次のコードは、Active Compilation Conditionsに追加した APPCLIP という値をチェックします。

#if !APPCLIP
// Code you don't want to use in your app clip.
#else
// Code your app clip may access.
#endif

注:開発中は、Testing Your App Clip’s Launch Experienceで説明されているように、URL をローカルまたは TestFlight でテストします。

サーバーとXcodeプロジェクトの変更

システムがClip Cardを提示したり、App Clipの呼び出しを許可したりする前に、App Clip の設定とURLを検証します。検証を実行できない場合は、Clip Cardは表示されず、App Clipは起動しません。システムがApp Clipを検証できるようにするには、WebサーバーとXcodeプロジェクトに変更を加える必要があります。

最初に、Apple App Site Association ファイルをサーバーに追加します(参照)。次に、appclipsキーに値を追加します。以前に Apple App Site Association ファイルをサーバーに追加した場合は、既存のファイルに appclips キーのエントリを追加します。

追加する内容は以下のようになります。apps キーの値が配列で、1 つのエントリ(App Clipのアプリ識別子)だけであることに注意してください。

{
    "appclips": {
        "apps": ["ABCED12345.com.example.MyApp.Clip"]
    }
    ...
} 

最後に、Xcodeで、アプリと App Clip の両方のAssociated Domains Entitlementに、ウェブサイトのドメインを追加します。

呼び出しの設定

システムは、App Store Connectで設定したURLを使ってApp Clipを起動します。つまり、App Clipを起動するURLを特定するため、App Store Connectに登録することが必須になります。詳細については、Configuring Your App Clip’s Launch ExperienceとResponding to Invocationsを参照してください。

アプリのリリース

App ClipはApp Clip 単体ではリリースできず、本体アプリが必要です。App Clipを公開する準備ができたら、アプリのアーカイブの一部として送信します。App Clipを提出した後、App Storeの審査を通過する必要があることに注意してください。

出典

続き

kumamotone.hatenadiary.jp