WWDC Quick Look 💓 By SwiftGGTeam
What's new in App Clips

What's new in App Clips

元の動画を見る

ハイライト

iOS 17 では、デジタル通話シナリオにおける App Clip サイズの上限が 50MB に増加し、デフォルトの App Clip Links 設定不要の通話リンクが追加され、あらゆるアプリが Safari を経由せずに App Clip を直接呼び出せるようになります。

主な内容

App Clip は、ユーザーが完全版 App をダウンロードしなくても中核機能を体験できる仕組みです。iOS 17 では、App Clip の構築と配布のハードルが 3 つの面から下がりました。

サイズ上限: デジタル起動は 50MB、物理起動は 15MB

00:59)App Clip は即時起動を保つために小さいサイズである必要があります。ただし利用シーンによってネットワーク条件は大きく異なります。NFC タグや QR コードは屋外のモバイル通信で使われることが多く、Messages のリンクや Safari ページは Wi-Fi 環境で開かれることがよくあります。

iOS 17 では、2 種類の起動方法ごとにサイズ制限が分かれています。

起動方法サイズ制限適した場面
物理起動(NFC、QR コード、App Clip Code)15MB屋外、移動中
デジタル起動(Messages、Safari、Spotlight)50MBWi-Fi、屋内
iOS 15 以前10MB古いシステムとの互換

01:53)50MB あれば、より多くのリソースを含められます。これまでサイズを抑えるために実行時に素材をダウンロードしていた場合でも、App Clip に直接同梱して初回体験をより完成度の高いものにできます。ゲームの体験版、オンライン注文、コンテンツのプレビューなどの場面で効果があります。

(02:19) 以前は、URL を通じて App Clip を呼び出すには、Apple App Site Association ファイルと関連メタデータを独自の Web サイトでホストする必要がありました。これは、Web サイトを持っていない開発者、または Web サイトの構成を維持したくない開発者にとっては負担です。

iOS 16.4 以降では、App Store Connect が Default App Clip Link を自動生成します。

https://appclip.apple.com/id?p=com.example.app.Clip

03:40)リンクにはクエリパラメータを追加できます。ゲーム体験版の App Clip なら ?character=wizard で初期ロールを指定でき、フード注文 App Clip なら ?restaurant=123 でレストランを指定できます。

App Clip 起動後にパラメータを解析します。

import SwiftUI

struct ContentView: View {
    @State var parameters: [URLQueryItem] = []

    var body: some View {
        VStack {
            ForEach(parameters, id: \.name) { item in
                Text("\(item.name): \(item.value ?? "")")
            }
        }
        .onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { userActivity in
            guard let inputURL = userActivity.webpageURL else { return }

            let components = NSURLComponents(
                url: inputURL,
                resolvingAgainstBaseURL: true
            )
            guard let queryItems = components?.queryItems else { return }

            self.parameters = queryItems
        }
    }
}

キーポイント:

  • onContinueUserActivity は App Clip 起動時の NSUserActivity を受け取る
  • webpageURL にはクエリパラメータを含む完全な起動 URL が入る
  • NSURLComponents によるパラメータ解析は通常の Universal Link と同じ

任意の App から App Clip を起動する

04:20)iOS 17 より前は、App 内から App Clip を起動するには Safari または Safari View Controller を経由する必要がありました。現在は直接起動できます。

方法 1: リンク プレゼンテーションのリッチ テキスト プレビュー

import LinkPresentation

let provider = LPMetadataProvider()
let url = URL(string: "https://appclip.apple.com/id?p=com.example.app.Clip")!

provider.startFetchingMetadata(for: url) { metadata, error in
    guard let metadata = metadata else { return }

    DispatchQueue.main.async {
        let lpView = LPLinkView(metadata: metadata)
        // ビュー階層に追加すると、ユーザーのタップで App Clip を起動できる
    }
}

キーポイント:

  • LPMetadataProvider はリンクメタデータを非同期に取得する
  • LPLinkView はアイコンとタイトル付きのリッチテキストカードを描画する
  • ユーザーがカードをタップすると、Safari を経由せずに App Clip を直接起動できる

方法 2: 直接呼び出す (デフォルトのアプリ クリップ リンク)

SwiftUI:

var body: some View {
    let appClipURL = URL(
        string: "https://appclip.apple.com/id?p=com.example.naturelab.backyardbirds.Clip"
    )!

    Link("Backyard Birds", destination: appClipURL)
}

UIKit:

