标签: cloudkit

该应用程序缺少必需的权利com.apple.developer.icloud-services'

我在我的应用程序中使用了一个公共的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上首次启动应用程序,无论我是更新还是只是首次安装.

ios icloud cloudkit ios9

13
推荐指数
3
解决办法
5136
查看次数

如何在CloudKit中通过creationDate进行查询?

我想从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)

objective-c ios swift cloudkit

12
推荐指数
1
解决办法
3610
查看次数

删除的CloudKit记录重新出现

我正在使用CloudKit构建iOS应用程序.

它应该允许用户Products在云中添加,编辑和删除.用户可以在文件夹中组织这些内容.这些文件夹只是cloudkit中的其他记录类型.用户可以使用的文件夹级别没有限制,因为任何文件夹都可以只保存CKReference到其父文件夹.我的应用程序中的所有CloudKit通信都在专用的CloudKitController类中进行

这一切都有效,但一段时间后停止工作没有明确的理由.

当我测试我的应用程序时,我甚至不会使用多级别的文件夹.但是,使用它一段时间(最多一周)后,所有已删除的记录似乎都会重新出现在CloudKit上.关于这个的几点说明:

  • 当我重置我的CloudKit仪表板并重新开始时,它完美无缺.没有进行代码更改.
  • 显然,我正在不断编辑我的代码,因为应用正在开发中.但是,我通常不会编辑我的代码中要存储在CloudKit中的数据类型.当我这样做时,这个问题不会在之后出现
  • CloudKit仪表板中的更改(例如,添加数据类型)不会导致此问题
  • 我没有在本地存储任何记录,例如在核心数据中.只要我使用它们,它们就会坐在一个单体中
  • 当我转到CloudKit仪表板时,产品记录类型显示它有例如13个实例.有时它太糟糕了,我的应用程序实际上加载了100以上.当我转到recordZone时我也可以看到它们,但仍然RecordType说它只有13个实例
  • 在CloudKit仪表板中删除这些记录只会让它们消失一段时间.当我重新加载页面时,它们会再次弹出.

它已经有一段时间了,我已经检查过我的代码,Apple Library和Google多次,但我无法弄清楚导致这个问题的原因.

问题: 有人知道如何克服这个问题吗?就像我说的那样,我已经遇到了几个星期,重置我的CloudKit仪表板只能"治愈"它长达一个星期,然后它再次弹出.我也非常乐意发布任何代码,如果这有助于你回答我的问题.我最初没有发布任何代码,因为我不知道代码可能会导致什么.

任何答案都将受到高度赞赏

ios swift cloudkit

12
推荐指数
1
解决办法
933
查看次数

iOS 9 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)

iphone ios icloud swift cloudkit

12
推荐指数
1
解决办法
1005
查看次数

从CloudKit获取CKAsset图像非常慢

我正在使用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)

我似乎无法弄清楚为什么这些图像下载需要这么长时间,但如果我无法让它们在合理的时间内加载,那真的是非常明显的. …

ios swift cloudkit

12
推荐指数
2
解决办法
2074
查看次数

通过CloudKit JS从iCloud联系人获取地址

我希望我的Web应用程序允许从iCloud联系人导入用户联系人(特别是地址).

类似于Google People API为Google通讯录提供的内容.

方案是,用户使用桌面浏览器访问我的网站并导入其所有联系人.
因此,用户不应该浪费时间键入所有联系人,以便能够在网站上使用它们.

我正在尝试使用CloudKit JS来解决这个问题.

看起来.discoverAllUserIdentities就是我所需要的:

获取用户/发现:获取当前用户的地址簿中的所有用户身份,如发现所有用户身份(GET用户/发现)中所述

但是,我得到空集: {"users":[]}

似乎Web应用程序没有获取联系人的权限.如果是这样,如何申请权限?

或者可能是我完全错误的方式,如果问题可以解决,请指出正确的方向.

icloud icloud-api cloudkit

12
推荐指数
1
解决办法
744
查看次数

我如何(以及何时)在CKRecord上使用iCloud的encodeSystemFields方法?

encodeSystemFields 当我在本地保存记录时,应该使用数据库.

一旦我导出了这些数据,在反序列化时我必须做些什么吗?

我应该根据该数据中的信息采取哪些方案?

作为一种变体(如果在上一个问题中没有涉及),这些信息对我有何帮助?(我假设数据损坏)

icloud icloud-api cloudkit ios10

12
推荐指数
1
解决办法
1590
查看次数

如何接收有关与我共享的记录所做更改的cloudkit通知?

我在两个不同的设备上有两个icloud帐户(AB).从他们中的一个(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)

push-notification ios swift cloudkit

12
推荐指数
1
解决办法
806
查看次数

EXC_BAD_INSTRUCTION 来自 com.apple.xpc.activity.com.apple.cloudkit.scheduler.com.apple.coredata.cloudkit.activity.export

我有一个在 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)

ios swift cloudkit mac-catalyst

12
推荐指数
1
解决办法
424
查看次数

NSPersistentStoreRemoteChangeNotification 没有被解雇

我正在尝试在我的 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 实现中的错误还是我缺少任何必需的设置?

core-data cloudkit ios13 nspersistentcloudkitcontainer

12
推荐指数
2
解决办法
2545
查看次数