【问题标题】:CloudKit's subscriptions not workingCloudKit 的订阅不起作用
【发布时间】:2016-10-15 19:05:01
【问题描述】:

每当用户在我的应用中创建新事件时,我都会尝试发送通知。我可以成功设置通知,因为我可以在我的云套件仪表板中看到它,但是当有人创建事件时,什么都没有发生......

事情是:在 ViewController1 中,用户选择事件的名称和参与者,而在 ViewController2 中他继续选择其他一些东西。我想说的是,我不需要在我的应用程序中上传任何视觉细节(当通知到达时),我只希望当通知出现时,用户直接转到 ViewController2。这是我的代码:

应用代理:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)

    application.registerUserNotificationSettings(settings)
    application.registerForRemoteNotifications()

    return true
}

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {

    let cloudKitNotification = CKNotification(fromRemoteNotificationDictionary: userInfo as! [String : NSObject])

    if cloudKitNotification.notificationType == CKNotificationType.Query {


        NSNotificationCenter.defaultCenter().postNotificationName("notinoti", object: nil)

    }
}

ViewController1:

func setupCloudKitSubscription() {

    let userDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.boolForKey("subscribed") == false {

        let predicate = NSPredicate(format: "TRUEPREDICATE", argumentArray: nil)
        let subscription = CKSubscription(recordType: "Event", predicate: predicate, options: CKSubscriptionOptions.FiresOnRecordCreation)

        let notificationInfo = CKNotificationInfo()
        notificationInfo.alertLocalizationKey = "New event"
        notificationInfo.shouldBadge = true
        notificationInfo.desiredKeys = ["name"]

        subscription.notificationInfo = notificationInfo

        let publicData = CKContainer.defaultContainer().publicCloudDatabase
        publicData.saveSubscription(subscription, completionHandler: { (subscription, error) in

            if error != nil {
                print(error?.localizedDescription)
            } else {
                userDefaults.setBool(true, forKey: "subscribed")
                userDefaults.synchronize()
            }
        })
    }
}

ViewController2:

var currentRecord: CKRecord?

override func viewDidLoad() {
    super.viewDidLoad()

    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        NSNotificationCenter.defaultCenter().addObserver(self , selector: Selector("fetchRecord"), name: "notinoti", object: nil)
    })
}

func fetchRecord(recordID: CKRecordID) -> Void {

    let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase

    publicDatabase.fetchRecordWithID(recordID, completionHandler: ({record, error in
        if let err = error {
            dispatch_async(dispatch_get_main_queue()) {
                print(err.localizedDescription)
            }
        } else {
            dispatch_async(dispatch_get_main_queue()) {
                self.currentRecord = record
                //Now do something with the data
            }
        }
    }))
}

【问题讨论】:

    标签: ios swift cloudkit subscriptions


    【解决方案1】:

    佩德罗,

    不知道它是否重要,但我的“工作”订阅行显示。我的代码中有订阅 ID?

      let subID = String(NSUUID().UUIDString)
      let predicateY = NSPredicate(value: true)
      let subscription = CKSubscription(recordType: "Blah", predicate: predicateY, subscriptionID: subID, options: [.FiresOnRecordUpdate, .FiresOnRecordDeletion])
    

    在玩了一段时间后,我模糊地记得它无法正常工作,此时我在云套件仪表板上重置了数据库并重新订阅,它再次工作。

    【讨论】:

    • 您好,感谢您的帮助!那么,您建议我只重置仪表板并且应该可以工作吗??
    • 是的,也许这会解决它;请注意,我的订阅行也包含一个订阅 ID,您使用的调用稍微简单一些。
    • 我尝试重置仪表板,但仍然无法正常工作...我现在将使用 subs ID 重做代码。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多