当我使用保存策略保存包含CKAsset(只是 JPG 图像)的记录时,我正在测试同步冲突。我收到错误。这会返回用于解决冲突的有用信息,包括我尝试保存的信息以及记录的当前服务器版本。第一个在,第二个在。CKModifyRecordsOperation.IfServerRecordUnchangedCKErrorCode.ServerRecordChangedCKErrorCKRecorderror.userInfo[CKRecordChangedErrorClientRecordKey]error.userInfo[CKRecordChangedErrorServerRecordKey]
我的问题是我尝试使用以下代码访问服务器记录的 CKAsset:
if let photoAsset = rec["myPhoto"] as? CKAsset {
print("PhotoAsset.fileURL: \(photoAsset.fileURL)") // BAD_ACCESS ERROR HERE
self.myPartner.photo = NSData(contentsOfURL: photoAsset.fileURL)
}
Run Code Online (Sandbox Code Playgroud)
我不明白这怎么可能。但经过进一步调查,我打印出了客户端和服务器 CKRecords,而服务器缺少“路径”属性。
客户端 CKAsset...myPhoto (已修改)-> CKAsset:0x7b960d90;路径=~/tmp/BF185B2C-7A39-4730-9530-9797E843243A照片,大小=373959,uploadRank=0,uploadReceipt=A92Eg1qoyPG7yrg3,UUID=3C2D5DC8-4FF5-4A81-853B-395FC1C59862,referenceSignature=<012 fd149 200fc600 617e3907 88763e3e 5002abbf 5b> 、flags=已上传、wrappedEncryptionKey=、签名=<0134a297 38d52f5f 9275bfba fce5b1a8 3d6b9692 d3>
服务器 CKAsset...myPhoto = CKAsset: 0x7be700d0; ReferenceSignature=<015337bd 84409893 7c014f46 36248d27 ce911dc3 7a>,大小=373959,uploadRank=0,UUID=DF5D2EB4-033C-49A2-AF52-6055B5A44106,wrappedEncryptionKey=<767e7cfd d1e62 110 32119ee9 f6f026b3 5bcf0cc3 8053a4de>,签名=<0134a297 38d52f5f 9275bfba fce5b1a8 3d6b9692 d3>
请注意,path=~/tmp/C706423B-A3E8-4051-A9B3-483C718BFBF5photo服务器中缺少什么?谁能解释一下吗?为了解决这个问题,我尝试避免接触服务器记录中的 CKAsset。我希望至少能够检查是否为零。我想把它放在那里以防对其他人有帮助。
标题评论指出CKFetchDatabaseChangesOperation fetchDatabaseChangesCompletionBlock:
“如果服务器返回CKErrorChangeTokenExpired错误,则该previousServerChangeToken值太旧,客户端应该丢弃其本地缓存并重新获取此记录区域中以 nil 开头的更改previousServerChangeToken。”
我想测试这个场景,因此我想生成一个过期的,CKServerChangeToken这样我就可以将其设置previousServerChangeToken为CKFetchDatabaseChangesOperation.
我从私有标头添加了一个 init 方法:
@interface CKServerChangeToken (Private)
- (id)initWithData:(NSData *)data;
@end
Run Code Online (Sandbox Code Playgroud)
并按如下方式使用它:
CKServerChangeToken knownExpiredToken = [[CKServerChangeToken alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:@"AQAAAVl57tUGHv6sgNT9EeaTcQCM+sDHHA==" options:0]];
Run Code Online (Sandbox Code Playgroud)
该字符串是从请求返回的有效更改令牌,我尝试修改它但未成功,例如将我看到的递增数字减少到较低的数字。然而,我设法得到了另一个奇怪的无效参数错误,例如缺少连续标记。如果CloudKit工程师有任何建议,我将不胜感激,谢谢。
在我的 CloudKit 应用程序中,我在存储所有 CKRecord 的私有数据库中创建一个区域。CKRecords 可以有 10 种不同的记录类型,其中一些可以附加 CKAssets。我用来CKFetchRecordZoneChangesOperation查找该区域中的记录更改,并下载它们。我想优化,CKFetchRecordZoneChangesOperation以便只包含desiredKeys在下载中,所以当时我不下载 CKAsset,但似乎没有任何方法可以指定每个记录类型。相反,您似乎只能指定desiredKeyson CKFetchRecordZoneChangesOptions,它是在 zoneID 上设置的。
CKFetchRecordZoneChangesOperation那么,考虑到该区域中有不同类型的记录类型,如何在获取时指定“desiredKeys” ?我在这里缺少一些简单的东西吗?我猜想另一个(彻底的)选项是为每种记录类型创建一个记录区域,但如果有可能的话,我不想走这条路。
谢谢。
我正在参与的项目的一部分涉及管理产品的存储。一个Storage对象包含StorageShelf定义货架数量的对象。StorageShelf 又包含一些其他对象,例如StorageLocation确定货架上可容纳的产品数量的对象。所有这些对象都存在于 CoreData 中。我还将Storages和存储StorageShelfs在 CloudKit 数据库中以用于同步目的。
如果我在两台 iPad 上运行我的应用程序,并在其中一台设备上添加带有一些架子的存储,则它会在另一台设备上接收通知并开始处理收到的更新。
我的应用程序中有一个 CloudOperationQueue,其值为maxConcurrentOperationCount1,以确保同时只进行一次更新(这是因为我的应用程序的所有对象,以及超出此问题范围的对象都是高度相互依赖的) 。
不一致的是,这会导致以下SIGABRT错误消息:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Objects should not be both modified and additional'
Run Code Online (Sandbox Code Playgroud)
具体来说,当我在修改收到的架子对象之一后保存上下文时,会发生此错误。哪个货架没有一致性。
问题
这个错误是什么意思,如何调试它?
当用户第一次启动您的应用程序时,CloudKit 创建唯一的用户记录并添加到公共数据库中。出于调试目的,我尝试删除它,以便 CloudKit 可以生成一个与之前不同的新的唯一 ID。
但是,当尝试使用 CloudKit 仪表板删除所述记录时,我收到以下错误:
invalid attempt to delete user records directly
Run Code Online (Sandbox Code Playgroud)
当尝试使用该deleteRecordWithID:方法在代码中删除它时,我遇到了同样的错误。
有谁知道删除用户记录的正确方法吗?有可能吗?是否有其他解决方案可以通过强制创建新记录来解决我的问题?
我有一个 iOS 应用程序,我想将其放入 AppStore。然而,我在发展目标方面迷失了方向。我不知道是否必须将部署目标设置为 11.0 还是 10.0。大多数代码在 10.x 上运行良好。我想知道将部署目标设置为较低版本是否是一个好习惯。
我确实有原生 iOS 软件开发人员的背景。我们有几个适用于 iPhone 和 iPad 的应用程序,它们使用 CloudKit 在单个用户的不同设备上安装的同一应用程序之间同步数据。
它用于简单的事情,例如没有任何登录或帐户机制的应用程序中收藏的项目。
我如何在flutter中实现这样的功能?还没有找到任何与 iCloud 相关的 dart/flutter 插件。
谢谢你!
我正在使用 来设置核心数据,NSPersistentCloudKitContainer以便我的数据将自动具有 CloudKit 集成。我遇到的问题是我的实体中不再具有可选属性。我的所有可选属性都会生成编译器错误
[实体].[属性]必须有默认值
这是一个错误吗?对于这个问题有好的解决办法吗?
有时NSPersistentCloudKitContainer会在控制台中报告错误,如下所示:
*2020-04-14 16:41:27.725794+0100 ExampleApp[9736:8226377] [error] error: CoreData+CloudKit: -: <NSCloudKitMirroringDelegate: 0x282b944d0>: Sending \xe2\x80\x98NSCloudKitMirroringDelegateWillResetSyncNotificationName\xe2\x80\x99 with reason: \xe2\x80\x98UserPurgedZone\xe2\x80\x99* [NSCloudKitMirroringDelegate logResetSyncNotification:](1798) \nRun Code Online (Sandbox Code Playgroud)\n\n在我的代码中,我在加载持久存储时进行了错误处理,但此错误不会触发它,因为此错误是在存储加载后发生的。
\n\n我在哪里处理这些错误?我怎样才能看到代码中的这些错误?
\n在开发过程中,我已经转向NSPersistentCloudKitContainer并开始了尝试测试尽可能多的场景以确保没有人丢失任何数据的可怕过程。
在一些测试中我看到了这样的错误:
<CKError 0x28033a310: "Partial Failure" (2/1011); "Failed to modify some records"; uuid = B6015357-50E0-40B3-949F-1557F59A23DB; container ID = "iCloud.com.xxxx.yyyyyy"; partial errors: {
F023EFDF-B9DE-4C17-872B-01C34C0DF129:(com.apple.coredata.cloudkit.zone:__defaultOwner__) = <CKError 0x280266fa0: "Invalid Arguments" (12/2006); server message = "Cannot create or modify field 'CD_someField' in record 'CD_someRecord' in production schema"; uuid = B6015357-50E0-40B3-949F-1557F59A23DB>
... 399 "Batch Request Failed" CKError's omited ...
}>
Run Code Online (Sandbox Code Playgroud)
我能够修复这个问题,但它只会影响某些场景,如果这种情况发生在真正的用户身上,他们(和我)将永远不会知道这个问题,并且他们的数据也不会同步到 CloudKit。
如果商店无法加载,您会收到一个错误,但如果它加载但不同步,则不会。
所以我的问题是:有没有办法接收代码中的此类错误?
我寻找了通知和委托方法,但找不到。
cloudkit ×10
ios ×6
core-data ×3
swift ×3
nspersistentcloudkitcontainer ×2
ckasset ×1
ckerror ×1
ckoperation ×1
ckrecordzone ×1
flutter ×1
icloud ×1
ios10 ×1
objective-c ×1
realm ×1
xcode11 ×1