我在我的应用程序中使用了一个公共的iCloud数据库,它运行良好并且在商店中.
在将我的应用程序更新为新版本(在iOS9上使用Xcode 7)时,我遇到了崩溃:
CKContainer * container = [CKContainer containerWithIdentifier:@"iCloud.com.identifier"];
*** Terminating app due to uncaught exception 'CKException', reason: 'The application is missing required entitlement com.apple.developer.icloud-services'
Run Code Online (Sandbox Code Playgroud)
这仅在更新后首次启动应用程序时发生,并且仅在iOS9上发生.在第一次(更新)启动之后,应用程序启动并且iCloud按预期工作.
我可以通过下载应用程序的当前商店版本,然后从Xcode 7运行更新的应用程序来一致地重新创建崩溃.
如果我使用iOS8执行相同的步骤(下载生产应用程序和更新),我没有相同的崩溃.
我猜这是一个iOS9或Xcode 7的错误.有任何想法吗?
编辑:这实际上发生在iOS9上首次启动应用程序,无论我是更新还是只是首次安装.
我想从CloudKit获取最后X分钟的公共/私人条目.
我尝试了这个效果,但失败了:
let date = NSDate(timeInterval: -60.0 * 120, sinceDate: NSDate())
let predicate = NSPredicate(format: "creationDate > %@", date)
Run Code Online (Sandbox Code Playgroud)
但这会得到我的数据,但我不确定我是在查询所有内容还是只是某种上限:
let predicate = NSPredicate(value: true)
Run Code Online (Sandbox Code Playgroud)
我希望能够在一定的时间内查询.如果不在客户端进行创建排序逻辑,这可能吗?
这是完整的代码块:
func fetchPublicData(completion: ((records:[AnyObject]) -> Void)!)
{
let date = NSDate(timeInterval: -60.0 * 120, sinceDate: NSDate())
let predicate = NSPredicate(format: "creationDate > %@", date)
let query = CKQuery(recordType: "MyDataRecordType", predicate: predicate)
let container = CKContainer.defaultContainer()
let publicDb = container.publicCloudDatabase
publicDb.performQuery(query, inZoneWithID: nil,
{
(results, error) in
if error != nil
{
self.handleError(error)
}
else …Run Code Online (Sandbox Code Playgroud) 我正在使用CloudKit构建iOS应用程序.
它应该允许用户Products在云中添加,编辑和删除.用户可以在文件夹中组织这些内容.这些文件夹只是cloudkit中的其他记录类型.用户可以使用的文件夹级别没有限制,因为任何文件夹都可以只保存CKReference到其父文件夹.我的应用程序中的所有CloudKit通信都在专用的CloudKitController类中进行
这一切都有效,但一段时间后停止工作没有明确的理由.
当我测试我的应用程序时,我甚至不会使用多级别的文件夹.但是,使用它一段时间(最多一周)后,所有已删除的记录似乎都会重新出现在CloudKit上.关于这个的几点说明:
它已经有一段时间了,我已经检查过我的代码,Apple Library和Google多次,但我无法弄清楚导致这个问题的原因.
问题: 有人知道如何克服这个问题吗?就像我说的那样,我已经遇到了几个星期,重置我的CloudKit仪表板只能"治愈"它长达一个星期,然后它再次弹出.我也非常乐意发布任何代码,如果这有助于你回答我的问题.我最初没有发布任何代码,因为我不知道代码可能会导致什么.
任何答案都将受到高度赞赏
我正在开发一个带有xcode 7 beta 5的应用程序.当我在iphone 6上运行我的应用程序时,如果我的iphone在wifi模式下工作,我尝试将其连接到CloudKit,所有这些都可以,我显示所有数据; 但如果我的iphone在LTE模式下工作,我看不到任何类型的数据.有谁知道如何做到这一点?
func getRecordsFromCloud() {
lavori = []
/
let _cloudContainer = CKContainer.defaultContainer()
let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase
/
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "Lavori", predicate: predicate)
/
let queryOperation = CKQueryOperation(query: query)
queryOperation.desiredKeys = ["image","name"]
queryOperation.queuePriority = .VeryHigh
queryOperation.resultsLimit = 50
queryOperation.recordFetchedBlock = { (record:CKRecord) -> Void in
let lavoriRecord = record
self.lavori.append(lavoriRecord)
}
queryOperation.queryCompletionBlock = { (cursor:CKQueryCursor?, error:NSError?) -> Void in
if (error != nil) {
print("Failed to get data from …Run Code Online (Sandbox Code Playgroud) 我正在使用CloudKit作为我的iOS应用程序的服务器后端.我用它来存放一些相对静态的数据以及一些图像(CKAsset).当我花时间从公共数据库中实际获取这些资产时,我遇到了一个问题.它们以极慢的速度加载.
我的用例是将图像加载到集合视图内的每个单元格中.图像的大小仅为200kb,但获取过程平均需要2.2秒才能完成下载并在单元格中设置图像.为了比较,我使用类似大小的库存图像的URL并使用NSURLSession加载它们.每个图像加载仅需0.18 - 0.25秒.
我尝试了多种不同的方式从CK下载图像:直接获取记录,查询和操作查询.所有这些都有类似的结果.在为单元格设置图像之前,我还将调度回完成块中的主队列.
我的数据库设置为具有包含多个数据字段的主对象.然后,我为照片设置了一个向后的参考样式系统,其中每张照片只有一个主要对象的引用.这样我就可以按需加载照片而不会影响主要数据.
它看起来像这样:
主要对象:
title: String, startDate: Date
照片对象:
owner: String(reference to primary object), image: Asset
以下是我尝试直接获取其中一张照片的示例请求:
let publicDb = CKContainer.defaultContainer().publicCloudDatabase
let configRecordId = CKRecordID(recordName: "e783f542-ec0f-46j4-9e99-b3e3ez505adf")
publicDb.fetchRecordWithID(configRecordId) { (record, error) -> Void in
dispatch_async(dispatch_get_main_queue()) {
guard let photoRecord = record else { return }
guard let asset = photoRecord["image"] as? CKAsset else { return }
guard let photo = NSData(contentsOfURL: asset.fileURL) else { return }
let image = UIImage(data: photo)!
cell.cardImageView.image = image
}
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法弄清楚为什么这些图像下载需要这么长时间,但如果我无法让它们在合理的时间内加载,那真的是非常明显的. …
我希望我的Web应用程序允许从iCloud联系人导入用户联系人(特别是地址).
类似于Google People API为Google通讯录提供的内容.
方案是,用户使用桌面浏览器访问我的网站并导入其所有联系人.
因此,用户不应该浪费时间键入所有联系人,以便能够在网站上使用它们.
我正在尝试使用CloudKit JS来解决这个问题.
看起来.discoverAllUserIdentities就是我所需要的:
获取用户/发现:获取当前用户的地址簿中的所有用户身份,如发现所有用户身份(GET用户/发现)中所述
但是,我得到空集:
{"users":[]}
似乎Web应用程序没有获取联系人的权限.如果是这样,如何申请权限?
或者可能是我完全错误的方式,如果问题可以解决,请指出正确的方向.
encodeSystemFields 当我在本地保存记录时,应该使用数据库.
一旦我导出了这些数据,在反序列化时我必须做些什么吗?
我应该根据该数据中的信息采取哪些方案?
作为一种变体(如果在上一个问题中没有涉及),这些信息对我有何帮助?(我假设数据损坏)
我在两个不同的设备上有两个icloud帐户(A和B).从他们中的一个(A)我分享ckrecord到另一个(B)像这样:
let controller = UICloudSharingController { controller, preparationCompletionHandler in
let share = CKShare(rootRecord: record)
share[CKShareTitleKey] = "title" as CKRecordValue
share[CKShareTypeKey] = "pl.blueworld.fieldservice" as CKRecordValue
share.publicPermission = .readWrite
let modifyOperation = CKModifyRecordsOperation(recordsToSave: [record, share], recordIDsToDelete: nil)
modifyOperation.savePolicy = .ifServerRecordUnchanged
modifyOperation.perRecordCompletionBlock = { record, error in
print(error?.localizedDescription ?? "")
}
modifyOperation.modifyRecordsCompletionBlock = { records, recordIds, error in
print(share.url)
preparationCompletionHandler(share, CloudAssistant.shared.container, error)
}
CloudAssistant.shared.container.privateCloudDatabase.add(modifyOperation)
}
controller.delegate = self
UIViewController.top()?.present(controller, animated: true)
Run Code Online (Sandbox Code Playgroud)
当第二个设备(B)接受cloudkit共享时,我获取记录并订阅更改:
func …Run Code Online (Sandbox Code Playgroud) 我有一个在 iOS 上运行良好的应用程序,但是当使用催化剂运行时,如果我在 macOS 上滑动到另一个虚拟桌面,然后返回大约 10 次,它会间歇性地让我崩溃。它主要发生在 UICollectionViewController 上
这是回溯:
(lldb) bt
* thread #5, queue = 'com.apple.xpc.activity.com.apple.cloudkit.scheduler.com.apple.coredata.cloudkit.activity.export', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
* frame #0: 0x00007fff68c373ae libxpc.dylib`___xpc_activity_dispatch_block_invoke.107.cold.3 + 19
frame #1: 0x00007fff68c1ecdb libxpc.dylib`___xpc_activity_dispatch_block_invoke.107 + 746
frame #2: 0x00000001010377b3 libdispatch.dylib`_dispatch_call_block_and_release + 12
frame #3: 0x000000010103878f libdispatch.dylib`_dispatch_client_callout + 8
frame #4: 0x000000010103fd31 libdispatch.dylib`_dispatch_lane_serial_drain + 777
frame #5: 0x0000000101040ae8 libdispatch.dylib`_dispatch_lane_invoke + 438
frame #6: 0x000000010104df2e libdispatch.dylib`_dispatch_workloop_worker_thread + 681
frame #7: 0x00000001010c4053 libsystem_pthread.dylib`_pthread_wqthread + 290
frame #8: 0x00000001010c3eb3 libsystem_pthread.dylib`start_wqthread + 15
(lldb) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 CoreData+CloudKit 项目中执行历史跟踪,该项目使用NSPersistentCloudKitContainer. 我一直在关注 Apple 的示例项目
我想在远程存储更新后执行某些任务。为此,苹果建议在应用程序的签名和功能的后台模式部分启用远程通知。
我已经为我的项目启用了历史跟踪,如 Apple 的示例项目所示。
// turn on persistent history tracking
let description = container.persistentStoreDescriptions.first
description?.setOption(true as NSNumber,
forKey: NSPersistentHistoryTrackingKey)
// ...
Run Code Online (Sandbox Code Playgroud)
我还注册了我的商店来监听商店的变化。
// turn on remote change notifications
let remoteChangeKey = "NSPersistentStoreRemoteChangeNotificationOptionKey"
description?.setOption(true as NSNumber,
forKey: remoteChangeKey)
// ...
Run Code Online (Sandbox Code Playgroud)
还添加了观察者来侦听NSPersistentStoreRemoteChangeNotification.
然而,没有NSPersistentStoreRemoteChangeNotification被解雇。为了确保我的实现没有错误,我只是在@objc func storeRemoteChange(_ notification: Notification)Apple 提供的示例代码中放置了断点,但我仍然看不到任何通知被触发并且没有断点被激活。
我已经了解示例项目中完成的标签重复数据删除,也尝试对其进行测试,但没有任何成功。这是 Apple 实现中的错误还是我缺少任何必需的设置?
cloudkit ×10
ios ×7
swift ×6
icloud ×4
icloud-api ×2
core-data ×1
ios10 ×1
ios13 ×1
ios9 ×1
iphone ×1
mac-catalyst ×1
nspersistentcloudkitcontainer ×1
objective-c ×1