我想使用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.但我仍然得到例外.有没有办法让CloudKit代码在测试中运行?
我试图简单地将记录保存到用户私有数据库但是当我运行privateDB.saveRecord()时,我得到一个错误说
Not Authenticated" (9/1002); "CloudKit access was denied by user settings"; Retry after 3.0 seconds>.
Run Code Online (Sandbox Code Playgroud)
此帐户可以登录cloudkit仪表板,因此它是应用程序的开发人员.还有哪些其他问题?任何帮助都会非常感激,我已经坚持这么久了.
这是我的代码:
//variable instantiation
container = CKContainer.defaultContainer()
println(container.containerIdentifier)
publicDB = container.publicCloudDatabase
privateDB = container.privateCloudDatabase
//save record code
let passRecord = CKRecord(recordType: "Password")
passRecord.setValue("testytestPow", forKey: "title")
passRecord.setValue("password02", forKey: "value")
privateDB.saveRecord(passRecord, completionHandler: { (record, error) -> Void in
if (error != nil) {
println(error)
} else {
NSLog("Saved in cloudkit")
self.fetchTodos()
}
})
Run Code Online (Sandbox Code Playgroud) 这个问题询问是否可以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:.
它似乎objectForKeyedSubscript:通常是桥接的.我使用适当的方法在Objective-C中创建了一个类,将其添加到桥接头,并且索引器在那里编译而没有问题.更好的是,它没有堆栈溢出.
这意味着正在发生一些非常不寻常的事情CKRecord.
如果你在Swift中创建一个类,NSObject并subscript使用a String作为键来实现它的方法,那就变成了objectForKeyedSubscript:.(对于"纯Swift"类,我怀疑情况并非如此.)您可以通过将Swift类导入Objective-C并验证objectForKeyedSubscript:是否存在来验证这一点.
从CKRecord下降开始NSObject,实现subscript覆盖默认实现.此外,它似乎objectForKey:和valueForKey:所有最终叫objectForKeyedSubscript:,这会导致(读:"是一样的")的调用subscript,这会导致堆栈溢出.
这可以解释为什么发生堆栈溢出.它仍然没有解释为什么objectForKeyedSubscript:没有自动桥接,但也许是因为定义setObject:forKeyedSubscript:与规范的类型签名略有不同:- …
我使用此代码在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) 编辑:今天在2015年8月27日重新测试,它再次运作,苹果已修复它.
我有一个处于开发模式的应用程序.该应用程序使用CKSubscription来获取服务器上的更改通知,为所有三个选项配置:创建,更新,删除.一切都运行正常但最近在回归测试期间我发现应用程序没有收到有关记录更新的通知,创建和删除通知仍然有效.正如我在仪表板上检查的那样,所有三个选项都正确设置了susbcription类型,并且应用程序已注册CKSubscription,因为它是在几天前工作时才像魅力一样.我没有收到CloudKit的任何错误.重置开发环境没有帮助.我已经重新测试了我确信它正在工作的版本,并得到了相同的结果.
知道可能导致这个问题的原因,我还应该检查/尝试什么?
附加信息: 我猜服务器端可能出现问题.我没有更改我订阅CloudKit事件和处理推送通知的代码中的任何内容 - 无论如何,它正在工作的版本不再获得更新通知.我正在处理的应用程序已发布,因此更改容器是不行的.不确定这是否会导致问题,只是想提一下:应用程序使用相同的容器将核心数据存储在云中 - 应用程序升级的目标是将数据迁移到CloudKit并将其用作云专门存储.令人困惑的是,一切都运行良好数周并突然停止工作,没有任何明确的原因,可能是因为密集测试的负载效应,添加记录类型......
使用从头开发的应用程序测试: 我编写了一个简单的测试应用程序来检查接收通知.我只能收到有关创建记录的通知.我的代码出了什么问题:
import UIKit
import CloudKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
let container = CKContainer.defaultContainer()
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let settings = UIUserNotificationSettings(forTypes: .Alert, categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
return true
}
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
println("didFailToRegisterForRemoteNotificationsWithError: \(error)")
}
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
println("didRegisterForRemoteNotificationsWithDeviceToken: \(deviceToken)")
subscribe()
}
func subscribe() {
// let predicate = NSPredicate(format: …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用CloudKit,所以请耐心等待.
背景信息
在WWDC 2015上,苹果发表了关于CloudKit的演讲https://developer.apple.com/videos/wwdc/2015/?id=715
在这次演讲中,他们警告不要创建链接查询,而是推荐这种策略:
let firstFetch = CKFetchRecordsOperation(...)
let secondFetch = CKFetchRecordsOperation(...)
...
secondFetch.addDependency(firstFetch)
letQueue = NSOperationQueue()
queue.addOperations([firstFetch, secondFetch], waitUntilFinished: false)
Run Code Online (Sandbox Code Playgroud)
示例结构
测试项目数据库包含宠物及其所有者,它看起来像这样:
|Pets | |Owners |
|-name | |-firstName |
|-birthdate | |-lastName |
|-owner (Reference) | | |
Run Code Online (Sandbox Code Playgroud)
我的问题
我试图找到属于所有者的所有宠物,我担心我正在创建链苹果警告.请参阅下面的两种方法,它们可以做同样的事情,但有两种方法.哪个更正确或者都错了?我觉得我在做同样的事情,但只是使用完成块.
我很困惑如何更改otherSearchBtnClick:使用依赖项.我需要在哪里添加
ownerQueryOp.addDependency(queryOp)
Run Code Online (Sandbox Code Playgroud)
在otherSearchBtnClick:?
@IBAction func searchBtnClick(sender: AnyObject) {
var petString = ""
let container = CKContainer.defaultContainer()
let publicDatabase = container.publicCloudDatabase
let privateDatabase = container.privateCloudDatabase
let predicate = NSPredicate(format: "lastName == '\(ownerLastNameTxt.text)'")
let ckQuery = CKQuery(recordType: …Run Code Online (Sandbox Code Playgroud) iCloud的"键值存储"和CloudKit有什么区别?
示例场景是:如果要同步包含字典,数组和其他对象的相当大的数组.开发人员是否想要使用CloudKit或键值存储?
该文件说:
CKErrorIncompatibleVersion
应用版本低于允许的最低版本.
适用于iOS 8.0及更高版本.
但是没有详细说明哪些上下文会导致收到此错误.据我所知,没有办法设置最低允许的应用版本.
我想使用Realm作为持久性模型来表示我的CloudKit公共数据库.这可能吗?
具体来说,我想使用CloudKit获取Realm数据模型并将其存储在我的CloudKit公共数据库中.
这将克服我每次将应用程序加载到内存时必须从CloudKit获取数据的当前问题.如果没有本地数据模型,当没有Internet连接时,由于没有持久性,因此不会获取任何数据.
如果应用程序已从内存中删除,则从CloudKit获取的应用程序中保存的任何数据也将从内存中删除.
我正在编写Windows C ++应用程序,该应用程序使用户能够将一些工作结果直接保存到Google云端硬盘,Dropbox和OneDrive等云存储中。我已经能够创建使用OAuth2和REST API验证用户身份并上传文件的代码的有效实现(在CppRestSDK帮助下)。现在,我一直在寻找使用iCloud Drive服务执行相同操作的能力。到目前为止,我已经看到,对于所有(?)基于iCloud的服务,Apple都提供了CloudKit SDK与之配合使用。但是此SDK仅适用于XCode,并且有一些适用于JavaScript的网络版本。我的问题很简单-是否可以通过Windows C ++应用程序将文件上传到iCloud Drive?