ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
ユニバーサルリンクの新機能
ユニバーサルリンクを使用すれば、あなたのAppがインストールされていなくても、あなたのコンテンツにアクセスしやすくなります。Apple WatchおよびSwiftUIのサポートを含む、Universal Links APIの最新の更新について説明します。ワイルドカード、置換変数、Unicodeサポートなどの拡張パターンマッチング機能を使用して、Appサイト関連付けファイルのサイズと複雑さを軽減する方法について学びます。また、キャッシュされた関連ドメインデータによって、あなたのAppを使用する人の最初の起動体験をどのように改善できるか見ていきましょう。
リソース
関連ビデオ
WWDC22
WWDC21
WWDC20
WWDC19
-
ダウンロード
こんにちは ようこそWWDCへ “ユニバーサルリンクに関する新機能” “ユニバーサルリンクに関する新機能” へようこそ 私はクリストファー・リンです 以前 WWDCでユニバーサルリンクについて お話ししましたが 簡単に振り返りましょう
ユニバーサルリンクは HTTPSやHTTP URLで Web上とアプリケーション内で コンテンツを表すものです ユーザーは Webブラウザの代わりに App上でコンテンツを開くことができるので より豊かな経験を提供できます Appに特別なエンタイトルメントである Associated DomainsをAppに追加し WebサーバーにJSONファイルを 追加することでそれを作成します エンタイトルメントは Webサーバーのドメイン名を示唆し Webサーバーは Appのアプリケーション識別子を示唆します これにより AppとWebサイトの間に 安全な双方向の関連付けが作成され AppがWebサイトに代わって 特別なタスクを実行できるようになります 現在カスタムURLスキームを 使用している箇所は できるだけ早く ユニバーサルリンクに移行してください
カスタムURLスキーマは推奨しません ユニバーサルリンクの詳細と 適応方法については WWDC19のセッションをご覧ください ユニバーサルリンクのハイレベルのレビュー後は 楽しいことに移りましょう 新しいプラットフォームのサポートです 今年追加する最初で最小のプラットフォームは watchOSです ユニバーサルリンクは他のプラットフォーム上と 同様に watchOS上でも動作しますが プラットフォームによって いくつかの違いがあります 1つ目はWatchKitを使う場合で UIKitやAppKitを使う場合と APIが異なります Associated Domainsを含むエンタイトルメントは WatchKit拡張機能に適用されるものであり WatchKit Appが含まれているものではない ことを覚えておきましょう iOSやMac Catalystを使用する場合 UIApplicationDelegateメソッドの application: continue userActivity: restorationHandler を実装し ユニバーサルリンクを処理します デリゲートメソッドをどのように使用するかは 以前のセッションで触れました 別のアプリケーションで ユニバーサルリンクを開きたいときは UIApplication openURLを使用します しかし watchOSではUIKitではなく WatchKitを使用するので watchOSで採用するためには いくつかの変更が必要になります WKExtensionDelegateの handle userActivityメソッドは 着信ユニバーサルリンクを処理します このメソッドのボディは 基本的にiOSとmacOSの場合と同じです 別のアプリケーションでURLを開くには WKExtensionの openSystemURLメソッドを使用します 他のプラットフォームと同じように インストールされていないアプリケーションで ユニバーサルリンクを開けようとしても リンクを開くことはできません watchOSではメールやメッセージなどの 限られたコンテンツを除き― Safariが使えません また このメソッドは 値を返したり補完ハンドラを取ったりしません そのため ユーザーを ノーフィードバックで放置するのではなく このように watchOS上でユーザーにUIを提示します ここで我々が取り組んできた― お気に入りのレストランのメニューを 見せてくれるアプリケーションを表示しています 好きな食べ物を選び ユニバーサルリンクを発動させて 各レストランのアプリケーションで 注文することができます しかしこのApple Watchには このレストランの アプリケーションはインストールされていません そのため注文ボタンをタップすると ペアリングされたiPhoneで続けてくださいと アラートが表示されます 簡単にまとめると これらが WatchKitを使用する際に ユニバーサルリンクを処理し開くメソッドです UIKitを使用する際と同等のメソッドです アプリケーションがUISceneを使用するように 構成されている場合は UIApplicationのみを使用するメソッドを 実装する必要があることにご注意ください そして AppKitはUIKitに似ていますが UIKitとは別のものです 最終的には 使用するAPIは使用している プラットフォームとSDKに依存します しかし 喜ばしいことに― SwiftUIは今年も ユニバーサルリンクのサポートを追加しています そして どのプラットフォームやSDKを使っても このように見えます 今年のSwiftUIの機能強化の詳細については “What's New in SwiftUI”を ご確認ください SwiftUIを使用する際にwatchOS上でも ユニバーサルリンクが使えるようになったのは 本当に喜ばしいことですね また すべてのプラットフォームで利用可能な 新機能も用意したので ご紹介しましょう
まずユニバーサルリンクでパターンマッチングが どのように機能するかを簡単におさらいします パターン文字列では アスタリスクとクエスチョンマークを使用し ワイルドカードを指定できます アスタリスクは 0個以上の文字に貪欲にマッチします 可能な限り何文字でもマッチします
クエスチョンマークは 1文字だけに一致します 少なくとも1文字に一致するようにするは クエスチョンマークの後に アスタリスクを付けてください ワイルドカード文字を使用した パターンマッチングについての詳細は 昨年のビデオでご確認ください では新しいクールなトピックに移りましょう 本日最初にお伝えしたい 新しい機能は Case-insensitiveパターンマッチングの サポートです この機能については 多くのリクエストがありました このようなパターンがあるとしましょう これは パスコンポーネントsourdoughで始まるパスと それ以降の少なくとも 1文字のパスにマッチします ただし 小文字のsourdoughとしか一致しません そこで 大文字と小文字の すべての組み合わせをサポートするために 文字の組み合わせごとに パターンを追加するといいかもしれません しかし組み合わせが多すぎるので 実際にはやらないでしょう しかし コンポーネントディクショナリに 新しいキーを導入するため もう悩む必要はありません caseSensitiveです 値をfalseに設定することで caseSensitiveパターンマッチングを無効にし caseInsensitiveパターンマッチングを 有効にします CaseInsensitiveパターンマッチングは macOS Catalina 10.15.5とiOS 13.5で 利用可能です 次はUnicodeについてお話ししましょう URLは常にASCIIです 非ASCII Unicode文字を使用した URLに遭遇すると 実際にはこのような パーセントで エンコードされた文字に遭遇します 文字列はUTF-8に変換され UTF-8の各バイトの16進数表現が― URL内に配置されます これは "ants crawling on logs"と呼ばれる 美味しい四川料理の名前です しかし 中国語を十分に読める人でも このURLから読み取るのは難しそうです このパターンに実際に漢字が含まれていたら 素晴らしいと思いませんか? 実はできるようになりました コンポーネント辞書に percentEncodedキーを追加し 値をfalseに設定します これにより パーセントエンコーディングが無効になります つまりパターンが 7ビットのASCII文字の代わりに 32ビットのUnicodeコードポイント のシーケンスとしてマッチします Unicodeのサポートは macOS Big SurとiOS 14で利用可能です そしてもちろん percentEncodedと caseInsensitiveの両方を 同じパターンで使用できます caseInsensitive Unicodeパターンを サポートしています
しかし ここではpercentEncodedが 2回指定され caseSensitiveも2回指定されているので 繰り返しになるかもしれません これで パターンが明示的に上書きしない限り すべてのパターンにデフォルトで 適用される値を含む辞書であるデフォルトを 追加できるようになりました このキーを追加すると 各コンポーネントから percentEncodedキーと caseSensitiveキーを 削除することができます その方がずっとスッキリします もし同類のコンポーネントであれば そのコンポーネント配列内の すべてのパターンに適用されます もしdetailsの同類であれば このドメインのすべてのユニバーサルリンクに 適用されます そしてデフォルトキーは macOS Big SurとiOS 14で利用可能で Unicodeのサポートもあります では 現実世界の パターンマッチングを見てみましょう これは実際にあった話です 私と同僚のジョナサンは 食べ物を注文するアプリケーションを作っており watchOSサポートの話で 少しだけお見せしたものです ここにパターンマッチさせたいURLがあります ロケールコードが含まれており 2文字の言語コード アンダースコア 2文字の国コードで構成されています その後に製品名が続き ウェブサイトや対応するAppで販売されている いくつかの食べ物のアイテムを指します このようなURLに合理的に マッチするシンプルなパターンは ここでご覧になっているようなものです クエスチョンマークは1文字にマッチし その後にアスタリスクが続くと 1つ以上の文字に マッチすることを覚えておいてください しかしこのパターンは望んでいるより多くの URLとマッチします 我々が商売していない国や サポートしていない言語 販売していない商品はどうでしょう? このパターンはこれらすべてとマッチします パターンマッチングで最初に試したことは マッチさせたい可能な値のリストを ハードコーディングすることでした それは対象とする地域や サポートする言語が少なく 商品が少なければ うまくいったかもしれません しかしジョナサンの努力のおかげで 世界100カ国以上で展開しています 販売している商品を追加した途端 全てが崩壊してしまいました 2文字の言語コード 2文字の地域コード 4つの製品を考えてみると 180万通りのパターンがあり 27メガバイト以上の容量になります パターンマッチングには 指数関数的な複雑さがあるからです このapple-app-site-associationファイルを見て もっとうまくやろうと思いました ユニバーサルリンクの新機能である 置換変数と呼ばれる機能をご紹介します いったい何でしょう? 一言でいえば マッチさせることができる 文字列の名前付きリストです これらの変数は パターンマッチ文字列に現れ 指定した値のすべてを表します 名前にはほとんどすべての文字が含まれています ドル記号やカッコが制限される理由が 一瞬でわかります パターンの中で変数名に遭遇した場合 変数名は常に大文字と小文字を区別します 一方 指定した値にはクエスチョンマークと アスタリスクを含めることができますが 置換変数を参照することはできず 再帰は行えません パターンマッチングが大文字小文字を 区別する場合 値は大文字小文字を区別し それがデフォルトの動作です 大文字小文字を区別しない パターンマッチングを有効にしている場合 値はそれに応じてマッチングされます 始めるために いくつかの一般的な代入変数を組み込みました 1つ目はaplhaで すべての大文字と小文字のASCII文字です ここでドル記号とカッコが 制限される理由がわかります これらはパターンで参照される 変数名の一部です
Upperとlowerそれぞれ 大文字と小文字のASCIIアルファベットです Alnumは英数字の略で すべてのASCII文字と 0から9までの数字にマッチします Digitは10進数 xdigitは16進数です これらの変数は 標準Cライブラリの similarly named文字クラスと同等です 次にリージョンですが FoundationのLocaleタイプによって 認識されるすべてのISOリージョンコードです そして最後に ISOの言語コードであるlangがあります 先ほどのスライドで気になっていた― apple-app-site-associationファイルを 見てみましょう これらがフルファイルに表れるパターンです 置換変数を装備したので この組み合わせの悪夢から 目を覚ます準備ができました
まず最初にやることは substitutionVariablesという名前の applinksの下に 新しいキーと値のペアを追加することです キーの値はディクショナリです ディクショナリに入っているキーは変数名で 値はマッチする一連の文字列の サブセットを含む配列です ここで追加した変数はfoodという名前で 4つの値を持ち得ます
そして この変数をこれらのパターンで使用します 27メガバイトが消えるのを見てください
明らかに改善されましたね 3つの置換変数を使って この偉業を達成しました langとregionは定義済みの変数なので 自分で定義する必要はありませんでした そしてfoodは上で定義した変数です 変数を定義すると 名前が クォーテーションマークで囲まれます それは JSONキーの構文だからです パターンではドル記号とカッコで囲まれています これで公開できますが 1つ問題があります メープルシロップの供給確保に苦労しているため カナダではアプリケーションや商品を 販売することができません そこで カナダに対応する ISO地域コードCAと一致させるために その前に別のパターンを追加します そして このパターンを除外としてマークし URLがこのパターンに一致する場合 ユニバーサルリンクとして このアプリケーションで 開くべきではないことを オペレーティングシステムに伝えます この方法で 変数値の 個々の組み合わせを除外することができます しかし ジョナサンはカナダ出身なので ぜひ母国で商売をしたいと考えています では メープルシロップの供給を 確保するとしましょう もちろん シロップのような良さがあるということは カナダは他の国とは違うメニューを 必要としているということです 代入変数で特殊なケースを どのように扱うことができるのでしょうか? 難しくはありません 別の変数であるカナダ料理を カナダ専用に追加するだけです メニューの中にいくつか重複がありますが 問題はありません そして 除外パターンは そのままにしています これを削除した場合 最後のパターンはカナダの食べ物変数の すべての値と一致することになりますが それは避けたいところです これで このファイルをデプロイする準備が ほぼ整いました しかしカナダは多言語国家です すべてのカナダ人が 英語を話すわけではありません 最低でも英語とフランス語を サポートする必要があります そこで カナダ料理の名前の フランス語訳を追加します
おかしいですね フランス語の食べ物の名前の1つに アクセント付きの文字があります そのため パーセントエンコーディングに 対応する必要があります きれいにしましょう とてもよくなりました 今年から導入する percentEncodedキーが使えます パターンや変数の中で直接 アクセント付きの文字が使えるようになります 完了です お腹がすきました しかし このアプリケーションで ランチを注文すれば長く待たなくてよいのです なぜなら 代入変数は現在― macOS Catalina 10.15.6と iOS 13.5のアップデートで利用可能だからです apple-app-site-associationファイルの内容に ついて話をしたところで ユーザーのデバイスにどのように伝わるのか― その流れを改善するためには どうすればいいのかお話ししましょう
iPadがあり アプリケーションを ダウンロードしたいとします App Storeを開き ダウンロードしたアプリケーションを選びます できましたね
Appがダウンロードされインストールされた後 システムはその資格をチェックし 1つ以上のapple-app-site-associationファイル からのデータを必要としているか確認します デバイスは ファイルをダウンロードするために そのファイルがホストされている Webサーバーへの接続を開きます 現在 デバイスの帯域幅は限られているため 複数のWebサーバから複数のファイルを ダウンロードする必要がある場合 デバイスはいくつかのファイルを 一度にダウンロードする必要があります apple-app-site-associationファイルは Webサーバーからデバイスへの道を作り Associated Domainsデーモンによって解析され アプリケーションのユニバーサルリンクが アクティブになります その後 装置は次のキューに入っている サーバなどに移動します しかしダウンロードに 問題があったらどうでしょう? 少しスライドを戻して もう一度 ファイルをダウンロードしてみましょう デバイスはサーバーへの接続を 確立しようとします しかし Wi-Fiがダウンしたり サーバーがクラッシュしたり 単に端末からサーバーに アクセスできないとしましょう ダウンロードがどこまで進むかは 障害の正確な性質にもよりますが データは端末に届きません 結局 デバイスはダウンロードを諦めて 次のサーバーに移動しなければなりません これにより Appはインストールされているが ユニバーサルリンクや― 他のアソシエイテッドドメインのデータが 利用できないという矛盾した状態になります システムが次にアプリケーションのデータを 更新しようとするまで この状態は 数時間または数日続きます しかし もっと上手くできると思います 再びスライドを戻しますが 今回は奥の手があります もう一度App Storeでアプリケーションを選び デバイスにダウンロードします AppにAssociated Domainsの権限があることを デバイスが認識します しかし 関連するWebサーバーに接続する代わりに Associated Domainsデータを管理する― コンテンツ配信ネットワーク(CDN)に 接続します
CDNは強力なツールで 大量のデータをキャッシュすることができるので このWebサーバーからのデータを すでに保存しているかもしれません しかし そうではないとしましう CDNはデバイスの代わりに サーバーに接続することができますが 強力なので デバイス上のすべてのAppと 同時に接続することができます すべてのドメインのapple-app-site-association ファイルを同時にダウンロードし キャッシュし 1つのネットワーク接続で データをデバイスに送ることができます このデバイスは前回試した時よりも ずっと幸せそうです ここでCDNを使う理由は多くあります Associated Domainsと apple-app-site-associationファイルだけに 特化したCDNを構築しました ユーザーに最高の体験を提供するために 微調整することができます CDNは複数のWebサーバーから データをキャッシュするので Webサーバーごとに個別に接続するのではなく 単一のHTTP/2接続を使用して 必要なすべてのデータを要求することができます キャッシングは 1日に何百万もの リクエストがある可能性のあるものから サーバーへの総負荷を ほんの一握りに減らすことができます CDNはknown-goodと known-fast接続があるため アプリケーションでのユーザー体験は 全体的により信頼性が高まります macOS Big SurとiOS 14をはじめとして ウェブサーバーは公開されたインターネット上の AppleのCDNからの Apple-app-site-associationファイルの リクエストのみを受信します しかし すべてのサーバーが 同等に作られているわけではありません 公共のインターネットからWebサーバーに 接続できない場合はどうでしょう? おそらく 導入前のテストに 使用しているWebサーバーや 社内ネットワークに接続している従業員のみが 使用するWebサーバーではないでしょうか このようなシナリオをサポートするには どうしたらいいでしょうか?
これらを手助けするため CDNサポートの中に いくつかの機能をデザインしました これを代替モードと呼びます 代替モードによって CDNを迂回し 直接 管理しているドメインに接続します macOS Big SurとiOS 14には 2つの代替モードがあり 使用する時に区別されます 1つ目の代替モードは 開発者モードと呼ばれます TestFlightやエンドユーザーに展開する前に Appを構築したりテストしたりする時のために デザインされました
2つ目の代替モードは管理モードと呼ばれ AppがMDMプロファイルを使用して インストールされた時のためのものです 本日は開発者モードに 焦点を当てます デバイスの管理と MDMプロファイルの設定の詳細については Managing Apple Devicesをご覧ください 開発者モードとの最初の大きな違いは このモードを有効にすると オペレーティングシステムの組み込み 証明書ストアで信頼されていない場合でも Webサーバ上で有効な SSL証明書を使用できることです
これは想像よりも強力で 予防策がなければ 中間者攻撃を招いてしまい― ユーザーを多くのセキュリティ問題に さらすことになります 使用するすべてのデバイスで ユーザーは 開発者モードをオプトインしてください iOS watchOS tvOSでのオプトインは このように見えます
アプリケーションの設定を開き 開発者設定を選びます これらは Macで実行しているXcodeに デバイスが初めて接続された後に表示されます 開発者設定で Associated Domains Developmentを有効にします これでデバイスは 開発者モードに設定されました
macOSでは 手順が少し異なります ターミナルを開き ここで表示されたコマンドを入力します swcutil developer-mode -e trueです 管理者パスワードか Touch IDの入力を求められます 許可が下りると 開発者モードが有効になります これはユーザごとの操作です
開発者モードはグローバルスイッチなので すべてのAppで有効にしたくありません 開発しているAppだけにしてください 開発者プロファイルで 署名されたAppにのみ有効です App StoreやTestFlightでの配布用に 署名されたAppや 署名 公証済みのMacアプリケーションは この代替モードを使って 使用することはできません
最後に 開発者モードと管理モードでは apple-app-site-associationファイルを ドメインのルートではなく .well-knownディレクトリの中で運営します
以上が 代替モードと デバイス上での実装方法についてのまとめです 指定されたドメインでは Appが代替モードを使うべきことを どのようにシステムに伝えるのでしょうか? Associated Domainsエンタイトルメント を見てみましょう このエンタイトルメントは現在 www.example.com.をサポートしています 一般的ですね それでは 開発者モードと管理モードを このAppで有効にしましょう
代替モードごとに個別の エンタイトルメントエントリーを追加しました ドメイン名はただのサンプルです これらはpublic-facingドメインや 他のドメインと区別する必要はありません 実際に使用するドメイン名は あなたの組織固有のものになります
これらの新しいエンタイトルメントには nameモードのクエリと 使用する代替モードを特定する項目が 含まれます 最初に追加したエンタイトルメントの値は このドメインは開発者モードの時に アクセスできると明示しています 2つ目の値は このドメインが開発者モードで アクセスできることを表しています そして3つ目は? デバイスが開発者モードと管理モードの両方を 同時に行っている場合 このドメインはアクセスすることができます 内部アプリケーションを構築する際には この設定を使用するとよいでしょう 本日は多くの新しいことに触れました WatchKitを搭載したwatchOSや SwiftUIを搭載したすべての プラットフォームをサポートしています 効率的で効果的なユニバーサルリンクを 構築するために 置換変数を含むいくつかの新しい パターンマッチング機能が追加されました そして Apple-app-site-associationファイルの ダウンロードするため プロセスを高速化し合理化する 新しいCDNを導入しました これらの新しいツールを使用して どんなものが作られるか楽しみにしています ありがとうございました
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。