
iCloudを使ったデータ共有機能の中で、他のユーザーとレコード(データ)を共有・共同編集できるようにする仕組みが CKShare です。
この記事では、CloudKitの CKShare クラスの役割や使い方、具体的なコード例、主要なプロパティ・メソッド、活用シーンをわかりやすく解説します。
CKShareクラスとは?
CKShare は、CloudKitの共有機能(CloudKit Sharing)を使って、他のiCloudユーザーとデータ(レコード)を共有するためのクラスです。
たとえば、ToDoリストやノート、アルバム、レシピなどを他のユーザーと共有・共同編集できるアプリを作りたい場合に使用されます。
CKShare でできること
- 特定のレコードを共有できる
- 他の iCloud ユーザーにアクセス権を付与できる
- 招待の送信・受け入れ・共同編集をサポートできる
つまり 「CloudKit のレコードを他人と安全に共有するための仕組み」 を担うクラスです。
| 項目 | 内容 |
|---|---|
| クラス名 | CKShare |
| 主な用途 | iCloudユーザー間でのレコード共有 |
| 主な操作 | CKModifyRecordsOperation で保存・共有 |
| 表示UI | UICloudSharingController で共有設定を表示 |
| 必要条件 | iCloud + 実機 + Sharing Capabilityの有効化 |
基本の使い方
CKShare を使って CloudKit のレコードを共有するには、下記の流れで行います。
- 共有したいレコードを
CKRecordとして作成 CKShareインスタンスをそのレコードと一緒に保存UICloudSharingControllerを表示して、ユーザーに共有リンクや招待を送る
以下は、指定した CKRecord を他の iCloud ユーザーと共有できるようにするコード例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import CloudKit import UIKit func shareRecord(record: CKRecord, in database: CKDatabase, from viewController: UIViewController) { let share = CKShare(rootRecord: record) share[CKShare.SystemFieldKey.title] = "共有リスト" as CKRecordValue let modifyOp = CKModifyRecordsOperation(recordsToSave: [record, share], recordIDsToDelete: nil) modifyOp.modifyRecordsResultBlock = { result in switch result { case .success: DispatchQueue.main.async { let sharingController = UICloudSharingController(share: share, container: CKContainer.default()) sharingController.availablePermissions = [.allowReadWrite, .allowPrivate] viewController.present(sharingController, animated: true) } case .failure(let error): print("共有エラー: \(error)") } } database.add(modifyOp) } |
コードのポイント
-
CKShare(rootRecord:)
→ 共有したいCKRecordをルートとしてCKShareを作成します。 -
share[CKShare.SystemFieldKey.title]
→ 共有リンクに表示されるタイトルを設定できます。 -
CKModifyRecordsOperation
→recordとshareを一緒に CloudKit に保存。共有は通常のレコード保存と同時に行う必要があります。 -
UICloudSharingController
→ ユーザーに共有リンクや招待を送るための標準UI。ここで「閲覧のみ」「編集可能」などの権限も設定可能です。 -
.availablePermissions
→ 共有時のアクセス権限を指定。例:allowReadWrite(編集可)、allowPrivate(個別招待のみ)
この流れで実装することで、CloudKit のレコードを iCloud 経由で他のユーザーと安全に共有・共同編集 できるようになります。
主要プロパティ
CKShare には、共有の状態や表示に関するいくつかの主要プロパティが用意されています。
これらを理解しておくと、共有機能を正しく制御したり、ユーザーにわかりやすく見せることができます。
| プロパティ名 | 型 | 説明 |
|---|---|---|
rootRecordID |
CKRecord.ID |
共有のルートとなるレコードのID |
owner |
CKUserIdentity |
この共有を作成したユーザー情報 |
participants |
[CKShare.Participant] |
共有に参加しているユーザー一覧 |
publicPermission |
CKShare.ParticipantPermission |
他のユーザーの読み書き権限設定 |
URL |
URL? |
共有リンク(参加用URL) |
title |
String? |
表示用タイトル(UIに出す) |
CKShare.SystemFieldKey.title に値をセットすると、UICloudSharingController 上に共有のタイトルが表示されます。
これらのプロパティを活用することで、共有の見た目(タイトルやリンク)だけでなく、アクセス権や参加者の管理 も柔軟に行うことができます。
特に participants と publicPermission をうまく組み合わせることで、招待制・公開制などさまざまな共有スタイルを設計可能です。
UICloudSharingController との連携
CKShare を単体で扱うことはあまりなく、通常は UICloudSharingController と組み合わせて使います。
UICloudSharingController とは?
UICloudSharingController は Apple が用意している標準の共有UI です。
-
CloudKit の共有 (
CKShare) を簡単にユーザーに公開できるようにするビューコントローラ -
UIKit の
UIActivityViewController(シェアシート)の「CloudKit 版」と考えるとイメージしやすい
|
1 2 3 |
let controller = UICloudSharingController(share: share, container: CKContainer.default()) controller.availablePermissions = [.allowReadWrite, .allowPrivate] |
できること
-
共有リンクの発行と送信
AirDrop、メッセージ、メールなどを使って他のユーザーに招待を送れる -
権限の設定
availablePermissionsで共有先のユーザーに対するアクセス権限を指定できる-
.allowReadWrite→ 読み書き可能 -
.allowReadOnly→ 読み取りのみ -
.allowPrivate→ 特定の人だけ
-
-
UIの統一感
iOS 標準UIなので、ユーザーにとってわかりやすく、安全に共有操作を提供できる
SwiftUI アプリでも、共有部分だけは UIViewControllerRepresentable でこの UIKit コントローラを呼び出す必要があります。
注意点
CloudKit の共有機能は便利ですが、CKShare を使うときにはいくつかの仕組み上の制約があります。これを理解していないと「なぜデータが見えないのか?」とハマることがあるので注意しましょう。
CKShareは CloudKitの Private Database に保存される クラスです。
つまり、共有を開始する側(オーナー)は、自分のプライベートデータベースにCKShareと共有対象のレコードを保存する必要があります。- 一方で、共有を受け取ったユーザーは、そのレコードを Shared Database(共有データベース)から読み書きすることになります。
アプリではCKContainer.default().sharedCloudDatabaseを通じてアクセスします。 - 共有データのライフサイクルを理解しておく必要がある
- オーナーが
CKShareとCKRecordを自分の Private DB に保存 - 共有リンクを生成し、他のiCloudユーザーへ共有
- 相手が承認すると、そのレコードが 相手の Shared Database に現れる
- オーナーが
- シミュレータでは共有機能は動作しません(iCloudアカウントと実機が必要)
- Xcodeで
iCloud + CloudKitおよびCloudKit Sharingの Capabilities を有効にしておく必要があります
このように、「オーナー=Private DB」「共有相手=Shared DB」 という構造を理解して実装するのがポイントです。
まとめ
CloudKit の共有機能を実現するための中心的なクラスが CKShare です。
基本的な特徴を整理すると次のようになります。
| 項目 | 内容 |
|---|---|
| クラス名 | CKShare |
| 主な用途 | iCloudユーザー間でのレコード共有 |
| 主な操作 | CKModifyRecordsOperation で保存・共有 |
| 表示UI | UICloudSharingController で共有設定を表示 |
| 必要条件 | iCloud + 実機 + Sharing Capabilityの有効化 |
CKShare を使うことで、CloudKitベースのアプリに強力な「共有・共同編集」機能を加えることができます。
ToDo、ノート、アルバムなどのアプリにチームコラボレーション機能を追加したいと考えているなら、CKShare の導入は非常におすすめです。
