我正处于创建应用程序的早期阶段,我希望保存,同步和备份数据.该应用程序不会将任何文件仅存储在数据库中.它将是iOS 8及以上,因此我可以使用CloudKit.我做了一些研究,但仍不清楚Core Data,iCloud和CloudKit如何协同工作.
据了解,CloudKit只是一种从云端获取和检索数据的方法.CloudKit是一种与iCloud同步数据的不同方式吗?
我的问题是:
如果我确实使用CloudKit,我还需要创建本地核心数据库吗?
如果数据仅存储在云中,则当iOS设备未连接到互联网时,用户可以访问该数据.我读到CloudKit只有有限的缓存.
如果有人能够在离线和在线保存和同步核心数据数据库的过程中分解每种技术的作用.
我目前的理解是:
核心数据用于在本地存储数据
iCloud将数据和存储同步到云中
CloudKit能够在云中存储和管理数据吗?
我希望我提供了足够的信息来解决这个问题.
我不小心在CloudKit中创建了一个新的容器,当我打开仪表板时,它真的很烦人.有什么建议删除吗?在developer.apple.com上,我没有看到容器的删除按钮.
我的iOS和Mac应用程序已经发布到App Store,我的所有用户(包括我自己)都在使用CloudKit生产数据库.我的问题是,有没有办法针对我的开发构建定位生产环境?似乎没有办法将生产环境定位到Mac App Store之外,而对于iOS,只有Ad Hoc分发可以定位到生产环境.
我在模拟器上运行,应用程序工作正常,但一旦在iPhone设备上它崩溃 - 在discoverUserInfo ::发生错误::
discoverUserInfo是从下面Apple的CloudKit示例代码中复制的代码.这是苹果公司的结果,还是我的?
- (void)discoverUserInfo:(void (^)(CKDiscoveredUserInfo *user))completionHandler {
[self.container fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
if (error) {
[self showAlert];
// In your app, handle this error in an awe-inspiring way.
NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), error);
//abort();
} else {
[self.container discoverUserInfoWithUserRecordID:recordID
completionHandler:^(CKDiscoveredUserInfo *user, NSError *error) {
if (error) {
[self showAlert];
// In your app, handle this error deftly.
NSLog(@"An error occured in %@: %@", NSStringFromSelector(_cmd), error);
//abort();
} else {
dispatch_async(dispatch_get_main_queue(), ^(void){
completionHandler(user);
}); …Run Code Online (Sandbox Code Playgroud) 有没有办法让我检查并查看用户在打开应用程序时是否登录到iCloud?如果他们没有登录,我希望能够将他们引导到设置页面,如果他们登录到iCloud并且之前使用过该应用程序 - 我想跳过登录页面....
我查看了Apple的iCloud和Cloudkits文档,但无法找到任何有用的东西!这甚至可能吗?
我目前正在学习如何使用CloudKit Framework以及缺少显示如何同步Core Data和CloudKit的文档或示例.
我观看了所有WWDC视频(2014年,2015年,2016年)专门介绍CloudKit,但没有人告诉我们如何实现与Core Data的同步.我找不到任何新的示例,教程或书籍,展示了如何实现此同步.
我知道使用CloudKit的Operations API(不是Convenience API)和订阅更新是有效的,就像在新的WWDC 2016视频中所说的那样,专用于CloudKit,但使用CoreData进行映射是一个真正的问题.
例如,假设我想创建一个类似于Notes应用程序的应用程序.离线时,用户可以创建他的笔记并与他们一起工作,将他们保存到他的核心数据库中.当设备上线时,应用程序会检查服务器上的更改并将新创建的记录保存到服务器(CloudKit).
当应用程序启动时,它还会从CloudKit获取更改,如果有更改,它会使用新更改更新本地缓存(核心数据).
我希望有一个共同的同步模式.在哪里与Core Data方法同步以及它们应该如何?
非常感谢有关此的任何信息或帮助.
我正在使用Swift 3,Xcode 8,iOS 10.
当我收到有关记录添加的远程通知(didReceiveRemoteNotification被调用)时,我收到以下错误消息:
_BSMachError:(os/kern)无效功能(20)
我已经尝试在论坛和谷歌中找到更多相关信息,但我找不到适合我情况的任何有用的建议.
错误消息是什么意思?我能做些什么呢?
使用自定义 DataTransformers 时,Xcode 13 和 iOS 15 开始发出关于 MissingAllowedClasses 的警告。关于自定义 DataTransformers 的文档非常少,所以我想我应该在这里发布一个问题并回答它。
[general] *** -[NSKeyedUnarchiver _warnAboutPlistType:missingInAllowedClasses:] allowed unarchiving safe plist type ''NSString' (0x1dc9a7660) [/System/Library/Frameworks/Foundation.framework]', even though it was not explicitly included in the client allowed classes set: '{(
"'NSArray' (0x1dc99c838) [/System/Library/Frameworks/CoreFoundation.framework]"
)}'. This will be disallowed in the future.
Run Code Online (Sandbox Code Playgroud)
请注意,在警告消息中,它指定了“NSArray”,并且缺少类型“NSString”。
使用CloudKit,您可以专注于客户端应用程序开发,并让iCloud 无需编写服务器端应用程序逻辑.CloudKit为您提供身份验证,私有和公共数据库,结构化和资产存储服务 - 所有这些服务都是免费的,具有很高的限制.
您无法上传任何代码以在Apple的服务器上运行?
我听说它与Google App Engine和其他云计算平台进行了比较,但是如果没有能力运行自己的代码,那么整个事情是不是很有限而且不具有可比性?
例如,如果我想构建一个新闻应用程序,定期推送用户感兴趣的主题的故事,那么这不能仅使用CloudKit来完成,因为我需要在服务器上进行预定的作业和数据处理.
有什么想法吗?
Apple发布了一种新的方法来对服务器到服务器的CloudKit进行身份验证.https://developer.apple.com/library/content/documentation/DataManagement/Conceptual/CloudKitWebServicesReference/SettingUpWebServices.html#//apple_ref/doc/uid/TP40015240-CH24-SW6
我尝试对CloudKit和此方法进行身份验证.起初我生成了密钥对并将公钥提供给CloudKit,到目前为止没问题.
我开始构建请求标头.根据文档,它应该如下所示:
X-Apple-CloudKit-Request-KeyID: [keyID]
X-Apple-CloudKit-Request-ISO8601Date: [date]
X-Apple-CloudKit-Request-SignatureV1: [signature]
Run Code Online (Sandbox Code Playgroud)
文件说:
在步骤1中创建的签名.
第1步说:
连接以下参数并用冒号分隔它们.
[Current date]:[Request body]:[Web Service URL]
我问自己"为什么我必须生成密钥对?".
但第2步说:
使用您的私钥计算此消息的ECDSA签名.
也许他们的意思是用私钥签名连接签名并将其放入标题?无论如何我试过两个......
我对此(无符号)签名值的示例如下所示:
2016-02-06T20:41:00Z:YTdkNzAwYTllNjI1M2EyZTllNDNiZjVmYjg0MWFhMGRiMTE2MjI1NTYwNTA2YzQyODc4MjUwNTQ0YTE5YTg4Yw==:https://api.apple-cloudkit.com/database/1/[iCloud Container]/development/public/records/lookup
Run Code Online (Sandbox Code Playgroud)
请求体值是SHA256哈希值,然后是base64编码的.我的问题是,我应该用":"连接,但是网址和日期也包含":".这是对的吗?(我还尝试对URL进行URL编码并删除日期中的":").
接下来,我用ECDSA签署了这个签名字符串,将其放入标题并发送.但我总是得到401"身份验证失败".为了签名,我使用ecdsa python模块,使用以下命令:
from ecdsa import SigningKey
a = SigningKey.from_pem(open("path_to_pem_file").read())
b = "[date]:[base64(request_body)]:/database/1/iCloud....."
print a.sign(b).encode('hex')
Run Code Online (Sandbox Code Playgroud)
也许python模块无法正常工作.但它可以从私钥生成正确的公钥.所以我希望其他功能也能奏效.
有没有人设法使用服务器到服务器方法对CloudKit进行身份验证?它是如何正常工作的?
编辑:正确的python版本工作
from ecdsa import SigningKey
import ecdsa, base64, hashlib
a = SigningKey.from_pem(open("path_to_pem_file").read())
b = "[date]:[base64(sha256(request_body))]:/database/1/iCloud....."
signature = a.sign(b, hashfunc=hashlib.sha256, sigencode=ecdsa.util.sigencode_der)
signature = base64.b64encode(signature)
print signature #include this into the header
Run Code Online (Sandbox Code Playgroud)