我目前正在开发一款适用于iOS 8的应用程序,该应用程序使用iCloud Drive和CloudKit Framework.一切都是使用Xcode 6设置的.
当我尝试将我的应用程序提交到iTunesConnect时,我收到以下错误:

当我在我的iCloud权利中添加密钥时,我无法对应用程序进行代码签名,Xcode也向我发送错误.
<key>com.apple.developer.ubiquity-container-identifiers</key>
<string>de.sn0wfreeze.CloudFInder</string>
Run Code Online (Sandbox Code Playgroud)
我会得到那个错误:

我无法编码签名.有人可以帮我解决这个问题吗?
我正在开发一个应用程序,我最近决定使用CloudKit,现在我需要实现后端功能.简而言之,这个应用程序将使用集合视图来显示从CK数据库中检索的图像.到目前为止,我只是将一些图像转储到桌面上的文件夹中,并从那里检索/解析图像以呈现集合视图.然后,我使用CK仪表板创建了一些记录,并编写了一个初始化方法来尝试检索它们.我收到各种CKErrors,例如网络故障,错误完成而没有收到服务器的响应,无法发送有效签名等.我立即认为问题出在我的代码上,因为这是我第一次使用CloudKit.但是,我在发布SO之前在我的设备上运行了最新的代码并且它有效!我得到了一个成功的响应,结果数组中的记录数量是我所期待的.
所以现在我知道更长时间需要像我最初想的那样获取CKRecords的帮助.但是如何使用模拟器解决此问题?我看到了一些关于确保你在模拟器上登录iCloud的帖子.我相信我,但不知道如何检查以确定.另外,我正在运行Yosemite和Xcode 6.1.
任何帮助表示赞赏!
CKFetchNotificationChangesOperation返回INSERT操作,但UPDATE和DELETE并不总是如此.DELETE,UPDATE在我向App Store提交应用程序时最后工作,但现在不再了.为什么?我创建了以下订阅:
let s = CKSubscription(recordType: recordType, predicate: NSPredicate(value: true), options: .FiresOnRecordCreation | .FiresOnRecordUpdate | .FiresOnRecordDeletion)
s.notificationInfo = CKNotificationInfo()
subscriptionsToSave.append(s)
Run Code Online (Sandbox Code Playgroud)
仪表板显示所有树触发器:

