13 App Clip
Xcode 12 から App Clip をビルドできるようになりました。
本 SDK は固有の設定を行うことで App Clip でもご利用いただけます。
App Clip の品質に関して
App Clip は2020年10月時点において、(昨今のApple製ソフトウェアと比較して)多くの不具合報告がなされています。
実際に確認を行った際に動作不良、表示異常やクラッシュといった不具合が発生する場合は、Xcodeおよび iOS のバージョンアップをお試しください。
また、本SDKに起因するものでないような不具合(App Clipカードが表示されない、QRコードを認識しない等)についてはお手数ですが Apple Developer サポート までお問い合わせください。
13.1. App Clip の概要
App Clip の概要や作成方法については公式ドキュメントおよび WWDC 2020 のビデオをご覧ください。
後者は日本語字幕もあり、Xcode上の操作方法についても実際の画面表示にそってとても丁寧に説明されています。
なお、本ドキュメントにおいては App Clip に対する Parent App (すなわち、フルバージョンのアプリ)について、App Store Review ガイドラインに従い メインのApp または単に App と呼称します。
13.2. FANSHIP SDK で出来ること
本 SDK を App Clip にも組み込むことで、 App Clip で popinfo ID を取得した場合、ID をメインのAppに引き継ぐことができます。
これにより、例えば App Clip 上で獲得したクーポンをメインの App にも引き継ぐ、といったことが可能になります。
また、App Clip に向けたプッシュ通知については部分的にご利用いただけます。下記の表をご参照ください。
| 機能 | 利用可能状況 |
|---|---|
| 即時配信 | ご利用いただけます |
| 予約配信 | ご利用いただけます |
| 位置連動配信 | 配信を届けられない場合があります |
| Wi-Fi 配信 | ご利用いただけません |
| Bluetooth 配信 | 配信を届けられない場合があります |
| アプリ内メッセージ | ご利用いただけます |
App Clip ではバックグラウンドタスクが動作しません。
そのため、 位置連動配信 や Bluetooth配信 において、エンドユーザーが App Clip 上でプッシュ通知を受け取れるのは App Clip が起動中、かつ、その時点で配信対象になっている場合 に限られます。
AppClip は Access WiFi Information Capability を設定できないため、これを利用する Wi-Fi 配信 はご利用いただけません。
App Clip 上で利用可能なフレームワークについては公式ドキュメント Choosing the Right Functionality for Your App Clip をご参照ください。
13.3 App Clip への SDK 組み込み手順
この章では、App Clip に本 SDK を組み込む手順を説明します。
13.3.0 事前確認
SDKを組み込む前に、下記 App Clip を組み込むための準備が整っていることをご確認ください。
- プロジェクトの Team ID がエンタープライズプログラムに 加入していない
- プロジェクトに App Clip 用ターゲットが追加されている
- メインのApp および App Clip の両方において、Capabilities に App Groups が追加されている
- メインのApp および App Clip の両方が同一の App Groups に属している
App Clip は、エンタープライズプログラムにおいて利用することができません。
エンタープライズプログラムでは On Demand Install Capable が自動的に付与されないため、シミュレーター向けビルドを除き、ビルドが失敗します。
App Clip 用ターゲットを追加する手順については Explore app clips をご覧ください。
13.3.1 フレームワーク追加
App Clip ターゲットにおける TARGETS > Build Phases > Link Binary With Libraries に以下を追加してください。
Embed オプションが表示されるものについては、いずれも Do Not Embed をお選びください。
- CoreLocation.framework
- CoreTelephony.framework
- SystemConfiguration.framework
- libPopinfoReceiverLib.a
13.3.2 Search Path の追加
13.3.2.1 Module map を利用する場合
Swift Compiler - Search Paths > Import Paths に、本 SDK 付属の modulemap ファイルを内包するディレクトリのパスをセットします。
たとえば、 $(SRCROOT)/MyApp/popinfo/lib/ に a ファイルが存在している場合、modulemap を内包するディレクトリにのパスは $(SRCROOT)/MyApp/popinfo/lib/Modules/PopinfoReceiver です。
13.3.2.2 Bridging-Header を利用する場合
Bridging Header のパスを Swift Compiler - General > Objective-C Bridging Header にセットします。
13.3.3 Target Membership の編集
本 SDK の付属ファイルのうち 下記を除くすべてのファイル を、App Clip ターゲットに追加します。
- ヘッダ(
*.h)ファイル - Settings.bundle
App Clip ターゲットに追加するには
追加するファイルを選択後、右ペインに表示されている Target Membership において、App Clip ターゲットをクリックしてチェックをオンにします。

