App Clip
App Clipの概要
App Clip の概要や作成方法については公式ドキュメントおよび WWDC 2020 のビデオをご覧ください。
後者は日本語字幕もあり、Xcode上の操作方法についても実際の画面表示にそってとても丁寧に説明されています。
なお、本ドキュメントにおいては App Clip に対する Parent App (すなわち、フルバージョンのアプリ)について、App Store Review ガイドラインに従い メインのApp または単に App と呼称します。
FANSHIP SDKで出来ること
本SDK を App Clip にも組み込むことで、 App Clip で popinfo ID を取得した場合、ID をメインのAppに引き継ぐことができます。
また、App Clip に向けたプッシュ通知については部分的にご利用いただけます。下記の表をご参照ください。
| 機能 | 利用可能状況 |
|---|---|
| 即時配信 | ご利用いただけます |
| 予約配信 | ご利用いただけます |
| 位置連動配信 | 配信を届けられない場合があります(※1) |
| Wi-Fi配信 | ご利用いただけません(※2) |
| Bluetooth配信 | 配信を届けられない場合があります(※1) |
| アプリ内メッセージ | ご利用いただけます |
※1 : App Clip ではバックグラウンドタスクが動作しません。
そのため、 位置連動配信 や Bluetooth配信 において、エンドユーザーが App Clip 上でプッシュ通知を受け取れるのは App Clip が起動中、かつ、その時点で配信対象になっている場合 に限られます。
※2 : App Clip は Access WiFi Information Capability を設定できないため、これを利用する Wi-Fi 配信 はご利用いただけません。
App ClipへのSDK組み込み手順
事前確認
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 をご覧ください。
フレームワーク追加
App Clip ターゲットにおける TARGETS > Build Phases > Link Binary With Libraries に以下を追加してください。
Embed オプションが表示されるものについては、いずれも Do Not Embed をお選びください。
- CoreLocation.framework
- CoreTelephony.framework
- SystemConfiguration.framework
- libPopinfoReceiverLib.a
SearchPathの追加
Module mapを利用する場合
Swift Compiler - Search Paths > Import Paths に、本 SDK 付属の modulemap ファイルを内包するディレクトリのパスをセットします。
たとえば、 $(SRCROOT)/MyApp/popinfo/lib/ に a ファイルが存在している場合、modulemap を内包するディレクトリにのパスは $(SRCROOT)/MyApp/popinfo/lib/Modules/PopinfoReceiver です。
Bridging-Headerを利用する場合
Bridging Header のパスを Swift Compiler - General > Objective-C Bridging Header にセットします。
TargetMembershipの編集
本 SDK の付属ファイルのうち 下記を除くすべてのファイル を、App Clip ターゲットに追加します。
- ヘッダ(
*.h)ファイル - Settings.bundle(※3)
App Clipターゲットに追加するには

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

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

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

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

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

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

その場合、iOSからは「プッシュ通知を許可しない」場合と同等に扱われます。
詳細については Enabling Notifications in App Clips をご参照ください。
コーディング
App Clip上で Popinfo ID を取得し、プッシュ通知を届けるために必要な実装を説明します。
-
AppDelegate の冒頭で
PopinfoReceiverをインポートします。import PopinfoReceiver -
App がアクティブになった時にコールされるアプリケーションデリゲートメソッド
applicationDidBecomeActive:内で、以下のように実装します。func applicationDidBecomeActive(_ application: UIApplication) { self.popinfoReceiver.loadSettings() }iOS13以降のみをサポートするAppで SceneDelegate をご利用の場合は、
applicationDidBecomeActive:ではなく、sceneDidBecomeActive:に記述してください。 -
APNs トークンが iOS から付与される際にコールされるアプリケーションデリゲートメソッドを以下のように記述し、その中に FANSHIP の処理を記述します。
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { self.popinfoReceiver.registerToken(deviceToken) }以上を実装することで、App Clip の起動時にPopinfo IDの取得およびデバイストークンの取得が完了します。
アップグレードについて
メインのAppとApp Clipの両者の Capabilities に同一の App Groups を設定することでPopinfo IDを引き継ぐことができます。
App Clip関連ドキュメント
App Clip の実装に関しては、冒頭で紹介した動画の他に公式ドキュメントが公開されています。
下記、実装に役立つリンクを列挙しましたので、App Clip 開発時にお役立てください。
- ドキュメント
- 動画
- Apple公式サンプルコード