WWDC Quick Look 💓 By SwiftGGTeam
Enhance collaboration experiences with Messages

Enhance collaboration experiences with Messages

元の動画を見る

ハイライト

iOS 16 および macOS Ventura では、メッセージによるコラボレーション機能が導入されており、ユーザーはメッセージを通じて直接コラボレーションを開始および参加できるようになります。共同作業者はドキュメントを会話に結び付けることができ、コラボレーション アクティビティはメッセージの会話や FaceTime 通話にリアルタイムで表示されます。

主要内容

複数の人が一緒にドキュメントを編集する場合、リンクが最も切断されやすいのは通常、エディタ内ではなく通信中です。

ファイルは共有されますが、ディスカッションはメッセージ間で分散されます。誰かがタイトルを変更し、誰かがコメントを追加し、誰かがグループ チャットから退出した場合、アプリケーションはこれらのステータスを参加者と同期する方法を見つける必要があります。

01:02 iOS 16 と macOS Ventura はコラボレーション ポータルをメッセージに接続します。ユーザーが共有パネルまたはドラッグ アンド ドロップからコラボレーションを開始すると、ドキュメントはメッセージ会話にバインドされます。コラボレーション アクティビティは、メッセージ スレッドの先頭または進行中の FaceTime 通話内に表示されます。

このセッションでは、システム側のアクセス パスについて説明します。Apple は、CloudKit、iCloud Drive、カスタム コラボレーション システムという 3 種類のコラボレーション インフラストラクチャをサポートしています。CloudKit は新しいものを使用しますNSItemProviderAPIラッパーCKShare; iCloud Drive はファイル URL を直接使用します。カスタマイズされたシステムの用途SWCollaborationMetadata

詳細

まずコラボレーション オブジェクトをシステムに引き渡します

03:13 CloudKit アプリの最初のステップは、システムが認識できるコラボレーション オブジェクトを作成することです。このオブジェクトは以下に基づいていますNSItemProvider、それは運びますCKShareCKContainer、およびオプションの権限設定。

// 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)

キーポイント:

  • NSItemProvider()システムと共有できるデータプロバイダーを作成します。
  • registerCKShare(container:allowedSharingOptions:preparationHandler:)まだ始まっていないコラボレーション向け。
  • preparationHandler作成する必要がありますCKShareをクリックしてサーバーに保存します。
  • CKAllowedSharingOptions.standardアクセス権と権限のデフォルトの組み合わせを使用します。
  • 既存のコラボレーションは直接インポートされますshare、システムはそれを使用して新しい参加者を招待し続けます。

アプリが iCloud Drive を使用する場合、コラボレーション オブジェクトはファイル URL です。システムはそれを認識するため、開発者が手動で構築する必要はありません。CKShare

共有パネルがコラボレーション モードに入ります

06:16 コラボレーションを開始するには 2 つの方法があります。新しい共有シート コラボレーション モードと、ドキュメントをメッセージにドラッグする方法です。共有シートのヘッダーにコラボレーション インジケーターが表示され、ユーザーはコラボレーションするかコピーを送信するかを選択できます。

iOS および Mac Catalyst では、エントリは依然としてUIActivityViewController

// Setting up Share Sheet - iOS and Mac Catalyst

let activityViewController = UIActivityViewController(activityItems: [collaborationObject], applicationActivities: nil)

presentingViewController.present(activityViewController, animated: true)

キーポイント:

  • collaborationObject事前に用意されていたものですNSItemProvider、ファイル URL、またはカスタム コラボレーション メタデータ。
  • UIActivityViewControllerこのオブジェクトを受信すると、システムはコラボレーション モードを表示します。
  • present共有パネルをユーザーに表示する役割を果たします。

07:47 macOS の使用NSSharingServicePickerをクリックし、Ventura に新しい共有ポップオーバーを表示します。

// Setting up Share Popover - macOS

let sharingServicePicker = NSSharingServicePicker(items: [collaborationObject])

sharingServicePicker.show(relativeTo: view.bounds, of: view, preferredEdge: .minY)

キーポイント:

  • NSSharingServicePicker(items:)コラボオブジェクトも受け付けております。
  • show(relativeTo:of:preferredEdge:)指定したビューの近くに共有 UI をポップアップ表示します。
  • システムは、タイトル、画像、会話の提案、利用可能な共有方法をポップアップ ウィンドウに表示します。

CloudKit は共有ヘッダーのメタデータを追加する必要があります

07:57 CloudKit アプリでは、共有ヘッダーのタイトルと画像を提供する必要もあります。それ以外の場合、システムはこれがコラボレーションであることを認識しますが、共有されているコンテンツを表示するための十分な情報がありません。

