Tag: cloudkit

CloudKit在不同的iCloud帐户之间共享数据,但不与所有人共享

在我的应用程序中,我想通过iCloud与其他iCloud用户共享数据,但不是与整个世界共享,而是与其他iCloud用户共享。 我想过这种方法可行,但我不确定它是否会起作用,如果我忘记或误解了一些事情。 假设用户A希望能够与其他iCloud用户共享一个string,但不能与所有人共享。 因此,用户A想要将“Hello World”分享给用户B,而不是分享给用户C,而不是分享给用户D. 所以我的应用程序有一个公共数据库和一个loggingtypes是每个人都一样。 在该loggingtypes中,有一个stringtypes的字段也是相同的。 现在,用户A将logging“Hello World”保存到iCloud。 这里有个诀窍:我会为string添加一个唯一的标识符,比如“Hello World1230ABD6-3C61-1234-802E-D866F09AC012”,并将其上传到iCloud。 现在,用户A需要告诉用户他希望与他的UUID共享数据,所以用户A告诉用户B.现在,用户A的UUID将被添加为用户B的CKSubscription的谓词。 这将允许用户B从用户A获取string,但用户C或用户D不会接收到CKNotification,因为他们的CKSubscription中没有用户A的UUID。 这是否正常工作? 还是有另一种devise模式,允许通过iCloud与其他iCloud账户共享/同步,但不能与所有人(公众)共享/同步? PS我想分享的数据不太敏感,所以不需要非常安全。 数据对每个人(公共)都不是很有意思,所以只需要select其他的iCloud账户就可以共享数据。 我很感激任何想法或提示如何实现这一点! 谢谢

如何基于CKQueryNotification知道要删除的实体?

我在Cloudkit中有两种loggingtypes: 服务和目标 ,它对应于coredata模型中的实体: Service和Goal 。 我可以创build,更新或删除它们。 问题是关于删除。 我使用CloudKit获取待处理的通知。 我可以确定基于queryNotificationReason属性的是什么样的操作。 如果是删除,则无法确定应使用相关标识从核心数据库中删除哪种财产。 任何方式如何做到这一点? 到目前为止,我做了这样的recordID我从CKQueryNotification获取: class func delete(with recordID: CKRecordID) { MagicalRecord.save({ context in if let service = Service.find(withIdentifier: recordID.recordName, in: context) { service.mr_deleteEntity(in: context) } else if let goal = Goal.find(withIdentifier: recordID.recordName, in: context) { goal.mr_deleteEntity(in: context) } }) }

NSUbiquityIdentityDidChangeNotification不起作用?

我正在创build一个cloudkit应用程序,并一直在尝试多种方式来获取NSUbiquityIdentityDidChangeNotification ,但我从来没有能够得到这个通知。 我已经尝试了委托didFinish和viewDidLoad方法下的这些代码版本。 我试图从另一个通知 – UIApplicationDidBecomeActiveNotification调用它。 我也把import Foundation放在文件的顶部。 这是我尝试过的基本代码: NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleIdentityChanged:", name: NSUbiquityIdentityDidChangeNotification, object: nil) //这个也是我从另一个post里试过的: var localeChangeObserver = NSNotificationCenter.defaultCenter().addObserverForName(NSUbiquityIdentityDidChangeNotification, object: nil, queue: NSOperationQueue.mainQueue()) { _ in println("The user's iCloud login changed: should refresh all user data.") } 有谁知道如何让这个通知只适用于swift的cloudkit应用程序? 我真的只想检测iCloud状态更改,然后在发生更改时启动获取userID 。 不是我需要访问ubiquityIdentityToken ,但我想知道为什么不存储令牌,每次应用程序开始比较当前令牌和本地存储中的令牌,看看它是不是一个不同的帐户或零? 因此,为什么需要通知? 另外,只有打开“我不需要的iCloud文档”才能获得令牌的代码。 有没有人知道有一个社交应用程序不需要它打开的影响? 还有没有启用iCloud文档获得令牌的另一种方法? 这是我用来获取令牌并放置在委托didFinish方法中的代码,但仅在打开iCloud文档时才有效: var token = NSFileManager.defaultManager().ubiquityIdentityToken println("token is […]

CloudKitlogging保存进度