我没有使用任何alertBody,所以通知是一个所谓的无声通知,它可能是原因吗?
在CloudKit提示和技巧讲师说,订阅需要从开发人员门户打开应用程序ID的APS功能.我不认为我有,但我只想要提取通知,只有在这有效时才推送.
背景能力? - 同样的
需要在app的信息plist中设置APS环境密钥. - 我想我拥有它.
几年前,Apple发布了Core Data应用程序的iCloud同步.然后我使用新的Apple机制发布了一个带有共享模型的iPad/iPhone/MAC应用程序.事情没有像预期的那样发生.同步机制有时不起作用.例如,在我的情况下,最近几个月很少通过我的3台设备完成同步.一般上传对象工作正常.但新的或删除的对象的下载过程正常崩溃.Apple前段时间发布了一种方法来强制设备重新下载模型的所有对象(NSPersistentStoreRebuildFromUbiquitousContentOption),这些对象正常工作,但这不是一个可接受的解决方案.
我的问题:是否有人完成了让iCloud + Core Data正常工作?如何在iOS 9 + El capitan下运行iCloud + CD,有什么经验吗?
我正在评估迁移到新的CloudKIT API,但我不喜欢在设备离线时自我管理对象上传的想法.指示模型更改的推送通知的新机制是否正常工作?
谢谢
我正在尝试使用CloudKit和光标从我的iCloud公共数据库下载一批记录.无论resultLimit如何设置,代码都可以在前3次执行中正常工作,但是从不执行第4个完成块.如果没有设置resultsLimit我得到300条记录,如果它设置为50我得到150,如果它设置为5我得到15 ...
没有报告错误,该块似乎已添加,但从未执行过.平台是OS X.以下是有问题的代码:
let queryOp = CKQueryOperation(query: query)
queryOp.recordFetchedBlock = self.fetchedDetailRecord
queryOp.resultsLimit = 5
queryOp.queryCompletionBlock = { [weak self]
(cursor: CKQueryCursor!, error: NSError!) -> Void in
println("comp block called with \(cursor) \(error)")
if error != nil {
println("Error on fetch \(error.userInfo)")
} else {
if cursor != nil {
let nextOp = CKQueryOperation(cursor: cursor)
nextOp.recordFetchedBlock = self!.fetchedDetailRecord
nextOp.queryCompletionBlock = queryOp.queryCompletionBlock
nextOp.resultsLimit = 5
self!.publicDatabase?.addOperation(nextOp)
println("added next fetch")
} else {
self!.fileHandle!.closeFile()
self!.exportProgressIndicator.stopAnimation(self)
}
}
}
self.publicDatabase?.addOperation(queryOp)
Run Code Online (Sandbox Code Playgroud)
这是控制台的结果 -
459013587628.012 …
在我的应用程序中,我想通过iCloud与其他iCloud用户共享数据,但不是与整个世界共享,而是与选定的其他iCloud用户共享.
我想到了一种可行的方法,但我不确定它是否会起作用,如果我忘记或误解了一些事情.
假设用户A希望能够与其他iCloud用户共享字符串,但不能与所有人共享.因此,用户A希望向用户B分享"Hello World",但不向用户C分享,而不是用户D.
所以我的应用程序有一个公共数据库和一个记录类型,每个人都一样.在该记录类型中,有一个String类型的字段,对每个人来说都是相同的.
现在,用户A将记录"Hello World"保存到iCloud.接下来是诀窍:我会在字符串中添加一个像UUID这样的唯一标识符,以便将"Hello World1230ABD6-3C61-1234-802E-D866F09AC012"等内容上传到iCloud.
现在用户A需要告诉用户他想要用他的UUID共享数据,因此用户A告诉用户B.现在用户A的UUID将作为谓词添加到用户B的CKSubscription.
这将允许用户B从用户A获取字符串,但用户C或用户D不会收到CKNotification,因为他们的CKSubscription中没有用户A的UUID.
这会起作用吗?或者是否有其他设计模式允许通过iCloud与其他iCloud帐户共享/同步,但不是与所有人(公共)共享/同步?
PS我想要共享的数据不敏感,所以它不需要非常安全.数据对每个人(公共)都不感兴趣,因此只需要与选定的其他iCloud帐户共享...
我很感激任何想法或提示如何实现这一目标!
谢谢
我在我的应用程序中使用CloudKit作为远程持久保存数据的方法.我的一个记录有一个CKAsset属性,用于保存图像.当我获取记录时,我意识到完成查询需要花费很多时间.经过多次测试,我得出结论,当您查询记录时,CloutKit会使用记录对象下载整个Asset文件.因此,当你获得记录对象的资产,并要求它的fileURL,它给你一个本地文件路径的URL,而不是HTTP网址类型.这对我来说是个问题,因为你必须让用户等待这么多时间才能在查询结束之前下载整个记录(及其相关图像).从解析背景的,解析用来给你的HTTP URL和查询速度足够快,同时加载图像异步与对象加载UI.我的问题是,我怎样才能实现Parse的作用?我需要限制查询下载Assets数据并获取一个链接以异步加载图像.
我的公共(开发)数据库中有一条记录,有几个填充字段.当我使用a CKFetchRecordsOperation来获取该记录时,获取成功,但结果CKRecord始终不包含任何键.无论我是明确设置desiredKeys我的提取操作还是将其保留为nil,都会发生这种情况.记录及其密钥长期保持不变,因此不是传播延迟.
公共数据库中只有一条记录,其ID与我得到的记录相符,所以我确信正在记录正确的记录; 它从来没有任何钥匙.例如,以下代码始终打印keys: [].
let op = CKFetchRecordsOperation(recordIDs:[...])
op.desiredKeys = [...] // commenting this has no effect
op.fetchRecordsCompletionBlock = {records, error in
if let e = error {
print("error:", e)}
for (id, r) in records ?? [:] {
print("keys:", r.allKeys())}}
db.addOperation(op)
Run Code Online (Sandbox Code Playgroud)
我也试过通过下标符号访问各个键,但它们总是如此nil.我现在处于亏损状态.没有错误,我想要的记录被发现,为什么没有任何密钥?
更新:我注意到CloudKit仪表板总是在左下角显示"重新编制索引",即使在我上次更改后的几天内也是如此.此外,我尝试创建第二条记录(通过仪表板),在留下足够的时间进行传播后,我的提取甚至无法找到它.
在从这个SO问题链接到Apple开发者论坛帖子关于这个问题之后,我发现一个帖子表明它只发生在包含Asset字段的记录中.我会在有空的时候尝试尝试,虽然在这种情况下我无法避免使用资产,所以它可能没什么帮助.
更新2:我尝试重置我的开发环境,然后重新创建与以前相同的记录.从好的方面来说,CloudKit仪表板中的"重新索引"消息终于消失了.不幸的是,我的代码现在无法找到我的任何记录,即使代码保持不变并且我已经对所有内容进行了三重检查.
我也尝试创建一个没有Asset字段的记录类型(参见上面的第一个更新),但它似乎没有改变任何东西.
我正在构建一个严重依赖CloudKit进行数据同步的应用程序.每次应用程序启动时,它都会捕获使用a在服务器上进行的所有更改CKFetchNotificationChangesOperation.这会成功返回已创建和/或修改的所有对象,但我现在处于这个阶段,我还希望我的应用程序根据这些消息删除记录.
在我的应用程序中,我存储在CoreData中的每个对象也携带该对象的在线表示的recordID.这样我就可以轻松获取需要修改的对象.
删除对象时这似乎很难,因为CloudKit只返回这些对象的recordID,并且不提供我可以用来知道我在CoreData数据库中查找的对象的recordType.
题
在具有多种记录类型的情况下,如何正确处理CloudKit"已删除"通知?
我有一个图像(UIImage,它也是url),我正在尝试将它作为CKAsset发送到CloudKit,但我有这个错误:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Non-file URL'.这是代码:
override func viewDidLoad() {
super.viewDidLoad()
send2Cloud()
}
func send2Cloud() {
let newUser = CKRecord(recordType: "User")
let url = NSURL(string: self.photoURL)
let asset = CKAsset(fileURL: url!)
newUser["name"] = self.name
newUser["photo"] = asset
let publicData = CKContainer.defaultContainer().publicCloudDatabase
publicData.saveRecord(newUser, completionHandler: { (record: CKRecord?, error: NSError?) in
if error == nil {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
print("User saved")
})
} else {
print(error?.localizedDescription)
}
})
}
Run Code Online (Sandbox Code Playgroud)
我有URL,我可以打印,复制并粘贴到我的导航器,它将显示我的图像!所以,我不知道这里发生了什么......
如果我使用UIImage而不是它的URL会更容易吗?因为,正如我之前所说,我有两个!任何帮助非常感谢!多谢你们!!
cloudkit ×10
ios ×5
icloud ×4
swift ×3
core-data ×2
code-signing ×1
ensembles ×1
entitlements ×1
ios8 ×1
macos ×1
objective-c ×1
xcode6 ×1
xcode6.1 ×1