iOS および Mac Catalyst は以下から入手できます。UIActivityItemsConfiguration戻るLPLinkMetadata

// 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)

キーポイント:

  • UIActivityItemsConfigurationCloudKit のコラボレーション アイテム プロバイダーをバインドします。
  • perItemMetadataProvider表示情報をメタデータキーで提供します。
  • .linkPresentationMetadata共有シートのヘッダーに必要なタイトルと画像に対応します。
  • 他のキーは戻りますnil、デフォルトの処理についてはシステムに任せます。
  • UIActivityViewController(activityItemsConfiguration:)この設定を使用して共有パネルを表示します。

09:03 macOS の使用NSPreviewRepresentingActivityItem、アイテム、タイトル、プレビュー画像、ソースアイコンを共有ポップアップウィンドウにパッケージ化します。

// 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])

キーポイント:

  • title共有コンテンツの名前です。
  • image共有されているドキュメントまたはプロジェクトを示します。
  • iconアプリアイコンなど、コンテンツのソースを示します。
  • NSPreviewRepresentingActivityItem共同アイテム プロバイダーとプレビュー メタデータを組み合わせます。
  • NSSharingServicePickerプレビュー項目を受信すると、完全な macOS 共有ポップアップ ウィンドウが表示されます。

09:41 SwiftUI のShareLinkコラボレーションモードもサポートされています。前提条件は、共有モデルが以下に準拠していることです。Transferable

CloudKitアプリ経由CKShareTransferRepresentation入手方法を説明するCKShare

// 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()
                }
            }
        }
    }
}

キーポイント:

  • Note: TransferableSwiftUI 共有システムに、このモデルを渡すことができることを知らせます。
  • share: CKShare?ドキュメントがすでに共同作業されている可能性があることを示します。
  • saveCKShareToServer()新しいコラボレーションが必要なときに作成して保存するCKShare
  • CKShareTransferRepresentationモデルを CloudKit 協調表現に変換します。
  • .existing既存のプロセスCKShare招待プロセス。
  • .prepareShare初めてコラボレーションを開始するプロセスを処理します。

11:33 はいTransferableモデルの後にビューレイヤーを配置するだけですShareLink

// SwiftUI ShareLink adoption

struct ContentView: View {
    @State let item = ShareItem()

    var body: some View {
        ShareLink(item: item, preview: SharePreview(item.title, image: item.previewImage))
    }
}

キーポイント:

  • @State let item共有したいコラボレーションを保存します。
  • ShareLink(item:preview:)システム共有 UI の起動を担当します。
  • SharePreview共有ヘッダーのタイトルと画像を指定します。
  • もしitemTransferableCloudKit コラボレーションに戻り、ShareLink がコラボレーション モードになることを示します。

アプリにコラボレーション ポータルとポップアップ ウィンドウを表示する

13:42 コラボレーションの開始は最初のステップにすぎません。ユーザーがアプリに戻った後は、現在のドキュメントがどのメッセージ グループと共同作業しているのか、何人がオンラインなのか、コミュニケーションを継続する方法も確認する必要があります。

SharedWithYou フレームワークが提供するSWCollaborationView。これはナビゲーション バーのコラボレーション ボタンであり、コラボレーション ポップオーバーをポップアップ表示します。

// Collaboration View

let collaborationView = SWCollaborationView(itemProvider: itemProvider)

collaborationView.activeParticipantCount = myModel.activePeople.count

collaborationView.contentView = MyView(model: myModel)

collaborationView.manageButtonTitle = "Custom Manage Button"

キーポイント:

  • SWCollaborationView(itemProvider:)コラボレーション オブジェクトを使用してボタン ビューを初期化します。
  • activeParticipantCount現在のアクティブな参加者の数を表示します。
  • contentView参加者リストやコラボレーション切り替えなどのカスタム コンテンツをポップオーバーに配置します。
  • manageButtonTitle管理ボタンのタイトルをカスタマイズします。
  • CloudKit と iCloud Drive には、参加者の追加、削除、または共有設定の変更のためのシステム提供の管理ボタンが表示されます。

共有の開始と停止を監視する

17:44 CloudKit アプリは、共有が実際にいつ開始され、いつ停止されるかを知る必要があります。CKSystemSharingUIObserverこれら 2 つのコールバックは、開発者自身が CloudKit 共有 UI を公開する必要なく提供されます。

// 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
    }
}

