我想使用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代码在测试中运行?
这个问题询问是否可以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) iCloud的"键值存储"和CloudKit有什么区别?
示例场景是:如果要同步包含字典,数组和其他对象的相当大的数组.开发人员是否想要使用CloudKit或键值存储?
.DeleteSelf如何真正起作用?文件说:
当引用对象的操作设置为CKReferenceActionDeleteSelf时,引用的目标(即存储在引用的recordID属性中的记录)将成为源记录的所有者.删除目标(所有者)记录将删除其所有源记录.
但我的印象是删除目标并不总是删除源.它仍然在容器中,客户端下载它,并期望参考点到某处,但在客户端上构建服务器数据存储片时,目标不存在,这是非常烦人的?
你怎么对待这个案子?你忽略那种记录?或者您定期查找CloudKit存储,搜索损坏的记录以删除它们?
或者不是删除记录,最好设置一个属性,使其处于已删除状态,但将其保留在数据库中?
我想使用Realm作为持久性模型来表示我的CloudKit公共数据库.这可能吗?
具体来说,我想使用CloudKit获取Realm数据模型并将其存储在我的CloudKit公共数据库中.
这将克服我每次将应用程序加载到内存时必须从CloudKit获取数据的当前问题.如果没有本地数据模型,当没有Internet连接时,由于没有持久性,因此不会获取任何数据.
如果应用程序已从内存中删除,则从CloudKit获取的应用程序中保存的任何数据也将从内存中删除.
是否可以使用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 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) 我正在使用Xcode 8和CloudKit创建一个iOS 10应用程序.当应用程序加载时,有没有办法读取自上次应用程序运行以来发送的所有推送通知?
我正在编写Windows C ++应用程序,该应用程序使用户能够将一些工作结果直接保存到Google云端硬盘,Dropbox和OneDrive等云存储中。我已经能够创建使用OAuth2和REST API验证用户身份并上传文件的代码的有效实现(在CppRestSDK帮助下)。现在,我一直在寻找使用iCloud Drive服务执行相同操作的能力。到目前为止,我已经看到,对于所有(?)基于iCloud的服务,Apple都提供了CloudKit SDK与之配合使用。但是此SDK仅适用于XCode,并且有一些适用于JavaScript的网络版本。我的问题很简单-是否可以通过Windows C ++应用程序将文件上传到iCloud Drive?
cloudkit ×10
ios ×8
swift ×6
icloud ×3
ckrecord ×2
c++ ×1
ckreference ×1
icloud-drive ×1
ios10 ×1
objective-c ×1
realm ×1
rest ×1
testing ×1
xcode ×1