Settings.bundle は App Clip ターゲットに含めないでください
App Clip は設定画面をもたないため、Settings.bundle を含めてしまうと App Store へのデリバリ時に ITMS-90047: Disallowed paths が発生し、デリバリが失敗します。
13.3.4 カスタムフラグの追加
App Clip ターゲットの Build Settings において、Apple Clang - Preprocessing > Proprocessor Macros に含まれる各 Configuration に対して APPCLIP=1 を追加します。

Active Compilation Conditions とは別に設定が必要です
App Clip 開発時は Active Compilation Conditions を利用して処理を分岐させることが多々あると思いますが、このカスタムフラグとは別に上記の Proprocessor Macros の設定が必要です。
Active Compilation Conditions を設定しただけでは本SDKのは動作しませんので、ご注意ください。

13.3.5 SdkSettings.plist の設定
SdkSettings.plist において、以下のように値をセットします。
-
FanshipAppClipUseにYES(1) を入力します

-
FanshipAppGroupNameに、App Clip が属する App Groups の名前を入力します

13.3.6 プッシュ通知一時許可
App Clip では一定条件のもと、ユーザーに許諾ダイアログを表示することなくプッシュ通知を送る方法が存在します。
Info.plist の App Clip 以下に Requests ephemeral user notifications を追記し、値を YES とすることで、起動後8時間に限りプッシュ通知を送信できるようになります。

エンドユーザーはこの設定を無効にできます
この設定はユーザーが App Clip カードにおいて無効にすることも出来ます。

その場合、iOSからは「プッシュ通知を許可しない」場合と同等に扱われます。
詳細については Enabling Notifications in App Clips をご参照ください。
13.3.8 コーディング
App Clip上で PopinfoID を取得し、プッシュ通知を届けるために必要な実装を説明します。
App Clip が機能過多にならないようご注意ください
App Clip は、メインのAppと同じくプロジェクト内のターゲットのひとつですから、7 実装 と同じような実装を行うことも可能です。
ただし、App Clip は「一つのタスクを実行することに特化する」という思想のもとに設計されているため、多くの機能をもたせた場合に App Store のレビューにて不適切と判断されてしまう場合が考えられます。
そのため、メインのAppに存在するような「お知らせ一覧」も、 ユーザー体験 や レビューにおける印象 を考慮した上で、実装すべきかどうかを判断いただきますようお願い致します。
PopinfoReceiver をインポートします。
#import "PopinfoReceiver.h"
import PopinfoReceiver
applicationDidBecomeActive: 内で、以下のように実装します。
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[popinfoReceiver loadSettings];
}
func applicationDidBecomeActive(_ application: UIApplication) {
self.popinfoReceiver.loadSettings()
}
iOS13以降のみをサポートするAppで SceneDelegate をご利用の場合は、applicationDidBecomeActive: ではなく、sceneDidBecomeActive: に記述してください。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)dataToken
{
[popinfoReceiver registerToken:dataToken];
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
self.popinfoReceiver.registerToken(deviceToken)
}
以上を実装することで、App Clip の起動時にPopinfoIDの取得およびデバイストークンの取得が完了します。
13.4 アップグレードについて
App Clip を利用したエンドユーザーがメインのAppをインストールした場合、メインのAppにおいて 7 実装 が適切に実装されている場合、PopinfoIDを引き継ぐことができます。
メインのAppとApp Clipの両者で Capabilities に App Groups が設定されていなかったり、メインのAppとApp Clip間で異なるApp Groupsを設定している場合は、引き継ぐことができませんのでご注意ください。
13.5 App Clip 関連ドキュメント
App Clip の実装に関しては、冒頭で紹介した動画の他に公式ドキュメントが公開されています。
下記、実装に役立つリンクを列挙しましたので、App Clip 開発時にお役立てください。
ドキュメント
動画
Apple 公式サンプルコード