在尝试让 iCloud 文档存储在手表Watchkit Extension Cannot Read from iCloud上工作失败后,我尝试简单地使用密钥库。然而,这样做我得到:
NSUbiquitousKeyValueStore 不可用。
根据苹果公司的说法,这应该是“始终可用”的。因此,如果这个基本共享不能在手表上运行,那么文档内容当然也不能在手表上运行。
这是通过简单地使用以下命令生成的:
let keyStore = NSUbiquitousKeyValueStore()
Run Code Online (Sandbox Code Playgroud)
在 iPhone 上工作和文档一样完美。它也适用于手表的模拟器,但不适用于实际的手表。
需要明确的是,我不明白为什么我不能在实际手表上使用 iCloud 的键值存储。这些应该从 Watch OS 2 开始可用。
我正准备将我的应用程序提交到 App Store。根据我所做的研究,似乎没有简单的方法可以将记录从 CloudKit 的开发环境移动到生产环境。根据这个答案(将记录从CloudKit中的开发移动到生产?),我需要将开发中的所有记录下载到某种文件中,然后将它们上传到生产。有人可以为我进一步分解这个过程吗?我该如何下载这些记录?我应该制作什么样的文件?我不明白。谢谢!
从 CoreData 迁移到 CloudKit 并保留所有用户数据的最佳方法是什么?
我想淘汰 Core-Data 并将其替换为 CloudKit,但用户拥有大量重要数据,应该以某种方式迁移它们。此外,许多类正在使用 CoreData 实体,它们不应该受到影响(CRUD 操作除外)。没有找到任何简单的指导方针。
我的解决方案草案:
-检查用户是否有CoreData
-加载内存中的所有CoreData对象
-将它们写入云端
-删除CoreData文件
它会按预期工作吗?
移除 Core-Data 后可以使用从 NSManagedObject 继承的类吗?它会引起任何副作用吗?
我正在更新 iOS13 之前的 Core Data 应用程序,以使用 Core Data+CloudKit 同步来支持多个设备上的单个用户。同步应该自动发生,并且在我开发的中间步骤中它确实起作用了。现在它不起作用,CloudKit 遥测没有注册任何活动,我不明白为什么它不起作用。
在我以前的应用程序版本中,我在 UserDefaults 中提供了少量标签字符串,并允许用户修改它们,并将更新的版本放回 UserDefaults 中。这是避免为少量对象管理第二个核心数据实体的捷径。
我后来意识到这在多设备实现中不起作用,因为本地核心数据数据库为空这一事实不再意味着它是该用户的第一次使用。相反,每个新设备都需要查找基于云的数据源来查找用户正在使用的标签字符串,并且仅在用户没有其他内容时才使用应用程序提供的默认值。
我按照 Apple 的说明使用 CloudKit 设置核心数据,起初同步工作正常。但后来我意识到同步行为不正确,我真的需要提供一个预填充的核心数据数据库(.sqlite 文件),而不是从 UserDefaults 中存储的字符串进行预填充。我实现了这一点,并且在首次本地启动时复制捆绑的 .sqlite 文件后,该应用程序现在可以在本地正常运行。
但由于某种原因,此更改导致 CloudKit 同步停止工作。现在,我不仅在其他设备上没有获得任何自动更新,而且在 CloudKit 仪表板遥测中也没有得到任何结果,因此看来 CloudKit 同步从未开始。这很奇怪,因为我在本地收到刚刚在本地发生的“远程”更改的通知(当我在本地保存新数据时,我列为通知的 #selector 的函数正在本地调用)。
我对问题/解决方案是什么感到困惑。这是我的相关代码。
//In my CoreDataHelper class
lazy var context = persistentContainer.viewContext
lazy var persistentContainer: NSPersistentCloudKitContainer = {
let appName = Bundle.main.infoDictionary!["CFBundleName"] as! String
let container = NSPersistentCloudKitContainer(name: appName)
//Pre-load my default Core Data data (Category names) on first launch
let storeUrl = FileManager.default.urls(for: .applicationSupportDirectory, …Run Code Online (Sandbox Code Playgroud) 我有一个使用 Core Data 和 CloudKit 的应用程序。更改在设备之间同步。主要目标有后台模式功能,检查Remote notificationsiCloud 功能,服务设置为 CloudKit,并检查容器中的正确容器。
我如何在代码中对记录的更改、删除和添加做出反应?我需要WidgetCenter.shared.reloadAllTimelines()在 CloudKit 中的核心数据更改以更新 iOS 14 主屏幕小部件时调用。
我的目标是让这个工作:我在 icloud.developer.apple.com 或其他设备上更改/添加/删除记录,并WidgetCenter.shared.reloadAllTimelines()调用以在小部件中显示正确的数据。应用程序可能在后台或前台。
来自AppDelegate.swift:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Register for Remote Notifications
application.registerForRemoteNotifications()
return true
}
Run Code Online (Sandbox Code Playgroud)
此外,在输出日志中注意到消息:
CoreData: debug: CoreData+CloudKit: -[NSCloudKitMirroringDelegate remoteStoreDidChange:]_block_invoke(2138): <NSCloudKitMirroringDelegate: 0x281818d00> - 忽略远程更改通知,因为导出器已经赶上了这个事务:64 / 64 - <NSCloudKitMirroringDelegate: 0x281818d00>网址:file:///var/mobile/Containers/Data/Application/F83C68DA-7C36-42CC-926D-7C721C679579/Library/Application%20Support/AppTitle.sqlite)
当我尝试使用 CKDatabase.save(record:completionHandler) 保存到 CloudKit 中的 privateDatabase 时,收到此消息“由于身份验证令牌错误或丢失,帐户暂时不可用”。
看起来 stackoverflow 上发布的错误又出现了。
另一个问题的修复是苹果方面的一个错误。
有人最近遇到这个问题并有解决方案吗?
当我保存CKAsset到服务器时,它是否可以在所有设备上使用?如果在某个设备上我不需要其中一个资产怎么办?那里也会占用空间吗?

我正在尝试按创建的时间戳对这些记录进行排序,但我使用的是cloudkit-js示例代码作为基础.我看到他们有一个sortBy部分,但它需要使用fieldName,这不是我想要排序的.我需要按元数据排序,而不是输入.这是问题发生的地方
var query = {
recordType: 'Locations',
sortBy: [{
fieldName: '*don't know what to put here*'
}]
};
Run Code Online (Sandbox Code Playgroud)
如果我输入fieldName,我在下面创建的任何字段,比如地名或类别(还有更多,但我编辑了它们,因为不必要),它会按照这些fieldNames对记录进行排序.但是我不知道要放什么来按记录['created']排序.时间戳.因为如果我在fieldName中放入'created'或'record',它们不是fieldNames,因此是一个错误.那么在sortBy里面写一个不同于fieldName的东西还是什么?
这是创建表及其字段的位置
records.forEach(function(record) {
var fields = record.fields;
var tableActual = "<tr><td>" + record['created'].timestamp + "</td><<td>" + fields['placeName'].value + "</td><td>" + fields['category'].value + ...
Run Code Online (Sandbox Code Playgroud) 我从CloudKit Server获取记录更改,但每次出现错误
[LogFacilityCK]操作E0367CA861DAF5A9出现连接错误:错误域= NSCocoaErrorDomain代码= 4097"连接到名为com.apple.cloudd的服务"UserInfo = {NSDebugDescription =连接到名为com.apple.cloudd的服务}
我知道原因,因为我错误地初始化CKFetchRecordZoneChangesOperation请检查以下代码并纠正我:
CKFetchRecordZoneChangesOperation *operation = [[CKFetchRecordZoneChangesOperation alloc]initWithRecordZoneIDs:@[ recordZoneID ] optionsByRecordZoneID:@{@"Zone":recordZoneID,@"FetchRecordZoneChangesOptions":option}];
Run Code Online (Sandbox Code Playgroud)
我需要这方面的帮助:
**@{@"Zone":recordZoneID,@"FetchRecordZoneChangesOptions":option}];**
Run Code Online (Sandbox Code Playgroud) 我刚刚在Xcode 9 beta 6中创建了一个项目并添加了以下代码:
let privateDB = CKContainer.default().privateCloudDatabase
let greatID = CKRecordID(recordName: "GreatPlace")
let place = CKRecord(recordType: "Place", recordID: greatID)
privateDB.save(place) { (record, error) in
if error != nil {
let er = (error as! CKError).errorUserInfo
print("Error: \n")
print("CKErrorDescription: \(er["CKErrorDescription"]!)\n")
print("ContainerID: \(er["ContainerID"]!)\n")
print("NSDebugDescription: \(er["NSDebugDescription"]!)\n")
print("NSUnderlyingError: \(er["NSUnderlyingError"]!)\n")
print("NSLocalizedDescription: \(er["NSLocalizedDescription"]!)\n")
print("ServerErrorDescription: \(er["ServerErrorDescription"]!)\n")
}
if record != nil {
print("record: \(record!)")
}
}
Run Code Online (Sandbox Code Playgroud)
并添加此功能:
当我运行代码时,我收到此错误消息:
我做错了什么?
cloudkit ×10
ios ×5
swift ×4
core-data ×3
ckasset ×1
icloud ×1
iphone ×1
javascript ×1
nspersistentcloudkitcontainer ×1
sorting ×1
swiftui ×1
widgetkit ×1
xcode ×1
xcode13.3.1 ×1
xcode9beta6 ×1