キーポイント:

  • CKSystemSharingUIObserver(container:)現在のアプリの CloudKit コンテナをバインドします。
  • systemSharingUIDidSaveShareBlock存在するCKShare保存して実行します。
  • .success(let share)コラボレーションが開始されたことを示し、対応するメッセージを返します。CKShare
  • .failure(let error)保存が失敗したため、アプリがエラーを処理する必要があることを示します。

18:47 共有を停止するための対応するコールバックもあります。

// Observing CKShare Changes

observer.systemSharingUIDidStopSharingBlock = { _, result in
    switch result {
    case .success(let share):
        // Handle successfully starting share
    case .failure(let error):
        // Handle error
    }
}

キーポイント:

  • systemSharingUIDidStopSharingBlockドキュメント所有者が共有を停止した後に実行されます。
  • 成功時に返されるCKShareは削除されました。
  • 失敗すると、クロージャはエラーを受け取り、アプリはローカル状態を復元するか、ユーザーにプロンプ​​トを表示することができます。

コラボレーションの更新情報をメッセージに送り返す

19:14 このシステムでは、アプリが関連するメッセージ スレッドの先頭に共同更新を公開することもできます。ユーザーは誰がどのような更新を行ったかを確認できます。

これらの通知は以下に基づいていますSWCollaborationHighlightそしてSWHighlightEvent。サポートされるイベントには、コンテンツの変更、メンション、移動または名前変更、メンバーの追加と減少が含まれます。

// 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)

キーポイント:

  • SWHighlightCenter通知書発行の入り口です。
  • collaborationHighlight(forURL:error:)使用CKShareコラボレーション ハイライトに対応する URL が見つかりました。
  • SWHighlightChangeEventコンテンツの更新またはコメントを示します。
  • .editトリガーは、この更新が編集操作から行われたことを示します。
  • postNotice(for:)イベントを関連するメッセージ会話に公開します。

21:30 参加者にメンションする場合は、メンション イベントを使用して、メンションされたユーザーの CloudKit 共有ハンドルを渡します。

// 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)

キーポイント:

  • SWHighlightMentionEventユーザーが共同コンテンツ内で言及されていることを示します。
  • mentionedPersonCloudKitShareHandle言及されたものを指しますCKShare参加者。
  • この通知は、言及されたユーザーにのみ表示されます。

21:58 ドキュメントの名前変更、移動、または削除時に永続化イベントを使用します。

// 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)

キーポイント:

  • SWHighlightPersistenceEventコンテンツの永続的な状態の変化を示します。
  • .renamedトリガーは、ドキュメント名が変更されたことを示します。
  • 移動や削除などの変更にも同種のイベントが使用されます。

22:11 メンバーの変更にはメンバーシップ イベントを使用します。

// 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)

キーポイント:

  • SWHighlightMembershipEventコラボレーターのメンバーシップの変更を示します。
  • .addedCollaborator新しいコラボレーターを追加することを示します。
  • コラボレーターの削除に対応したトリガーも使用できます。
  • CloudKit と iCloud Drive は、メッセージ グループのメンバーシップが変更されると、ドキュメントの所有者に共有を更新するよう求めます。

重要ポイント

  • 対処方法: メモ アプリに「メッセージで共同作業」エントリを追加します。 実行する価値がある理由: CloudKit ドキュメントは以下から入手できます。NSItemProvider.registerCKShareシステム連携プロセスに入ります。 開始方法: まずドキュメント モデルを保存しますCKShare、そしてアイテムプロバイダーを引き渡しますUIActivityViewControllerまたはNSSharingServicePicker

  • 操作方法: 現在のコラボレーション グループとオンラインの人数をドキュメント ナビゲーション バーに表示します。 実行する価値がある理由:SWCollaborationViewメッセージ グループのアバター、アクティブ ユーザーの数、システム ポップオーバーを表示できます。 開始方法: コラボアイテムプロバイダーで初期化するSWCollaborationView、設定activeParticipantCountそしてカスタムcontentView

  • 内容: コメント、メンション、名前変更をメッセージの会話に同期します。 実行する価値がある理由:SWHighlightEvent共同更新は、関連するスレッドの先頭に直接表示できます。 開始方法: を使用しますSWHighlightCenterからCKShareURL からハイライトを取得し、シナリオに従って変更、メンション、永続化、またはメンバーシップ イベントを作成します。

  • やるべきこと: SwiftUI ドキュメント モデルのネイティブ共有ボタンを作成します。 実行する価値がある理由:ShareLinkコラボレーション モードをサポート、モデルを実装するだけで済みますTransferable
    開始方法: モデル内でtransferRepresentation戻ってCKShareTransferRepresentation、ビューで使用されますShareLink(item:preview:)

関連セッション

コメント

GitHub Issues · utterances