func launchAppClip() {
    let appClipURL = URL(
        string: "https://appclip.apple.com/id?p=com.example.naturelab.backyardbirds.Clip"
    )!

    UIApplication.shared.open(appClipURL)
}

キーポイント:

  • Default App Clip Link は Link または open(_:) で直接起動できる
  • 起動後、システムが App Clip カードを表示し、ユーザーの確認後に入る
  • 同じ開発者に限定されず、どのアプリでも任意のアプリ クリップを呼び出すことができます

詳細

サイズ制限の実際の影響

01:10)物理起動が 15MB のままなのは、ユーザーが移動中でネットワーク条件が不安定なことが多いためです。一方、デジタル起動が 50MB に拡大されたことで、より豊かな体験を提供できます。

  • ゲーム体験版: 完整なステージ素材、キャラクターモデル、効果音を含められる
  • オンライン注文: メニューの写真やレストランの環境の写真を含めることができます
  • コンテンツプレビュー: 動画クリップや高解像度の画像セットを含められる

02:04)対象ユーザーに iOS 15 ユーザーが含まれる場合は、引き続き 10MB 制限を守る必要があります。条件付きコンパイルや実行時検出で分岐できます。

03:13)Default App Clip Link は App Store Connect で App Clip を公開すると自動生成され、形式は固定です。

https://appclip.apple.com/id?p={BundleIdentifier}

Bundle Identifier は App Clip target の完全な bundle ID で、通常は .Clip で終わります。

パラメータ渡しの例:

https://appclip.apple.com/id?p=com.example.game.Clip&level=demo&character=knight

App Clip 内での解析:

.onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { activity in
    guard let url = activity.webpageURL,
          let components = URLComponents(url: url, resolvingAgainstBaseURL: true),
          let items = components.queryItems else { return }

    let level = items.first(where: { $0.name == "level" })?.value
    let character = items.first(where: { $0.name == "character" })?.value

    // パラメータに基づいて初期画面を構成
}

App をまたいだ起動シーン

04:33)講演者は Notes App で、メモに Backyard Birds の App Clip リンクを置き、タップすると App Clip カードが直接表示される様子をデモしました。この流れに Safari は不要です。

実際の利用シーン:

  • ソーシャル App でレストランの App Clip を共有し、友人がタップして直接注文する
  • ナビゲーション App から駐車場の App Clip を起動し、そのまま支払いを完了する
  • メール App から会議用 App Clip を起動し、ビデオ会議に直接参加する

重要ポイント

1. 完全版 App 向けにゲーム体験版 App Clip を構築する

  • 何をするか: 50MB のサイズ上限を活用し、ゲームの最初のステージやチュートリアルを App Clip としてパッケージ化する
  • 取り組む価値: ユーザーは数百 MB の完全版ゲームをダウンロードせずに中核の遊びを体験でき、従来型広告より高い転換率を期待できる
  • 始め方: Xcode でプロジェクトに App Clip target を追加し、ステージ素材と中核ロジックを共有して Default App Clip Link で配布する

2. コンテンツ共有に App Clip を埋め込む

  • 何をするか: ユーザーがあなたの App からコンテンツを共有するとき、関連する App Clip の Default Link を添える
  • 取り組む価値: 受け取った側はリンクをタップするだけで関連機能を体験でき、完全版 App の事前ダウンロードが不要になる
  • 始め方: ?itemID=123 のようなパラメータ付き Default App Clip Link を生成し、LPLinkView でリッチテキストプレビューを表示する

3. オフライン現場での素早いサービス

  • 何をするか: レストラン、駐車場、ジムなどで NFC タグや QR コードから 15MB 以内の軽量 App Clip を起動する
  • 取り組む価値: ユーザーはスマートフォンをタグに近づけるだけで注文、支払い、チェックインを完了でき、App のダウンロードや Web ページの表示が不要になる
  • 始め方: App Clip を 15MB 以内に抑え、物理起動体験を構成し、App Store Connect で App Clip Code を生成する

4. App をまたいだエコシステム内の即時サービス

  • 内容: App Clip を他のアプリから直接呼び出して、エコシステム内のサービス ノードにできるようにします。
  • 取り組む価値: iOS 17 では任意の App から任意の App Clip を起動できるため、App をまたぐサービスネットワークを構築する機会になる
  • 始め方: 簡潔な Default App Clip Link パラメータ規約を設計し、起動方法を文書化して、連携先が統合しやすくする

関連セッション

コメント

GitHub Issues · utterances