标签: cloudkit

在测试中运行CloudKit代码?

我想使用XCTest框架为我的CloudKit代码编写自动化测试.测试用例运行,获取一个有效的容器对象,获取一个有效的公共数据库对象,但当我尝试做任何真实的事情时,它会因异常而死:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
    reason: 'Failed to establish valid container/bundleID information'
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试了什么:

  • 我已经检查了Info.plist我的测试目标,并且那里的包ID对应于容器ID.
  • 我已经调整[[NSBundle mainBundle] bundleIdentifier]以确保它返回正确的包ID.
  • 我已从主应用程序的目标中复制了iCloud权利.

但我仍然得到例外.有没有办法让CloudKit代码在测试中运行?

testing ios cloudkit

6
推荐指数
1
解决办法
1029
查看次数

在Swift中定义CKRecord上的下标时堆栈溢出

这个问题询问是否可以CKRecord在Swift中使用下标.虽然我已经知道如何做提问者想要的东西,但是它的每个排列都会给我一个堆栈溢出:

subscript(key: String) -> CKRecordValue? {
    get {
        return objectForKey(key) as CKRecordValue?
    }
    set {
        setObject(newValue, forKey: key)
    }
}
Run Code Online (Sandbox Code Playgroud)

堆栈溢出发生在getter中.(我从来没有尝试过的制定者,所以它可能有发生了.)我已经试过与实施objectForKey:,objectForKeyedSubscript:以及valueForKey:.所有都产生相同的结果:堆栈溢出.

这很奇怪,因为CKRecord肯定是用Objective-C编写的.为什么它会以递归方式调用Swift的subscript方法?这没有道理.Nate Cook在对提问者的回答中,想知道为什么Swift不会objectForKeyedSubscript:自动桥接.好吧,也许这样做的代码没有完全烘焙,但是导致了这个问题.我将不得不尝试与另一个类objectForKeyedSubscript:.

UPDATE

它似乎objectForKeyedSubscript:通常是桥接的.我使用适当的方法在Objective-C中创建了一个类,将其添加到桥接头,并且索引器在那里编译而没有问题.更好的是,它没有堆栈溢出.

这意味着正在发生一些非常不寻常的事情CKRecord.

一个理论

如果你在Swift中创建一个类,NSObjectsubscript使用a String作为键来实现它的方法,那就变成了objectForKeyedSubscript:.(对于"纯Swift"类,我怀疑情况并非如此.)您可以通过将Swift类导入Objective-C并验证objectForKeyedSubscript:是否存在来验证这一点.

CKRecord下降开始NSObject,实现subscript覆盖默认实现.此外,它似乎objectForKey:valueForKey:所有最终叫objectForKeyedSubscript:,这会导致(读:"是一样的")的调用subscript,这会导致堆栈溢出.

这可以解释为什么发生堆栈溢出.它仍然没有解释为什么objectForKeyedSubscript:没有自动桥接,但也许是因为定义setObject:forKeyedSubscript:与规范的类型签名略有不同:- …

subscript-operator swift cloudkit ckrecord

6
推荐指数
1
解决办法
825
查看次数

如何从cloudkit接收图像?

我使用此代码在icloud中存储图像,但我使用什么代码来检索它并将其放在UIImageView中?我已经尝试了一切,但它不会工作?

