---
title: SwiftDataとCloudKitを使った実装
tags: 
author: [Yoshitaka Tanaka](https://convert.docswell.com/user/4109190)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/DEYGXM88EM.jpg?width=480
description: potatotips #86 iOS/Android開発Tips共有会での登壇資料
published: February 08, 24
canonical: https://convert.docswell.com/s/4109190/Z6Y22X-2024-02-08-093659
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/DEYGXM88EM.jpg)

SwiftDataのiCloud対応
potatotips #86 iOS/Android開発Tips共有会
yoshitaka


# Page. 2

![Page Image](https://bcdn.docswell.com/page/VJNG1WQ978.jpg)

yoshitaka
iOS エンジニア
コネヒト：出産育児系のQAアプリ ママリ
趣味：パデル


# Page. 3

![Page Image](https://bcdn.docswell.com/page/YE9W5XD3E3.jpg)

話すこと
• SwiftDataとCloudKitを使う際の注意点


# Page. 4

![Page Image](https://bcdn.docswell.com/page/GE8NY23L7D.jpg)

SwiftDataとHost in CloudKit


# Page. 5

![Page Image](https://bcdn.docswell.com/page/LELP42VQ7R.jpg)

アプリを動かしてみる
import SwiftUI
import SwiftData
struct ContentView: View {
@Environment(\.modelContext) private var modelContext
@Query private var items: [Item]
var body: some View {
NavigationSplitView {
List {
ForEach(items) { item in
NavigationLink {
Text(&quot;Item at \(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))&quot;)
} label: {
Text(item.timestamp, format: Date.FormatStyle(date: .numeric, time: .standard))
}
}
.onDelete(perform: deleteItems)
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
EditButton()
}
ToolbarItem {
Button(action: addItem) {
Label(&quot;Add Item&quot;, systemImage: &quot;plus&quot;)
}
}
}
} detail: {
Text(&quot;Select an item&quot;)
}
}
private func addItem() {
withAnimation {
let newItem = Item(timestamp: Date())
modelContext.insert(newItem)
}
}
}
private func deleteItems(offsets: IndexSet) {
withAnimation {
for index in offsets {
modelContext.delete(items[index])
}
}
}


# Page. 6

![Page Image](https://bcdn.docswell.com/page/4JM4K8NK7W.jpg)

CloudKitのコンテナを追加する


# Page. 7

![Page Image](https://bcdn.docswell.com/page/PJRWX5D679.jpg)

CloudKitのコンソールを表示


# Page. 8

![Page Image](https://bcdn.docswell.com/page/PEXP6K1D7X.jpg)

SwiftDataをCloudKitで扱う場合の注意点
CloudKit integration requires that all attributes be optional, or have a default value set.


# Page. 9

![Page Image](https://bcdn.docswell.com/page/3EKD152DJD.jpg)

SwiftDataをCloudKitで扱う場合の注意点
@Model
final class Item {
var timestamp: Date
init(timestamp: Date) {
self.timestamp = timestamp
}
}
⇩すべての属性がオプションであるか、デフォルト値が設定されている必要がある。
@Model
final class Item {
var timestamp: Date?
init(timestamp: Date) {
self.timestamp = timestamp
}
}


# Page. 10

![Page Image](https://bcdn.docswell.com/page/L73RQK4PJ5.jpg)

AppleIDでログインしている端末でビルドする


# Page. 11

![Page Image](https://bcdn.docswell.com/page/87DY93Q37G.jpg)

ProductionにSchemaをデプロイする


# Page. 12

![Page Image](https://bcdn.docswell.com/page/VJP6Z4LPE8.jpg)

CloudKitのコンソールを表示
⇩Productionにデプロイできた


# Page. 13

![Page Image](https://bcdn.docswell.com/page/2EV3WXQV7Q.jpg)

SwiftDataのiCloud対応完了🎉


# Page. 14

![Page Image](https://bcdn.docswell.com/page/57G3DVW1JL.jpg)

CoreDataとCloudKit
• WWDC2019 Using Core Data With CloudKitで発表された
• Xcode11からCloudKitをチェックしてプロジェクトを作れるようなった
• NSPersistentCloudKitContainerを使うことで実現できる
参考：https://developer.apple.com/videos/play/wwdc2019/202/


# Page. 15

![Page Image](https://bcdn.docswell.com/page/4EQ5163NJP.jpg)

参考：https://developer.apple.com/videos/play/wwdc2019/202/


# Page. 16

![Page Image](https://bcdn.docswell.com/page/KJ49R41371.jpg)

参考：https://developer.apple.com/videos/play/wwdc2019/202/


# Page. 17

![Page Image](https://bcdn.docswell.com/page/LE1KQ4GZJG.jpg)

CloudKitのPrivateとPublicの違い
• WWDC2020 Sync a Core
Data store with the CloudKit
public databaseが紹介された
参考：https://developer.apple.com/videos/play/wwdc2020/10650/


# Page. 18

![Page Image](https://bcdn.docswell.com/page/GEWDMXK6J2.jpg)

まとめ
• SwiftDataとCloudKitで連携する場合は、すべての属性がオプションである
か、デフォルト値が設定されている必要がある。


# Page. 19

![Page Image](https://bcdn.docswell.com/page/47ZGQ6ZRE3.jpg)

参考
・https://developer.apple.com/videos/play/wwdc2019/202/
・https://developer.apple.com/videos/play/wwdc2020/10650/


# Page. 20

![Page Image](https://bcdn.docswell.com/page/YJ6Y62Z17V.jpg)

ご清聴ありがとうございました


