标签: cloudkit

CloudKit - 如何保存记录如果不存在

我正在尝试创建一个包含唯一值的记录类型,并将作为另一个记录类型的目标引用对象.例如,录制类型 - 电影将包含用户提交的唯一电影列表.而且FavoriteMovies将包含用户参考和电影参考.用户可以从现有电影列表中进行选择,也可以向其中添加新电影.

如果我创建一个新的电影记录,而另一个用户创建一个具有相同名称的新记录(在我检索电影列表之后,但在我尝试添加新电影之前),则会出现问题.这两个新记录被认为是具有不同记录ID的不同记录.这意味着一旦我保存了新的,就会有两个带有保存名称的电影实例.

我无法找到一种方法来对"电影记录类型"执行"如果不存在"类型操作.我可以在查询的completionBlock中进行保存,但这两个操作不是原子事务来保证唯一性.据我所知,这也是与链接的情况下CKQueryOperationCKModifyRecordsOperation.

是否只有在单个事务中不存在该值时才能插入记录?

ios icloud ios8 cloudkit

6
推荐指数
1
解决办法
2538
查看次数

CloudKit推送通知订阅无效

我正在尝试使用CloudKit订阅推送通知.我收到这个错误:

<CKError 0x170c5b1e0: "Unknown Item" (11/2003); server message = "could not find required field fieldID="25""
Run Code Online (Sandbox Code Playgroud)

从这段代码:

let subscription = CKSubscription(recordType: "PlayerData", predicate: NSPredicate(format: "TRUEPREDICATE"), options: CKSubscriptionOptions.FiresOnRecordCreation)
let notificationInfo = CKNotificationInfo()
notificationInfo.shouldBadge = false
subscription.notificationInfo = notificationInfo
PublicDb.saveSubscription(subscription, completionHandler: { (returnedSubscription: CKSubscription!, error: NSError!) in
     println("\(error)")
})
Run Code Online (Sandbox Code Playgroud)

但我没有一个名为"fieldID"的字段,也没有在我的整个项目中对它有任何引用.我不知道25来自哪里.如果我更改记录类型和/或NSPredicate,它仍然会发生.

我也试过设置这个,但没有

notificationInfo.shouldSendContentAvailable = true
Run Code Online (Sandbox Code Playgroud)

这曾经适合我,但现在我不能让它工作了.好像我的数据库在某个地方被破坏了.我尝试删除记录类型并重新创建但没有运气.

ios swift cloudkit

6
推荐指数
2
解决办法
1337
查看次数

如何使用swift上传带云套件的图片?

如何使用swift上传和加载来自云套件的图像?

我使用什么属性类型?

在此输入图像描述

我用什么代码?这是我目前使用的代码......

func SaveImageInCloud(ImageToSave: UIImage) {
        let newRecord:CKRecord = CKRecord(recordType: "ImageRecord")
        newRecord.setValue(ImageToSave, forKey: "Image")

        if let database = self.privateDatabase {


            database.saveRecord(newRecord, completionHandler: { (record:CKRecord!, error:NSError! ) in

                if error != nil {

               NSLog(error.localizedDescription)

                }


                else {

                    dispatch_async(dispatch_get_main_queue()) {

println("finished")

                    }
                }
        })
        }
Run Code Online (Sandbox Code Playgroud)

xcode ios icloud swift cloudkit

6
推荐指数
1
解决办法
5675
查看次数

记录更新时CloudKit推送通知停止工作

编辑:今天在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)

apple-push-notifications ios cloudkit cksubscription

6
推荐指数
1
解决办法
694
查看次数

CloudKit订阅CKSubscriptionOptionsFiresOnRecordUpdate不起作用

我创建了一个创建和更新订阅.创作总是很完美,我从其他设备获得推送通知.更新发送到iCloud,您可以在那里看到它们,但推送通知不会传递给设备.

- (void)subscribeWithType:(NSString*)type completionHandler:(void(^)(CKSubscription *))completionHandler
{
    if (self.enabled == NO || _available == NO || _reachability.currentReachabilityStatus != ReachableViaWiFi)
    {
        if (completionHandler)
        {
            dispatch_async(dispatch_get_main_queue(), ^{
                completionHandler(nil);
            });
        }
        return;
    }

    NSPredicate *truePredicate = [NSPredicate predicateWithValue:YES];

    CKSubscriptionOptions options = CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdate;

    CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:type
                                                                    predicate:truePredicate
                                                               subscriptionID:[CTUtils GetUUID]
                                                                      options:options];

    CKNotificationInfo *notification = [[CKNotificationInfo alloc] init];
    notification.shouldSendContentAvailable = YES;

    notification.alertLocalizationKey = @"";
    notification.shouldBadge = NO;

    subscription.notificationInfo = notification;

    CKModifySubscriptionsOperation *operation = [[CKModifySubscriptionsOperation alloc] initWithSubscriptionsToSave:@[subscription] subscriptionIDsToDelete:nil];

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    __block …
Run Code Online (Sandbox Code Playgroud)

push-notification apple-push-notifications ios cloudkit cksubscription

6
推荐指数
0
解决办法
385
查看次数

CloudKit - 具有依赖性的CKQueryOperation

我刚刚开始使用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)

ios swift cloudkit

6
推荐指数
1
解决办法
1444
查看次数

在什么情况下发送了CloudKit错误CKErrorIncompatibleVersion?

文件说:

CKErrorIncompatibleVersion

应用版本低于允许的最低版本.

适用于iOS 8.0及更高版本.

但是没有详细说明哪些上下文会导致收到此错误.据我所知,没有办法设置最低允许的应用版本.

ios cloudkit watchkit tvos

6
推荐指数
0
解决办法
78
查看次数

如何用zoneID和recordID初始化CKRecord?

我目前正在构建一个同步Core Data记录的解决方案CloudKit.

我需要帮助才能找到我想要做的事情CKRecord是可行的.

我检查过Apple CloudKit文档,在网上进行实验和搜索,但是我找不到我想要的那种答案.

我想初始化CKRecord,zoneID并且recordID我将提供init方法.
初始化器似乎迫使我在两者之间做出选择.我想创建自己的ZoneID(不使用默认值),并设置 recordID而不是自动生成它.

这可能吗?

ios cloudkit

6
推荐指数
1
解决办法
993
查看次数

如果用户未启用iCloud Drive,CloudKit的应用程序会受到哪些限制

如果用户未打开iCloud Drive,哪些CloudKit服务不可用?

是否有办法从应用程序打开iCloud Drive?

我想从公共容器下载记录应该可以工作,无论iCloud Drive,只有在启用时才写入容器?!

ios cloudkit icloud-drive

5
推荐指数
2
解决办法
941
查看次数

CloudKit记录版本控制

我正在比较 CKRecord 的版本,使用recordChangeTag,我看到随着时间的推移,值从n9(2 个字符)更改为1c1(3 个字符)。

苹果文档中:

在您自己的代码中,您可以使用更改标记来区分同一记录的两个不同版本。

我想问一下:

  1. 该字段中的字符串值是递增的吗?
  2. 比较记录顺序的正确方法是什么?

macos ios cloudkit macos-sierra

5
推荐指数
1
解决办法
541
查看次数