ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
AppとブックのMDM割り当ての改善
Apps and Books Management APIを利用して、組織が所有するAppやブックを管理対象のユーザーやデバイスに割り当てる方法を紹介します。最新のAPIの改良点、組織内のアセット数、割り当て、登録ユーザに関する通知の購読、受信の方法についても確認します。また、非同期処理を利用することで、大規模な割り当ての際に必要なリクエスト数を大幅に削減する方法についても紹介します。
リソース
関連ビデオ
WWDC21
-
ダウンロード
♪ ♪ こんにちは WWDCへようこそ 私はAustin 担当は Apps and Books Management API です 今回 私たちがもたらした改善点をシェアします 新しいバージョンのAPIについてです MDMソリューションによるAppとブックの管理 これが今まで以上に迅速かつ スケーラブルにできます 皆さんはすでに使っているかもしれません Apps and Books Management API を これは製品を使用する組織が Appとブックを管理できるようにするものです
組織はこれらのアセットを もう得ているかもしれません Apple School Managerや Apple Business Managerによって また APIではアサインすることができます 所有するAppとブックを 組織が管理するユーザーとデバイスに 今年は多くの変更を導入しました 新しいApps and Books API に このセッションでは その多くの機能を紹介しますが 2つの機能拡張に焦点を当てます これにより ワークフローが最も改善されます リアルタイム通知と 非同期処理です その他の変更点については 新しい 開発者向けのドキュメントを見てください developer.apple.com のデバイス管理の項目です そして このセッションの資料を参照してください さあ はじめましょうリアルタイムな通知機能を
リアルタイムで通知する機能をサポートしたのは アサインやアセットユーザーの状態変更などです これらの通知を受けるには利用の承認が必要です そうすることで あなたは通知を受け取れます クライアント設定で承認したものだけを
リアルタイムの通知はついに取り去ったのです 自分の状態を 常に同期させる必要性を 通知のタイプについてもう少し詳しく説明します 最初の通知タイプはアサインです
アサインとは アセットを組織が管理する ユーザーやデバイスに割り当てることです
ある確定を待たなければならないとき たとえばアサインするグループ全体が 正常に実行されたかなどですが その場合は ユーザーが必要とする コンテンツのインストールに遅れが生じます 現在ではアサインの通知によって リアルタイムで把握できますどのようなアサインが どのデバイスに適用され成功したのか
これらの情報を受け取るには アセットマネジメントの クライアント設定で通知タイプを承認します
そしてAppleは次のいずれかによって アサインが変更されるとあなたに通知します アセットの紐づけ紐づけの解除 取り消し
こういった通知を利用することにより ユーザーやデバイスに与えられたられた コンテンツへの迅速なアクセスを実現できます 通知の例を見てみましょう アサインを行うとこの通知が届きます この例でトリガーになるのは アセットを紐づけるcallです
Appleはこれらの通知をポストします 認証ヘッダの共有秘密キーによって クライアント設定であなたが示した 通知にはペイロードが含まれており これは与えられた通知タイプに固有のものです
この通知のタイプが示されているのが アセットマネジメントです 通知ペイロードには これらが示されます 状態が変更されるアサインや
一意識別子であるイベントID これはMDMがトリガーとなった非同期イベントです もう少し詳しく説明します 新しいAPIの非同期性についてです
ここでは 状態変化の結果について 成功したか 失敗したかを示しています
アサイン状態への変更タイプは ここで紐づけます 次の通知タイプはアセットです
アセットは 組織が入手したAppとブックのことです Apple School Managerや Apple Business Managerから 組織は アセットの管理やアサインができません コンテンツの所有をMDMが確認するまでは アセット通知を使用すると リアルタイムで通知されます アセットに変化が生じた場合たとえば購入や 転送や 払い戻しなどで MDMは常に把握しています 各アセットの現在の利用可能数を クライアント設定のアセット数通知タイプを サブスクライブすることで これらの通知を受け取ります
そして Appleはあなたへ通知を行います アセットの状態が変化すると購入や 転送や 払い戻しのいずれかのイベントで
これらの通知により 迅速に提供できるのです ユーザーが 最近入手したアセットを 例を見てみましょう この通知の これまでのアセットの状況を ふまえた上で アセットの現在の状態を取得するには "get assets" というエンドポイントを使います これは新しい アセットの同期エンドポイントです GETは HTTP特有のリクエストメソッドでもあり バージョン管理のURIとの両方でそれがわかります クエリパラメーターを使ってクエリを実行します adamIdとpricingParamです シングルアセットの状態を取得するために行います
現在 求められるのはserver tokenや またはsTokenをこのベアラートークン形式の すべての新しいAPIリクエストの authorizationヘッダーで提供することです このレスポンスのアセットの配列には 興味深いアセットがあります アサイン可能なものが10,000あります 全体で15,000ある中で 購入が発生するとこの通知を受け取ります ペイロードを見てみると
入手したアセットのadamIdが含まれています
そしてこの場合 デルタは正の整数となります これは 購入または転送を表しています このデルタで アセットの同期エンドポイントを 再度呼び出すことなくカウントを更新します 最後の通知タイプは登録ユーザー向けのものです 展開は デバイスベースの アサインにほぼ依存しますが コンテンツをユーザーにアサインする必要があれば 登録ユーザーの作成が最初のステップとなります
これらのユーザーを個人用 または管理用のApple IDに 紐づけすることは展開のために必要です ユーザー個人のApple IDを 所定のsTokenの登録ユーザーに紐づけるには ユーザーは 自分のApple IDを紐づけるための招待を 承認する必要があります 登録ユーザーの通知により リアルタイムに更新されるようになりました ユーザーの最新の状態が 登録ユーザーの最初の作成と その後の 招待の受け入れの両方について これらを受け取るにはUSER MANAGEMENT と USER ASSOCIATEDの通知タイプを クライアント設定でサブスクライブします ユーザーの状態の変化でAppleから通知されます ユーザーイベントの作成 紐づけ 更新 撤退このいずれかによって
USER ASSOCIATED 通知は より適切に追跡できるようにするためのものです ユーザーがApple IDとの 紐づけの招待を受けた際に では 見てみましょうこれらの通知の例を 以前のユーザーがどのような状態だったのか 考慮しつつ ユーザーの現在の状態を取得するために get users エンドポイントを呼び出します これは新しいユーザーの同期エンドポイントです 対象となるユーザーのみをフィルタリングします clientUserIdのクエリパラメータによって これで レスポンスサイズを 1ユーザーのみに制限します ここでいくつかご紹介するページ処理フィールドは 私たちの同期APIに共通するものです ここに示すのは 現在のページインデックス サイズ ここではユーザーオブジェクトの数が 現在のページにあり 提供されたクエリの全体像です
ユーザーの配列には対象のユーザーのみが 表示されておりここでは ステータスがassociatedではなくregisteredで 招待コードがあります このユーザーは明らかにまだ Apple IDに紐づけけられていません すべての同期APIにはバージョン識別子が含まれ 基礎となるデータに書き込みが行われるごとに 変更されます これは非常に便利なもので 大規模なレスポンスをトラバーサルする際に 前のページのデータが変更 されている可能性を示します 管理しているApple IDを 登録ユーザーに紐づけるには 新しい更新ユーザーのエンドポイントを使います この結果 登録ユーザーの通知がここに表示されます 通知のペイロードには 次のことが表示されます 状態を変更しようとしていたユーザー このMDMトリガーによる非同期イベントの一意識別子 状態変更の結果 成功か 失敗か ユーザーの状態への変更のタイプ ここでは更新 ユーザーの配列を見てみると 対象となるユーザの状態のclientUserIdに idHashとassociatedのステータスが含まれており 管理しているApple IDの紐づけが成功したと 結論づけています これを使い このユーザーの状態を更新します ユーザー同期エンドポイント を再度呼び出すこともなく あなたが紐づけるかわりに それが可能になります 招待リンクを提供することで 自分のApple IDを登録ユーザーに紐づけます ここでは その紐づいたユーザーの通知を見てみます 通知のペイロードの中には ユーザーオブジェクトがあり 関連するユーザに関する情報を含んでいます 以下に限定しませんがclientUserIdや 紐づけられたApple IDを示すidHash 承認した招待コード 紐づけられたことを示すステータスなどです これを使い このユーザーの状態を更新するのです ユーザー同期エンドポイント の再呼び出しは不要です
この通知を受け取るための 登録方法について説明します クライアント設定でのオプトインが必要になります 管理するsTokenごとに
認証用に共有の秘密を提供するには notificationAuthTokenを使用します そしてNotificationUrlでこれらをポストします トークンは これらの通知が実際にAppleから 送られてきたものなのか確認するために使用され クライアント設定でいつでも更新可能です
通知を受け取った際にHTTP 200番台の レスポンスを提供することで 通知が正常に配信されたと Appleに知らせることができるのです Appleは200以外のレスポンスが 返された場合やタイムアウトが発生すると 通知のリトライを試みます Appleの配信方式はベストエフォート型です この通知のリトライは 通知を破棄する前に何度か行われます これが意味するのは通知を受け取れない状態が 一定期間続くと 最新状態にポーリングを行う 必要があるということです 同期するものは限定します 通知が成功しなかった結果状態が古くなるだろうと 分かっているものだけです この新しいAPIに得られた2つ目の大きな機能拡張は 同期処理です
APIの初期バージョンでは すべての管理は同期的に行われていました アセットの管理のためにリクエストを行うと Appleは管理を行います 同期応答を待っている間に つまり 並列処理を行ったのです 一方 非同期処理では Apple側で サーバーが強制的に並列処理を行います これにより処理が最適化され より大きなリクエストを より迅速に処理できるのです
順番に処理することで 特定のリクエストパターンによる断続的な失敗や その後の再試行を減らすことができます
そして それが結果的に ストレスのない大規模な展開が可能となり 教育現場では 新学期の再開が容易になります Appleは 非同期処理で恩恵を受けています Appとブックの購入や転送において Apple School ManagerとApple Business Managerで これにより 組織は手元にある在庫を 数時間ではなく数分で確認できるのです
それでは これらの要素がどのように組み合わされて 新しいAppとブックの管理を 実現するのか見てみましょう
たとえば あなたが管理する組織があります 1万人のユーザーが 各々自分のデバイスを持っていて
彼らの日常業務に欠かせない25個のAppを 各デバイスにアサインするという場合
あなたに課せられるのは 25万件のアサインです これまでのやり方を見てみましょう
あなたのサーバーはAppleに対して ライセンス管理を要求します Appleは同期的に応答を返してきます この応答には要求されたデバイスに アサインされたライセンスが含まれます
このリクエストで管理するAppは1つだけで 最大10台のデバイスまでとなっており 結果的に 10件のアサインしかできません
つまり 最低で2万5千回のリクエストが必要となります 25万件のアサインを行うために 新しいAPIでは この 最低2万5千回のリクエストが わずか10回になります 非同期処理に移行することで それが可能になるのです その方法をご紹介しましょう
左側に追加されているのは 通知サーバーです これまで通りの手順でリクエストを開始します Appleにアセットの管理を依頼します リクエストではsTokenを指定します 認証ヘッダに 複数のアセットを提供できるようになりました 1回のリクエストで 現在最大25個まで提供可能です この動的な制限はservice configで公開され
最大1,000台のデバイスへの アサインを実行し ほかの動的な制限も同様に service configで公開されます Appleは あなたに同期して応答を返します
この応答に含まれているHTTPステータスコードは この新しいAPIにとって重要なものです エラーには200以外の適切な ステータスコードを返します ですから まず先へ進む前に 応答が 200番台であることを確認してください そして 最も重要なことは 一意の識別子が この非同期イベントにあり そのステータスは 新しい イベントステータス エンドポイントを呼び出すか マッチしたアサインの通知を待つことで得られます アサインが完了するとサブスクライブを前提にして Appleはあなたに通知をポストします 通知にはそれぞれ要求されたアサインの サブセットがあり通知のペイロードに リストアップされていて アサインに関するメタデータ が 成功したのか失敗したのかそのタイプと それに対応するイベントIDを示します あなたは待つ必要があります アサインが成功したという通知が来るのを そして リストアップされたデバイスへの インストール用コマンドの送信を進めてください もう一つの 管理用エンドポイントの利点は 注文です たとえば アセットの再アサインのリクエストが あるグループから 別のグループへあった場合 これを実現するには紐づけを解除した後に 紐づけのリクエストを連続送信する必要があります まず 紐づけ解除のリクエストをポストします そうすると Appleは紐づけを解除するための イベントIDを応答しますそれから 次の紐づけ用のリクエストをポストします Appleは 別のイベントIDで対応しますが 今回は 紐づけをするためのものです あなたがサブスクライブしているという前提で 紐づけの解除が完了すると Appleは あなたに通知を行います そしてそのあと 紐づけが完了すると Appleから 通知がポストされるのです 通知のようなAPIの大きな変更により Appleと同期した状態を維持できるようになりました 最新の状態を確保するために継続的にリクエストを 行う必要がなくなったのです
非同期処理によって 誰もがより良い体験を得ることができます 従業員や学生が 必要なコンテンツにアクセス可能になります IT管理者は 迅速に大規模な展開を行い あなたは組織のアセットを効率的に管理できます
現時点では 既存のAPIは引き続きサポートされます なお 同じトークンで新旧のAPIを 併用するのは注意が必要です これは公式にはサポートされていません
道を切り開いたこの新しいAPI Apps and Books Managementを ぜひご利用ください 私たちは この新しいAPIを できるだけ早くテストして統合し ユーザーに最高のものをお届けします Apps and Books Managementの体験を より詳しい情報については 最新の 開発者向けドキュメントをご覧ください お付き合いいただきありがとうございます ひきつづき WWDCをお楽しみください [パーカッションの優美な音楽]
-
-
2:43 - Asset Management Notification
{ "notification": { "assignments": [ { "adamId": "408709785", "pricingParam": "STDQ", "serialNumber": "C02Y402HLCM6" }, ... ], "eventId": "87cbc650-16cc-4f9e-a833-e622f377a9f7", "result": "SUCCESS", "type": "ASSOCIATE" }, "notificationId": "ba8bbb23-44c2-44f6-a928-eff6ba5ffac3", "notificationType": "ASSET_MANAGEMENT", "uId": "2049025000431439" }
-
4:39 - Get Assets Response
{ "assets": [ { "adamId": "408709785", "pricingParam": "STDQ", "assignedCount": 5000, "availableCount": 10000, "totalCount": 15000, ... } ], "currentPageIndex": 0, "size": 1, "totalPages": 1, ... }
-
5:09 - Asset Count Notification
{ "notification": { "adamId": "408709785", "countDelta": 50, "pricingParam": "STDQ" }, "notificationId": "4a7801be-53f0-42e1-9505-81c0d1dc9da3", "notificationType": "ASSET_COUNT", "uId": "2049025000431439" }
-
6:51 - Get Users Response
{ "currentPageIndex": 0, "size": 1, "totalPages": 1, "users": [ { "clientUserId": "client-100", "email": "client-100@example.com", "inviteCode": "f551b37da07146628e8dcbe0111f0364", "status": "Registered" } ], "versionId": "58507d60-9cd1-11eb-b916-1926dea207f9", ... }
-
7:49 - User Management Notification
{ "notification": { "users": [ { "clientUserId": "client-100", "idHash": "leSKk3IaE2vk2KLmv2k3/200D3=", "status": "Associated", ... }, ... ], "eventId": "e0def1f8-9158-4343-9c52-8dd32da50b9b", "result": "SUCCESS", "type": "UPDATE" }, "notificationId": "4c0bbb9b-d5a6-4860-83ef-5cf362783c1e", "notificationType": "USER_MANAGEMENT", "uId": "2049025000431439" }
-
8:33 - User Associated Notification
{ "notification": { "associatedUsers": [ { "clientUserId": "client-100", "idHash": "leSKk3IaE2vk2KLmv2k3/200D3=", "inviteCode": "f551b37da07146628e8dcbe0111f0364", "status": "Associated", ... } ] }, "notificationId": "90b83144-fb93-4837-9c52-0ae147bdc421", "notificationType": "USER_ASSOCIATED", "uId": "2049025000431439" }
-
12:25 - Associate Assets Request
{ "assets": [ { "adamId": "361309726", "pricingParam": "STDQ" }, ... ], "serialNumbers": [ "serial-1", ... "serial-1000" ] }
-
12:51 - Associate Assets Response
{ "eventId": "92467a8e-8a50-4df9-9b30-f7ff4a99dea7", "tokenExpirationDate": "2021-07-06T14:12:10+0000", "uId": "2049025000431439" }
-
13:24 - Asset Management Notification
{ "notification": { "assignments": [ { "adamId": "361309726", "pricingParam": "STDQ", "serialNumber": "serial-1" }, ... ], "eventId": "92467a8e-8a50-4df9-9b30-f7ff4a99dea7", "result": "SUCCESS", "type": "ASSOCIATE" }, ... }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。