cloudkit-public-settings | ios-app-dev-memo
CloudKit 側の DDL
CloudKit Dashboard でスキーマ設定:
- CloudKit Dashboard (https://icloud.developer.apple.com/dashboard/) で
- public データベースに Item レコードタイプを作成。
- Item レコードのフィールド:
- title (String)
- description (String)
- Item レコードのフィールド:
- public データベースに Item レコードタイプを作成。
登録側 (管理者アプリ)
swift
import SwiftUI
import CloudKit
struct ContentView: View {
@State private var title = ""
@State private var description = ""
@State private var message = ""
var body: some View {
VStack {
TextField("タイトル", text: $title)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
TextField("説明", text: $description)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
Button("データ追加") {
addItem(title: title, description: description)
}
.padding()
Text(message)
.padding()
}
}
func addItem(title: String, description: String) {
let record = CKRecord(recordType: "Item")
record["title"] = title
record["description"] = description
// let container = CKContainer.default()
let container = CKContainer(identifier: "iCloud.com.sugoi-domain.SugoiAPp")
let publicDB = container.publicCloudDatabase
publicDB.save(record) { record, error in
DispatchQueue.main.async {
if let error = error {
message = "エラー: \(error.localizedDescription)"
} else {
message = "追加成功"
}
}
}
}
}
参照側 (ユーザ向けアプリ)
swift
import SwiftUI
import CloudKit
struct Item: Identifiable {
let id = UUID()
let title: String
let description: String
}
struct ContentView: View {
@State private var items: [Item] = []
var body: some View {
NavigationView {
List(items) { item in
VStack(alignment: .leading) {
Text(item.title)
.font(.headline)
Text(item.description)
.font(.subheadline)
}
}
.navigationTitle("データ一覧")
.onAppear {
fetchItems()
}
}
}
func fetchItems() {
let query = CKQuery(recordType: "Item", predicate: NSPredicate(value: true))
// let container = CKContainer.default()
let container = CKContainer(identifier: "iCloud.com.sugoi-suer.SugoiApp")
let publicDB = container.publicCloudDatabase
publicDB.fetch(withQuery: query) { result in
items = []
switch result {
case .success(let (matchResults, _)):
for (recordID, recordResult) in matchResults {
switch recordResult {
case .success(let record):
items.append(
Item(
title: record["title"] ?? "-",
description: record["description"] ?? "-"
)
)
print("Title: \(record["title"] as? String ?? "No Title")")
case .failure(let error):
print("Error in get recrd: (\(recordID)): \(error.localizedDescription)")
}
}
case .failure(let error):
print("Error in query: \(error.localizedDescription)")
}
}
}
}