ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
メッセージAppで共同制作の体験を強化する
メッセージAppを使った共同制作で、あなたのAppでのコミュニケーションやコラボレーションを向上させる方法をご覧ください。ドキュメントをメッセージAppの会話と結び付けて、簡単に共有やチャットを行えるようにする方法を紹介します。さらに、会話に参加している全員に、そのドキュメントの最新のアクティビティを知らせる方法について解説します。また、カスタマイズ可能なUI をAppに追加したり、共同制作を詳細に管理したり、ドキュメントをメッセージAppのチャットや FaceTime通話と関連付ける方法についても解説します。 SharedWithYouフレームワークの詳細については、「Shared with YouをAppに追加する」をご覧ください。コラボレーションAPI を、カスタムコラボレーションインフラストラクチャを備えたAppに追加する方法の詳細については、「カスタムコラボレーションAppをメッセージAppと統合する」をご覧ください。 (注:APIは、今後のベータ版で利用可能になります。)
リソース
関連ビデオ
WWDC22
WWDC21
-
ダウンロード
♪ 心地よいヒップホップ ♪ ♪ Miranda Zhou:こんにちは Miranda です Sharing チームのエンジニアです Elana Stettin:Elana です Messages チームのエンジニアです Miranda:このビデオでは Elana と私が メッセージ App で 共同制作を強化する方法を掘り下げます まず機能について紹介します この機能を利用するための準備や メッセージ App と連携して 共同制作を始める方法を学びます Elana が Messages UI を使った 共同制作を App に追加する方法を説明し 最後に 共同制作が更新された時に 最新の状態を維持する方法について説明します まずメッセージ App での共同制作を紹介します iOS 16 と macOS Ventura では 共同制作をしている人の コミュニケーションを改善する 簡単な方法が新たに追加されました 共同制作者はメッセージ App を介して 書類と会話を結び付けることができます 共同制作アクティビティは メッセージの会話や進行中の FaceTime通話で表示されます カスタマイズ可能なポップオーバーも App に提供され共同制作の詳細を 管理したり メッセージの会話に 接続したりできます これは 共有シートやドラッグ&ドロップなど すでにご利用の技術の上に構築されています 次に サポートしている共同制作の インフラストラクチャの種類と それぞれをメッセージ 共同制作に結び付ける方法を説明します 私たちは3種類の共同制作 インフラストラクチャをサポートしています CloudKitとiCloud Drive そして現在お使いの カスタム共同制作インフラストラクチャです このセッションでは主に CloudKit と iCloud Drive のケースに 注目します カスタムインフラストラクチャを ご利用の場合は 「カスタムコラボレーションAppを メッセージAppと統合する」の セッションをご視聴ください CloudKit ベースの共同制作を利用する場合 システムが共同制作を認識するための オブジェクトを作成する 新らしい API を用意しました これは macOS Sierra の APIを ベースにしており NSSharingService で 共有の開始または管理が可能です 共同制作オブジェクトが出来たら 共有を開始または管理するための UIを App のどこで表示しているかを確認します 既存の AppKit API は将来廃止されるため メッセージ App との共同制作を行うには 新しい API へのアップデートが必要です 新しい共同制作オブジェクト API は NSItemProvider を使用します NSItemProvider はシステムサービスが App のデータをシステム上の他の プロセスに転送するために使用されます プロバイダは 共同制作アイテムの CKShare か 共同制作開始時に CKShare を作成する ハンドラを必要とします あなたの App の CKContainer も必要です 最後に共同制作のためのアクセス権と パーミッションのオプションを表す CKAllowedSharingOptions の オブジェクトを用意します オプションの値はこれまで NSCloudSharingServiceDelegate メソッドに要求していた NSCloudKitSharingServiceOptions と 同じです こちらが CloudKit 共同制作オブジェクトの 作成についての概要です 共同制作が開始され準備ハンドラを渡す場合 そのハンドラ内で "share" を作成して それをサーバに保存します すでに開始している場合は 関連する "share" を渡すだけです 登録する CKAllowedSharingOptions のインスタンスは 許可するオプションの デフォルトセットを返します 静的標準プロパティを使用しています CloudKit を採用する場合 それをそのまま使うか カスタムの制限を行うオプションの インスタンスを作成します
CloudKit の採用に興味が ある方向けに説明すると CloudKit を使うと 独自のサーバコードを書かずに iCloudを App のデータベースとして 使用できます また そのデータの一部を他の iCloud ユーザと 共有する方法もビルトインされています 詳しくは WWDC21 の「CloudKit の 新機能」を ご覧ください iCloud Drive をお使いの場合 共同制作用のオブジェクトは ファイルの URL です 認識する作業は全てシステムが行います それができたら App で共同制作を 開始または管理するための エントリーポイントを特定し 編集された新バージョンに 置きかえる準備をします カスタム共同制作インフラストラクチャの場合 共同制作オブジェクトは SWCollaborationMetadata となり 新しい NSItemProvider API に ラップされています この API を使用して共同制作 UI を 導入する方法の詳細については 「カスタムコラボレーションAppを メッセージAppと統合する」をご覧ください これで準備ができました 次に 共同制作を開始します 方法は2つあります新しい 共同制作モードの共有シートからと iOS 上の Files App と macOS の Finder から メッセージにドラッグ&ドロップする方法です 新しい共有シートの共同制作モードは ヘッダの表示で識別でき 「共同制作」か 「コピーを送信」の選択も可能です 共有シートで共同制作を行うには 先ほど用意した共同制作オブジェクトを 共有シートに渡します macOS では この共同制作インジケータは 新しい共有ポップオーバーに表示されます 共有ポップオーバーには ヘッダーにタイトルと画像 続いてよく使う会話相手の候補 そして既存の連絡方法が含まれます こちらの詳細については WWDC22 の 「AppKitの新機能」をご覧ください iOSとMac Catalystでは UIActivityViewController クラスを使用して 共有シートを表示します macOS では NSSharingServicePicker を 使用して共有ポップオーバーを表示します 共同制作オブジェクトを アクティビティアイテムとして UIActivityViewController に渡し 共同制作を有効化して表示します 同様に NSSharingServicePicker を 共同制作オブジェクトで初期化し 共同制作を有効化して表示します CloudKit を採用する場合ヘッダのタイトルと 画像を提供するために特別な手段が必要です iOS では UIActivity ItemsConfiguration や UIActivityItemSource などの 既存の API を使用して タイトルと imageProvider を持つ LPLinkMetadata オブジェクトを提供します 共同制作オブジェクトでコンフィグを作成し 共有されるアイテムについての LPLinkMetadata オブジェクトを 返すようメタデータプロバイダを設定します 最後に そのコンフィグで UIActivityViewController を初期化します macOS ではヘッダメタデータを提供するために NSPreviewRepresenting ActivityItem という 新しい API が用意されています 詳しくは NSPreviewRepresenting ActivityItem の ドキュメントをご参照ください NSPreviewRepresentingActivityIte を 使用するには まずタイトル・ 画像・アイコンを選択します 画像は共有するアイテムを表し アイコンは共有されるアイテムのソース 例えば App のアイコンを表示します 共同制作オブジェクト タイトル・画像・アイコンを含む NSPreviewRepresenting ActivityItem を作成し NSSharingServicePicker を そのプレビューアイテムで初期化します うれしいことに共有シートのための 新しい SwiftUI ShareLink API は 共同制作モードもサポート予定です 使用するには共有するアイテムを 共有とデータ転送のための新しいプロトコル Transferable に準拠させる必要があります CloudKit 使用者は Transferable アイテムから返される CKShareTransferRepresentation の形で 共有・コンテナ・オプションを提供します 詳しくは WWDC22 の「Transferableの紹介」と 「SwiftUIの最新情報」をご覧ください ここでは CloudKit を使用するメモ App が ShareLink で共有する Transfer オブジェクト を作成する例を紹介します メモ App は 既存の CKShare・CKContainer CKAllowedSharingOptions の existing として または CKContainer CKAllowedSharingOptions と コラボレーションオブジェクトの CKShare を 作成および保存するハンドラを持つ prepareShare として構築される CKShareTransferRepresentation を 提供します iCloud Driveをご利用の場合ファイルのURL が ShareLink で共有可能な Transferable オブジェクトになります カスタム共同制作 インフラストラクチャの場合に 転送可能なオブジェクトから SWCollaborationMetadata を 返す方法については 「カスタムコラボレーションAppを メッセージAppと統合する」をご覧ください Transferable オブジェクトができたら 共有アイテムとして ShareLink の イニシャライザに渡します 同時に共有シートのヘッダーを埋める タイトルと画像を含むプレビューを渡します 共有シートの 共同制作モードヘッダーで注目すべき機能は アクセス権と権限オプションの概要です この概要をタップすると共同制作者が 共同制作時に使用するアクセス権や 権限オプションを選択する ビューが表示されます CloudKit を使用する場合は 共同制作オブジェクトに登録された オプションのセットを表示します iCloud Drive を使用すると iCloud Drive のオプションが 標準セットとして表示されます カスタムインフラストラクチャの場合に カスタムオプションを指定して このビューに表示させる方法については 「カスタムコラボレーションAppを メッセージAppと統合する」をご覧ください 共同制作を開始する方法には ドラッグ&ドロップによるものもあります 共同制作者はあなたの書類を メッセージにドラッグするだけで そのドキュメントで 新たに共同制作可能な リッチリンクを表示します このリッチリンクは「共同制作」と 「コピーを送信」の選択機能と 共同制作オプションを提供します 利用するには iOS 16と macOS Ventura の ShareLink から 共同制作オブジェクトを提供します 以上がメッセージ App との 共同制作の準備と始め方です 次に Elana と交代し App の 共同制作体験を次のレベルに引き上げる 方法についてお話します Elana:ありがとう Miranda 始め方が分かりましたので 共同制作 UI を あなたの App により深く 統合する方法をお話します 共同制作体験を充実させるために これらの機能を追加しました 共同制作ボタンは App のナビゲーションに配置され 関連するメッセージグループの グループ写真が表示されます また ボタンの右側にはアクティブな 参加者数が表示され他の人が 書類に参加していることを示します 共同制作ボタンをタップすると 新しい共同制作ポップオーバーが表示されます カスタマイズ可能なポップオーバーには 共同制作の概要が表示されます ワンタップで他の参加者と コミュニケーションを始めることも可能です これによりメッセージや FaceTime を使って リアルタイムに共同制作ができます
これらの UI 要素はすべて SharedWithYou フレームワークの1つのクラス SWCollaborationView で提供されます このビューはナビゲーション中で ボタンビューを表示しています SWCollaborationView を 初期化するだけです ポップオーバーのレイアウトと 表示はお任せください カスタムコンテンツを表示するには ビューを提供すれば ポップオーバーに追加されます では SWCollaborationView を 作成するためのコードを説明します SWCollaborationView を itemProvider で初期化します itemProvider には CloudKit ベースの App の場合は CKShare iCloud Drive ベースの App の場合は fileURL カスタム共同制作 インフラストラクチャの場合は SW Collaboration メタデータが含まれます
共同制作ビューの activeParticipantCount プロパティを設定し このドキュメントの アクティブな参加者の数を表示します collaborationView に contentView プロパティを設定しポップオーバーに カスタムコンテンツを提供します ContentView によってポップオーバーの フルカスタマイズが可能です ここに独自のコンテンツを追加することで ユーザーに共同制作の内容を ユニークに伝えることができます 例えば Pages では ContentView に 現在の参加者リストと 参加者のカーソルの表示切換が 含まれています では「管理」ボタンを見てみましょう CloudKit や iCloud Drive を使用する場合 このボタンを押すと manage UI が表示され 参加者の追加や削除 共有設定の変更などができます これについては後ほどお話しします 共同制作ビューの manageButtonTitle プロパティを 設定して ボタンのタイトルをカスタマイズします このプロパティを設定しない場合 タイトルはデフォルトの “Manage Share”になります App がカスタム共同制作 インフラストラクチャを使用する場合 contentView に独自の 管理ボタンを追加してください このボタンは提供されません Mac では Apple のデザイン推奨にしたがって ボタンの背景が透明であることを 確認してください 最後に iOS では collaborationView を カスタムビューとして使用してこのように UIBarButtonItem を作成します Macでは UIBarButtonItem を使って NSToolbarItem を初期化します 次に バーボタンアイテム またはツールバーアイテムを ViewController の navigationItem に 追加します 先ほど触れたように CloudKit と iCloud Drive を使用する際は 共同制作ポップオーバーに ボタンが用意されています これによりこれまでと同じように 共有を管理できます 管理 UI への変更は すでにご利用中の UICloudSharingControllerDelegate と NSCloudSharingServiceDelegate の プロトコルを使って検知可能です これで新しい共同制作 UI を App に統合する方法について ご理解いただけたと思います 次に 共同制作の更新を 監視し処理する方法について説明します 共有の開始と停止を知ることは非常に重要です CloudKit をご利用の方のために CKSystemSharingUIObserver という プロトコルを追加し通知が可能になりました このプロトコルを使えば CloudKit Sharing UI を使わず CKShare が保存または削除された時に 対応するコールバックを取得できます そのコードをいくつかご紹介します CKContainer を使って Observer を 初期化します Observer に CKShare が保存された時に 実行されるクロージャを定義し systemSharingUIDidSaveShareBlock に 設定します クロージャで share が正しく 保存されていれば 共有が開始されたことを示す success の結果と作業用の関連する CKShare が表示されます 保存に失敗した場合は failure の結果と関連するエラーが得られます こちらはドキュメントの所有者が 共有を停止した場合のクロージャの実装です 成功の場合 CKShare は正常に削除されます 失敗の場合 関連するエラーが渡されます 共有の開始と停止だけが 表示される項目ではありません ドキュメントの変更をユーザーに通知したい ケースもあるかもしれません 私たちは 共同制作の更新情報をまとめたお知らせを 該当するメッセージスレッドの トップにポストできる API を追加しました 共同制作者には更新内容と 誰が変更したかが表示されます 通知を表示するには Shared with You の 共同制作専用ハイライトである SWCollaborationHighlight を取得します SWCollaborationHighlight イベントを 作成するために使用します SWHighlights と SharedWithYou API の 詳細については 通知の実装作業を始める前に 「Shared with YouをAppに追加する」 のセッションをご覧ください CloudKit App を例に 様々な通知のポストについてお話します App がカスタム共同制作 インフラストラクチャを使用している場合は 「カスタムコラボレーションAppを メッセージAppと統合する」のセッションで 詳しい手順をご覧ください 通知を表現するために SWHighlightEvent という プロトコルを導入しました ハイライトイベントは SWHighlightCenter API から取得した SWHighlights で初期化されます サポートされているイベントタイプは コンテンツの更新や コメントの変更のChangeイベント 共同制作でユーザーが言及された時の Mentionイベント コンテンツの移動 名称変更 削除に対する Persistenceイベント 書類参加者が追加または削除されたときの Membershipイベントなどがあります こちらは共同制作で編集が行われた際に Changeイベントをポストする例です highlightCenter API を使用して CKShare URL で共同制作の ハイライトを取得します この CKShare は共同制作の 開始時に定義されたもので コンテンツが変更された時に App が 利用できるようにする 必要があることにご注意ください 次に HighlightChangeEvent の インスタンスを作成します イニシャライザーはハイライトと トリガー列挙型の値を取ります 今回はトリガータイプを edit に設定します 最後に そのイベントの通知を highlightCenter にポストします 残りのイベントも同様の形式で 行われますが 唯一の例外は mentionEvent で これはどのユーザーが 言及されたかを示すために より多くの情報を必要とします このイベントをポストできるのは App がユーザーへの言及を サポートしている場合のみです 取得したハイライトと言及した CKShare の 参加者のハンドルを渡して mentionEvent を作成します この通知は 言及された ユーザーにのみ表示されます コンテンツが移動 名称変更 削除された時は PersistenceEventタイプを使用します ここではドキュメント名が変更されたことを 示すために Renamed トリガータイプが 使用されています 最後は membershipEvent です membershipEvent については 代わりに addedCollaborator と removedCollaborator トリガータイプを使用します mentionevents ではドキュメントのメンバーが どのように変化したかを 知らせる通知がポストされます メッセージ App で グループメンバーが変更された場合でも 共有したドキュメントの共同制作者を 同期することができます CloudKit と iCloud Driveの 場合は簡単で システムが作業を行います 共同制作で新しいメンバーがメッセージ グループにに追加されると ドキュメントの所有者に 共有に追加するように通知されます 誰かが削除された場合も同様です
カスタム共同制作インフラストラクチャを持つ App の場合はもう少し作業が必要です SWCollaborationActionHandler API を 使う必要があります 詳しくは「カスタムコラボレーションAppを メッセージAppと統合する」の セッションをご覧ください
これで CloudKit iCloud Drive または独自の共同制作インフラストラクチャを 使っていても メッセージ App で共同制作を開始し あなたの App に統合する方法が分かりました 新しい共有シートと ドラッグ&ドロップAPIを使用して 共同制作を開始するための準備をしましょう 新しい共同制作 UI を統合し 共有したドキュメントで起きていることを カスタマイズして提供しましょう 設定ができたらさらに進み メッセージスレッドの中から 共同制作の変更を表示する 通知を利用しましょう 皆さんの App がメッセージの新しい 共同制作機能を活用するのを 楽しみにしています 2人:ご視聴ありがとうございました
-
-
4:08 - Create a CloudKit collaboration item provider
// CloudKit collaboration object // Starting collaboration let itemProvider = NSItemProvider() itemProvider.registerCKShare(container: container, allowedSharingOptions: CKAllowedSharingOptions.standard, preparationHandler: { // Create your share and save to server, or throw error return savedShare }) // Inviting to existing collaboration let itemProvider = NSItemProvider() itemProvider.registerCKShare(share, container: container, allowedSharingOptions: CKAllowedSharingOptions.standard)
-
7:35 - Set up Share Sheet on iOS and Mac Catalyst
// Setting up Share Sheet - iOS and Mac Catalyst let activityViewController = UIActivityViewController(activityItems: [collaborationObject], applicationActivities: nil) presentingViewController.present(activityViewController, animated: true)
-
7:47 - Set up Share Popover on macOS
// Setting up Share Popover - macOS let sharingServicePicker = NSSharingServicePicker(items: [collaborationObject]) sharingServicePicker.show(relativeTo: view.bounds, of: view, preferredEdge: .minY)
-
8:22 - Provide metadata for CloudKit collaboration in Share Sheet (iOS, Mac Catalyst)
// Providing CloudKit metadata - iOS let configuration = UIActivityItemsConfiguration(itemProviders: [collaborationItemProvider]) configuration.perItemMetadataProvider = { (_, key) in switch key { case .linkPresentationMetadata: // Create LPLinkMetadata with title and imageProvider return metadata default: return nil } } let activityViewController = UIActivityViewController(activityItemsConfiguration: configuration)
-
9:03 - Provide metadata for CloudKit collaboration in Share Popover (macOS)
// Providing CloudKit metadata - macOS let title = “Shared Item” let image = NSImage(contentsOfFile: “Shared_Item_Preview_Image.png”) let icon = NSImage(contentsOfFile: “App_Icon.png”) // Shared item source let previewRepresentingItem = NSPreviewRepresentingActivityItem(item: collaborationItemProvider, title: title, image: image, icon: icon) let picker = NSSharingServicePicker(items: [previewRepresentingItem])
-
10:21 - Create Transferable object for CloudKit collaboration with ShareLink
// SwiftUI CloudKit Transferable struct Note: Transferable { // Properties of the note e.g. name, preview image, content, ID, … var share: CKShare? func saveCKShareToServer() async throws -> CKShare { … } static var transferRepresentation: some TransferRepresentation { CKShareTransferRepresentation { note in if let share = note.share { return .existing(share, container: container, options: options) } else { return .prepareShare(container: container, options: options) { return try await note.saveCKShareToServer() } } } } }
-
11:34 - Adopt ShareLink in SwiftUI
// SwiftUI ShareLink adoption struct ContentView: View { @State let item = ShareItem() var body: some View { ShareLink(item: item, preview: SharePreview(item.title, image: item.previewImage)) } }
-
14:58 - Initialize the collaborationView
// Collaboration View let collaborationView = SWCollaborationView(itemProvider: itemProvider) collaborationView.activeParticipantCount = myModel.activePeople.count collaborationView.contentView = MyView(model: myModel) collaborationView.manageButtonTitle = "Custom Manage Button"
-
18:11 - Observe when CKShare is saved with CKSystemSharingUIObserver
// Observing CKShare Changes let observer = CKSystemSharingUIObserver(container: container) observer.systemSharingUIDidSaveShareBlock = { _, result in switch result { case .success(let share): // Handle successfully starting share case .failure(let error): // Handle error } }
-
18:47 - Observe when CKShare is removed with CKSystemSharingUIObserver
// Observing CKShare Changes observer.systemSharingUIDidStopSharingBlock = { _, result in switch result { case .success(let share): // Handle successfully starting share case .failure(let error): // Handle error } }
-
20:44 - Posting notice for edit SWHighlightChangeEvent
// Post an SWHighlightChangeEvent Notice let highlightCenter: SWHighlightCenter = self.highlightCenter let highlight = try highlightCenter.collaborationHighlight(forURL: ckShareURL, error: &error) let editEvent = SWHighlightChangeEvent(highlight: highlight, trigger: .edit) highlightCenter.postNotice(for: editEvent)
-
21:30 - Post an SWHighlightMentionEvent Notice
// Post an SWHighlightMentionEvent Notice let highlightCenter: SWHighlightCenter = self.highlightCenter let highlight = try highlightCenter.collaborationHighlight(forURL: ckShareURL, error: &error) let mentionEvent = SWHighlightMentionEvent(highlight: highlight, mentionedPersonCloudKitShareHandle: ckShareParticipantHandle) highlightCenter.postNotice(for: mentionEvent)
-
21:58 - Post an SWHighlightPersistenceEvent Notice
// Post an SWHighlightPersistenceEvent Notice let highlightCenter: SWHighlightCenter = self.highlightCenter let highlight = try highlightCenter.collaborationHighlight(forURL: ckShareURL, error: &error) let renamedEvent = SWHighlightPersistenceEvent(highlight: highlight, trigger: .renamed) highlightCenter.postNotice(for: renamedEvent)
-
22:11 - Post an SWHighlightMembershipEvent Notice
// Post an SWHighlightMembershipEvent Notice let highlightCenter: SWHighlightCenter = self.highlightCenter let highlight = try highlightCenter.collaborationHighlight(forURL: ckShareURL, error: &error) let membershipEvent = SWHighlightMembershipEvent(highlight: highlight, trigger: .addedCollaborator) highlightCenter.postNotice(for: membershipEvent)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。