ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
App Clipのストリームライン化
好きな清涼飲料水の注文から駐車料金の支払いまで、「いまこの時」の体験をユーザーに提供するにはApp Clipが最適です。目的に特化し一貫したApp Clipを構築するためのガイドラインとベストプラクティスを共有し、App clipsの通知や位置確認といった技術を活用することで決済体験を簡素化、App ClipからフルAppへの移行をサポートする方法もお見せします。 このセッションを活用するために、「App Clipの紹介」と「App Clipを設定し、リンクする」を先に見ておくことをお勧めします。
リソース
- App Clips
- Choosing the right functionality for your App Clip
- Fruta: Building a Feature-Rich App with SwiftUI
- Learn more about creating app clips
- Responding to invocations
関連ビデオ
WWDC20
-
ダウンロード
こんにちは WWDCへようこそ “App Clipのストリームライン化” ようこそ 私はヨンジュンです App Clipsチームのエンジニアです 今日は同僚のルーミンと共に App Clip体験を 簡略化する方法について話します ご存じのとおり App Clipは アプリケーションのほんの一部です 軽く 必要な時に瞬時に使えます App Clip体験用に登録したURLによって 起動します また ユーザーは体験中に アプリケーションを簡単に入手できます 今日は3つのテーマについてお話しします まずはApp Clipの設計・構築の ベストプラクティスについてです 次に App Clipで 決済の 効率化を行う事例を紹介します 最後に ユーザーを― App Clipからアプリケーションに 移行させやすくする技をお伝えします
ベストプラクティスについて話しましょう
App Clipの要はスピードです App Clipとのインタラクションは速く 的確でなければなりません App Clipは不可欠なタスクと― 目前のタスクに必要な特定の機能に 集中する必要があります その他の幅広い複雑な機能は フルのアプリケーションに任せます
App Clipを立ち上げた時点で すぐに使えなければなりません 迅速な初期体験に必要なアセットを すべて盛り込んでください スプラッシュ画面は入れないでください タスク開始前にユーザーに ダウンロード待ちをさせないようにしましょう
アカウント作成は複雑で 時間を要する面倒なタスクです サインアップを促すのは ユーザーがタスクを終えてからにしましょう
ユーザーデータを利用したい場合は 必要になった時点で許諾を求め― その理由を明確に説明してください
ユーザーがアプリケーションに アップグレードすると― App Clipと置き換わります アプリケーションも App Clipと同様の 効率的な体験を 提供しなければなりません そしてApp Clipの名称とアイコンは 必ずアプリケーションと同じにしてください そうすればユーザーは 一貫性のある体験ができます
App Clipの設計についての詳細は “Design Great App Clips”をご覧ください
App Clipを構築するには アプリケーションのXcodeプロジェクトに 新規ターゲットを追加する必要があります
アプリケーションには 既に アセットとクラスがあり― 中にはApp Clipと共通のものもあります
体験に必要な全リソースを見極め App Clip appのバンドルにまとめてください App Clipが小さいほど ユーザーに速く届くので 必要なものだけを追加してください
アプリケーションとApp Clipの 両方で使っているアセットを 共有アセットカタログにまとめましょう クラスとローカリゼーション文字列ファイルを 整理し アプリケーションとApp Clipの両方で 共有できるようにしてください “Appleでサインイン”は ユーザーのアカウント取得には最善の方法です それ以外の認証連携ログインシステムが サービスでサポートされている場合は ASWebAuthenticationSessionが サードパーティの サービスを認証する軽量のソリューションです ユーザーをApp Clipに留め アプリケーションへの切り替えを要求しません
アプリケーションのアカウントを 既に持っているユーザーに対しては ユーザー名とパスワードの ログイン機能も提供すべきです App ClipはPassword AutoFillに 対応しているので ログインがとても簡単です
ユーザーがパスワードで App Clipにログインした場合は “Appleでサインイン”への アップグレードを― フルのアプリケーションの起動時に 提案してみましょう
ユーザー名とパスワードで 最善の サインインをサポートする方法については “What's New in Authentication”を ご覧ください そして“Appleでサインイン”と強力な パスワードアップグレードの提供方法については “Securing Accounts with Upgrades to Sign in with Apple and a Strong Password”を ご覧ください
App Clipはつかの間の体験です ユーザーがプライバシー保護について 何の不安もなく試せることが大切です
機密性の高いユーザーデータの中には App Clipでは使えないものもあります App Clipの軽くて速い体験には不要ですし それに関わる機能を使いたい時は いつでもユーザーに アプリケーションの入手を 促せばよいのです App Clipはカメラ マイク Bluetoothへの アクセス権限を要求できます
高速のストリームライン体験を保つため ユーザーがアプリケーションを入手した時に この権限データを転送します 再度 要求せずに済むからです App Clipとアプリケーションプライバシーの 詳細については “Build Trust Through Better Privacy”を ご覧ください
日々 さまざまなiOSアプリケーションで 決済が使われています 一般的な決済には複数の段階があります 例を見てみましょう スムージーを注文したいとします スムージー店に入り NFCタグをタップし FrutaのApp Clipを立ち上げます
私の入ったスムージー店を特定するため App Clipは私に位置情報取得の許諾を求めます
次に App Clipが注文用にメニューを表示します
好きなスムージーを選んで支払いをします
するとApp Clipは スムージーができた時に 通知を送る許諾を私に求めます 最後に App Clipは次回の割引を提示し サインアップまたはサインインを勧めてきます 段階がとても多いです このように改善できないでしょうか
まずは位置情報です App ClipはNFCタグなどの物理的なタグを トリガーにして起動できます
スムージーの例で言えば NFCタグのURLで どのスムージー店かを特定できます それによって店舗の情報を取得し 正しいメニューを表示し 支払いを受けます しかし タグが間違った店にあったら どうでしょう あるいは 誰かがこの店に わざと異なるタグを設置したら? 混乱を招き 詐欺につながる可能性さえあります それを防ぐには ユーザーがタグをスキャンした時 本当にその店舗にいるかを確認すべきです
そのためにはユーザーの位置の取得が必要です その情報を使って店舗の位置と 一致するかを確かめます
場所の確定ができれば 十分に実現できます 位置情報にフルでアクセスする必要はありません
ユーザーはApp Clipカードが その実行を許可する権限を持っています
App Clipが物理的なコードから ペイロードを受け取ると ペイロードが特定の場所で入手されたかを システムに確認します すると“はい”か“いいえ”の返答が得られます プロンプトは不要です
位置確認を有効にするには NSAppClipRequestLocationConfirmationの キーをInfo.plistに追加してください
App Clipが起動し NSUserActivityからペイロードを取得したら― 座標と半径を使って コードを取得すべき領域を準備します 半径は500メートルまで設定できます
最後にconfirmedAcquired(in:region) APIを プログラムしてください クロージャが結果を教えてくれます これが位置情報確認です
次に支払いです アプリケーションと同様 App Clipでも あらゆる支払い方法が使えます Apple Payを使えば 迅速かつ安全に購入ができます クレジットカード番号の入力も不要です 支払い体験を高速化する優れた手段です
通知を使ってApp Clip使用後のユーザーと つながることができます 昨今 通知を送るには まず許諾を求める必要があります
App Clipの通知を使えば 1回の起動につき 8時間後まで許諾を受け取れます
ユーザーはApp Clipカード上で変更できます 起動後 通知を送れます プロンプトは必要ありません App Clip起動中はいつでも 一般的な許諾を要求できます
App Clipの通知を有効にするには NSAppClipRequestEphemeralUser NotificationをInfo.plistに追加してください
App Clipカードでユーザーが 許可を与えたかどうかを知るには 通知設定のauthorizationStatusを 確認してください
最後にサインインです “Appleでサインイン”は アカウント作成や 既存のアカウントへのサインインの際に 秘密が守られる便利な方法です ユーザーが既に アカウントのパスワードを 持っている場合は AuthenticationServices APIを使えば― ログイン画面の表示することもなく サインインを効率化できます
以上の改善策をすべて統合すると― 決済体験は はるかにスムーズです
ユーザーはApp Clipを持っていて いつでも簡単にアプリケーションを入手できます iOSは その機会をユーザーに何度も提供します
App Clipを有効にすると 名称やアイコン App Storeリンクを含む アプリケーションバナーを少しの間 表示します バナーをタップするとApp Storeにつながり アプリケーションをインストールできます ユーザーはApp Clip設定パネルからも アプリケーションを入手できます App ClipはビューにStoreKitやSKOverlayを 埋め込むことも可能です ユーザーがタスクを終えた後に オーバーレイを表示すると最も効果的でしょう 例えば 支払い確認ページに 並べて配置してはどうでしょう
SKOverlayをApp Clipに追加するには appStoreOverlay修飾子を使い AppClipConfigurationで設定してください SKOverlayの詳細については “What's New with In-App Purchase”を ご覧ください
購入リストや購入履歴などのユーザーデータを App Clipからアプリケーションに渡したい場合 Secure Application Groupを 使えば可能です
Secure Application Groupには App Clipとの間でのみアクセスできます ユーザーがアプリケーションを インストールすると App Clipが削除され アプリケーショングループが アプリケーションに転送されます
ユーザーは 既にアプリケーショングループで App Clipにサインインしている場合 自動的にアプリケーションに サインインできます 手順を説明します ユーザーがApp Clipで “Appleでサインイン”でログインしたら userIDをファイルまたはデータベースとして sharedAppGroup内に保存します
ユーザーがアプリケーションに アップグレードした後 アプリケーショングループに保存された userIDを読み込みます そして ASAuthorizationAppleIDProvider()を 使ってuserIDを検証します ユーザーが既に App Clipでサインインしていた場合は シームレスにアプリケーションへ サインインできます
ここでルーミンに交代し デモをしてもらいます ルーミン ヨンジュン App Clip体験の簡略化の 説明をありがとう App Clipsチームのエンジニア ルーミンです 今日はApp Clipを簡略化する方法のデモをします 簡略化されていなければ App Clipを起動したユーザーには 次のような画面が表示されます その場で位置情報や通知のアクセスを 許可するかを決めなければなりません ストレスのない体験とは言えません では これらの許諾要求を 簡略化する方法を考えましょう まずは通知です App Clipはアラート表示行うことなく 8時間は一時的に通知を送れるよう要求できます “Fruta”のXcodeプロジェクトを開きました まずApp ClipのInfo.plistを確認します NSAppClipDictionaryを開き ブーリアン値を設定しましょう NSAppClipRequestEphemeralUser Notificationを“Yes”と設定します 次にFrutaClip.swiftに戻り 通知の認証を求める前に App Clipが既に一時的な通知を 認めるステータスになっていることを確認します
これはiOS 14でApp Clipに 導入された新しい値です 既に一時的な通知を 認めるステータスを取得していれば ユーザーにアラートの許可を 得る必要はありません Clipをビルドし デバイスにインストールしましょう
位置情報のプロンプトは残っていますが 通知許諾のプロンプトはなくなりました 確認しましょう 設定に進み Frutaの通知設定を見ると “8時間後にオフ”と表示されます これはFrutaのApp Clipに 物理的な起動に紐づく8時間の一時的な 通知の許可を与えられたことを示しています 偶然にもスムージーができたようです 一時的な通知が機能していることも 確認できました 次に NFCやQR コードなど 物理的な起動方法で立ち上げた場合 App Clipは単発の位置情報確認を要求できます 設定を確認しましょう Info.plistのNSAppClipDictionaryでの 一時的な通知の設定方法と― 位置情報確認のための作業はよく似ています 今回は AppClipRequestLocation Confirmationのブーリアン値を “Yes”と設定します そしてFrutaClip.swiftに戻ります Core Location APIを使えば 既存のコードを 削除して位置情報の更新を明示的に要求できます 既にプロジェクト設定でAppClip.frameworkに リンクしているので ここにフレームワークをインポートします
次に handleUserActivityで URLから認証するため appClipActivationPayloadおよび 位置の緯度と経度を取得します
この後 確認したい領域をインスタンス化します
そしてpayloadの confirmAcquired(in: region)を呼び出しましょう
次に ユーザーが領域内にいる時のみ Apple Payの稼働を許可します
もう一度App Clipをビルドし 実行します
Fruta本社のQR コード発送チームが QR コードの印刷で― クパチーノ店とサンフランシスコ店のものを 混同してしまいました 位置情報確認がなければ 何も知らない顧客が 誤って他人のスムージーの 支払いをしてしまうかもしれません ここで良い点は 位置情報確認が我々を守ってくれることです 位置情報確認が どのように自分や 顧客の動きを防御するのかを見てみましょう 私は今 クパチーノ店にいます このサンフランシスコ店の QR コードをスキャンします
App Clipを立ち上げて注文しようとすると 位置情報確認が機能して スムージーの支払いはできなくなりました 私がFrutaの店舗所在地である サンフランシスコにいないからです ではXcodeに戻り Xcodeを使ってサンフランシスコの中心地に いるとしてデバイスのシミュレーションをします テレポーテーション技術を使い 光の速さで長距離を移動しました 同じQR コードを再びスキャンしましょう
今回はApp Clipを開くと 普段どおり支払いに進めます
最後に App Clipからアプリケーションへの 認証情報の移行についてです 同僚のヨンジュンが説明したように 既に安全なグループコンテナを設定し アプリケーションとApp Clip間で共有しました OrderPlaceView.swiftを開きます
“Appleでサインイン”が成功したら グループコンテナに認証情報を書き込みます
ユーザーが簡単にフルアプリケーションに アップグレードできるよう この機にこそStoreKit overlayを 設定するといいでしょう
“Appleでサインイン”が成功した直後と ユーザーが決済を完了した後にも 表示させましょう フルアプリケーションを立ち上げる時 コードを追加して FrutaModel.swiftに 認証情報を移行できます
App Clipではなく メインのアプリケーションを ビルドする時のみ アカウント情報を移行します グループコンテナから保存したuserIDを 読み込みましょう 新規のASAuthorizationAppleIDProvider()を インスタンス化し 認証状態を取得します もう一度 Clipを実行しましょう
今回は 注文をします
注文の品が準備できたら “Appleでサインイン”します
ユーザーにとって これは フルアプリケーションを取得し― ログイン情報を自動的に移行する 絶好の機会です そこで先ほどヨンジュンが説明したように UI SKOverlayを追加したのです
アカウント移行の処理に関して アプリケーションに加えた変更は まだApp Storeに提出されていません ビルド・実行し フルアプリケーションへの アップグレードをシミュレーションしましょう ターゲットスキーム選択で― フルアプリケーションを選び デバイスでビルド・実行します
ご覧のとおり 自動的にログインされ ポイントが表示されています 一時的な通知と 単発の位置情報確認の 設定方法についてお話ししました App Clipからフルアプリケーションへの ユーザーデータ移行についても説明しました “App Clip体験の簡略化”のデモは以上です ヨンジュンにつなぎます ありがとう ルーミン 位置情報確認とApp Clip通知の使い方が よく分かりました この動画では App Clipの設計と構築の ベストプラクティスと― App Clipの決済を簡略化する方法と― ユーザーがアプリケーションに 移行しやすくなるアイデアをお伝えしました ありがとうございました WWDCをお楽しみください
-
-
7:53 - Confirm a physical code's location.
import AppClip guard let payload = userActivity.appClipActivationPayload else { return } let region = CLCircularRegion(center: CLLocationCoordinate2D(latitude: 37.3298193, longitude: -122.0071671), radius: 100, identifier: "apple_park") payload.confirmAcquired(in: region) { (inRegion, error) in }
-
9:24 - Query if user has granted app clip notification on app clip card.
import UserNotifications let center = UNUserNotificationCenter.current() center.getNotificationSettings { (settings) in if settings.authorizationStatus == .ephemeral { // User has already granted ephemeral notification. } }
-
10:49 - Embed SKOverlay to your app clip
import SwiftUI import StoreKit struct ContentView : View { @State private var finishedPaymentFlow = false var body: some View { NavigationView { CheckoutView($finishedPaymentFlow) } .appStoreOverlay(isPresented: $finishedPaymentFlow) { SKOverlay.AppClipConfiguration(position: .bottom) } } }
-
11:32 - Save user ID in app clip's secure app group.
// Automatically log in with Sign in with Apple import AuthenticationServices SignInWithAppleButton(.signUp, onRequest: { _ in }, onCompletion: { result in switch result { case .success(let authorization): guard let secureAppGroupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.apple-samplecode.fruta") else { return }; guard let credential = authorization.credential as? ASAuthorizationAppleIDCredential else { return } save(userID: credential.user, in: secureAppGroupURL) case .failure(let error): print(error) } })
-
11:55 - Automatically sign in users to your app if they have signed into your app clip.
import AuthenticationServices let provider = ASAuthorizationAppleIDProvider() guard let secureAppGroupURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.apple-samplecode.fruta") else { return }; let user = readUserID(in: secureAppGroupURL) provider.getCredentialState(forUserID: user) { state, error in if state == .authorized { loadFavoriteSmoothies(userID: user) } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。