我想保存事件和图像(事件)logging。 我想在UI中显示上传进度。 事件是文本和位置的小对象。 图像是与UIImage照片的大对象。 图像logging是数组中的第一项,事件是第二项。 我创buildCKModifyRecordsOperation并将两个CKRecord对象设置为recordsToSave 比我设置perRecordProgressBlock : [operation setPerRecordProgressBlock:^(CKRecord *record, double progress) { NSLog(@"#record: %@ progress: %f", record.recordType, progress); }]; 和perRecordCompletionBlock : [operation setPerRecordCompletionBlock:^(CKRecord *record, NSError *error) { NSLog(@"#recordSaved: %@ e: %@", record.recordType, error); }]; 我希望能看到很多像两行logging一样的行: #record: ImageRecord progress: 0.050000 #record: ImageRecord progress: 0.100000 #record: ImageRecord progress: 0.150000 … #record: ImageRecord progress: 1.000000 #recordSaved: […]

带有OR返回错误的NSPredicate

我有以下谓词的问题: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(creatorUserRecordID == %@) OR (toUser == %@)", userId, userId]; 当我在查询中使用它CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Message" predicate:predicate]; 我有一个错误,说:'CKException',原因:'意外的expression'。 当我这样分别使用这两个: NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"(creatorUserRecordID == %@)", userId]; NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"(toUser == %@)", userId]; 然后用这些谓词之一进行查询,它工作正常。 我也尝试使用NSCompoundPredicate,但结果总是相同的…任何想法?

Cloudkit我们可以修改公共数据库的数据

我刚刚通过这个链接cloudkit中的云套件文档,但没有明确要修改公共数据库的数据库logging。 根据这个在cloudkit框架中的描述。 使用公共数据库 ,默认情况下图像中指定的数据是世界可读的,拥有者可写。 这意味着只有拥有者可以修改他的数据,其他用户只能读取? 假设使用公共数据库,用户A可以访问用户B的logging,但用户A可以修改同一应用程序中的用户B的logging。 请build议。 谢谢。

iOS,CloudKit – 当我的应用程序启动时,我需要做一个抓取吗?

我正在设置iCloud更改通知的注册。 说一个新的设备被添加到icloud帐户,我只是想知道该设备将如何获得私人数据库logging。 我需要做一个一个查询? 我希望通知会在其他时间使用。

如何在创build新logging时使用CloudKit在没有延迟的情况下更新TableView中的数据

在我的应用程序中有2个视图控制器。 第一个“MainViewController”显示了从私有CloudKit数据库中获取的CKRecords字段的tableView。 在VC的viewWillAppear方法中,我从CloudKit获取logging并重新加载tableview的数据,以显示用户以前保存在CloudKit中的最新获取结果。 第二个视图控制器“CreateRecordViewController”用于创buildCKRecords并将其保存到CloudKit的专用数据库。 所以我在CreateRecordViewController中创buildlogging并在MainViewController中显示它们。 问题是:当我在CreateRecordViewController创buildlogging时,它保存在CloudKit服务器上,但closures此CreateRecordViewController并转到MainViewController后,tableview并不总是及时更新。 这是我CreateRecordViewController中保存logging的代码: CloudKitManager.sharedInstance.privateDatabase.save(myRecord) { (savedRecord, error) -> Void in if error == nil { print("successfully saved record code: \(savedRecord)") } else { // Insert error handling print("error Saving Data to iCloud: \(error.debugDescription)") } } logging保存后,我closuresCreateRecordViewController并查看MainViewController。 正如我之前在viewWillAppear of MainViewController中所说的,我检查iCloud是否可用,如果可用,我使用CloudKit中的查询获取所有logging,并在tableView中显示它们。 override func viewWillAppear(_ animated: Bool) { CKContainer.default().accountStatus { (accountStatus, error) in switch […]

CloudKit复合查询(带有OR的查询)

我想用两个字段的OR来​​查询CloudKit。 但我找不到如何做到这一点。 我做的是: NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"(creatorUserRecordID == %@)", userId]; NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"(toUser == %@)", userId]; NSCompoundPredicate *compPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[predicate1, predicate2]]; CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Message" predicate:compPredicate]; 但不幸的是,CKQuery不支持OR查询(如文档中所写)我可以通过其他方式实现这种效果吗?

字段'___recordID'不标记为可查询

我尝试下载recordID与特定recordType不匹配的所有logging。 但是我得到一个错误。 任何想法? 我以为我可以标记为只能手动添加字段查询。 <CKError 0x15df2a10: "Invalid Arguments" (12/2015); server message = "Field '___recordID' is not marked queryable"; uuid = ECDD0C97-550F-4DD5-942D-AF4DF8917EEB; container ID = "iCloud.com.kukodajanos.Movie-Buffs"> let query = CKQuery(recordType: "UserSetting", predicate: NSPredicate(format: "recordID != %@", CKRecordID(recordName: loggedInUserRecordName!)))