func SaveImageInCloud(ImageToSave: UIImage) {
    let newRecord:CKRecord = CKRecord(recordType: "ImageRecord")

    let nsDocumentDirectory = NSSearchPathDirectory.DocumentDirectory
    let nsUserDomainMask = NSSearchPathDomainMask.UserDomainMask
    if let paths = NSSearchPathForDirectoriesInDomains(nsDocumentDirectory, nsUserDomainMask, true) {
        if paths.count > 0 {
            if let dirPath = paths[0] as? String {
                let writePath = dirPath.stringByAppendingPathComponent("Image2.png")
                UIImagePNGRepresentation(ImageToSave).writeToFile(writePath, atomically: true)

                var File : CKAsset?  = CKAsset(fileURL: NSURL(fileURLWithPath: writePath))
                newRecord.setValue(File, forKey: "Image")

            }
        }
    }

    if let database = self.privateDatabase {
        database.saveRecord(newRecord, completionHandler: { (record:CKRecord!, error:NSError! ) in
            if error != nil {
                NSLog(error.localizedDescription)
            } …
Run Code Online (Sandbox Code Playgroud)

xcode ios icloud swift cloudkit

6
推荐指数
1
解决办法
3533
查看次数

CloudKit和键值存储之间的区别

iCloud的"键值存储"和CloudKit有什么区别?

示例场景是:如果要同步包含字典,数组和其他对象的相当大的数组.开发人员是否想要使用CloudKit或键值存储?

key-value-store ios icloud cloudkit

6
推荐指数
2
解决办法
1279
查看次数

CKReference .DeleteSelf属性无效

.DeleteSelf如何真正起作用?文件说:

当引用对象的操作设置为CKReferenceActionDeleteSelf时,引用的目标(即存储在引用的recordID属性中的记录)将成为源记录的所有者.删除目标(所有者)记录将删除其所有源记录.

但我的印象是删除目标并不总是删除源.它仍然在容器中,客户端下载它,并期望参考点到某处,但在客户端上构建服务器数据存储片时,目标不存在,这是非常烦人的?

你怎么对待这个案子?你忽略那种记录?或者您定期查找CloudKit存储,搜索损坏的记录以删除它们?

或者不是删除记录,最好设置一个属性,使其处于已删除状态,但将其保留在数据库中?

ios cloudkit ckreference

6
推荐指数
1
解决办法
340
查看次数

可以将Realm用作表示CloudKit公共数据库的持久性模型吗?

我想使用Realm作为持久性模型来表示我的CloudKit公共数据库.这可能吗?

具体来说,我想使用CloudKit获取Realm数据模型并将其存储在我的CloudKit公共数据库中.

这将克服我每次将应用程序加载到内存时必须从CloudKit获取数据的当前问题.如果没有本地数据模型,当没有Internet连接时,由于没有持久性,因此不会获取任何数据.

如果应用程序已从内存中删除,则从CloudKit获取的应用程序中保存的任何数据也将从内存中删除.

realm ios swift cloudkit

6
推荐指数
1
解决办法
878
查看次数

使用CloudKit和Swift一次保存多个CKRecords

是否可以使用Swift CKRecord在一个CloudKit操作中保存多个对象?我知道如何一次检索多个记录,使用类似CKFetchRecordsOperation甚至只是常规的东西performQuery.我刚刚意识到我不确定在一次操作中保存多个新记录的方法.到目前为止,我一直这样做的方式对我来说似乎效率低下.例如:

let recordsToSave:[CKRecord]!

for newRecord in recordsToSave {

    if let database = self.publicDatabase {

        database.saveRecord(newRecord, completionHandler: { (record:CKRecord?, error:NSError?) in

            // Check if there was an error
            if error != nil {

                // There was an error, handle it properly.

            }
            else {

                // There wasn't an error
                if let savedRecord = record {

                    // Handle saved record accordingly.

                }

            }
        })
}
Run Code Online (Sandbox Code Playgroud)

虽然这确实很好用,但在我看来它似乎效率极低.我认为让一个特定的函数调用来保存整个数组会更有意义CKRecords,而不是每次都要通过循环调用数据库.基本上这就是我希望我能做到的:

let recordsToSave:[CKRecord]!

if let …
Run Code Online (Sandbox Code Playgroud)

ios swift cloudkit ckrecord

6
推荐指数
1
解决办法
1954
查看次数

如何在iOS 10消息扩展中使用CKSubscription?

iOS 10引入了消息扩展,这是第一个(据我所知)扩展,不需要主机应用程序.我正在尝试在没有主机应用程序的邮件扩展中使用CloudKit.

据我所知,CKSubscription依赖于推送通知.但是,我无法UIApplication在应用扩展程序中以通常的方式(通过)注册推送通知:

let app = UIApplication.shared // Error: not available here blah blah blah
Run Code Online (Sandbox Code Playgroud)

这意味着CKSubscription在消息应用程序中似乎无法接收通知.我确实在新的中找到了希望UserNotifications.framework,但它没有提供任何注册远程通知的机制.我试过了:

override func willBecomeActive(with conversation: MSConversation) {

    // ...

    let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options: [.badge, .alert]) { success, error in
        if error != nil { fatalError() }
    }
    center.delegate = self

    // ...
}

// MARK: UNUserNotificationCenterDelegate
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {
    fatalError() // This never gets called :( …
Run Code Online (Sandbox Code Playgroud)

ios swift cloudkit ios10 ios-messages-extension

6
推荐指数
0
解决办法
486
查看次数

获取应用上次打开后收到的所有推送通知

我正在使用Xcode 8和CloudKit创建一个iOS 10应用程序.当应用程序加载时,有没有办法读取自上次应用程序运行以来发送的所有推送通知?

objective-c push-notification ios swift cloudkit

6
推荐指数
1
解决办法
1658
查看次数

iCloud Drive REST API?

我正在编写Windows C ++应用程序,该应用程序使用户能够将一些工作结果直接保存到Google云端硬盘,Dropbox和OneDrive等云存储中。我已经能够创建使用OAuth2和REST API验证用户身份并上传文件的代码的有效实现(在CppRestSDK帮助下)。现在,我一直在寻找使用iCloud Drive服务执行相同操作的能力。到目前为止,我已经看到,对于所有(?)基于iCloud的服务,Apple都提供了CloudKit SDK与之配合使用。但是此SDK仅适用于XCode,并且有一些适用于JavaScript的网络版本。我的问题很简单-是否可以通过Windows C ++应用程序将文件上传到iCloud Drive?

c++ rest icloud cloudkit icloud-drive

6
推荐指数
0
解决办法
1056
查看次数