添加 CloudKit 记录时未调用 didReceiveRemoteNotification

Posted

技术标签:

【中文标题】添加 CloudKit 记录时未调用 didReceiveRemoteNotification【英文标题】:didReceiveRemoteNotification not called when CloudKit record is added 【发布时间】:2016-06-12 07:27:53 【问题描述】:

我想要什么:

我希望我的 ios 应用在添加 CloudKit 记录后执行操作。

我做了什么:

我遵循 Apple 的 info 来执行此操作。

问题:

application:didReceiveRemoteNotification 永远不会被调用。

我试图解决的问题:

我已成功设置订阅,以便在添加 CloudKit 记录时收到通知。我通过application:didRegisterForRemoteNotificationsWithDeviceToken 确认了这一点。

我也确认确实创建了记录。

我可以使用CKQueryOperation 获取记录。

我也试过application:didReceiveRemoteNotification:fetchCompletionHandler,但是这个方法也没有被调用。

我搜索了 Apple 开发者论坛和 ***,但没有找到解决问题的方法。

我能做什么?

创建订阅的代码:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"TRUEPREDICATE"];

    CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"command" predicate:predicate options:CKSubscriptionOptionsFiresOnRecordCreation];


    CKNotificationInfo *notificationInfo = [CKNotificationInfo new];
    notificationInfo.alertLocalizationKey = @"New command.";
    notificationInfo.shouldBadge = YES;

    subscription.notificationInfo = notificationInfo;

    [VMKGlobalVariables.GLOBAL_appDelegate.privateDatabase saveSubscription:subscription
                   completionHandler:^(CKSubscription *subscription, NSError *error) 
                       if (error)
                       
                           // insert error handling
                       
                       else
                       
                           DDLogVerbose(@"Added command subscription successfully.");
                       
                   

     ];

【问题讨论】:

远程通知在模拟器上不起作用。您需要使用真实的设备。是这样吗? 谢谢。是的,我用的是 iPhone 6s。 用有关订阅和添加记录的更多相关信息更新您的问题。并确认您正在谈论在一台设备上添加记录并在第二台设备上获取通知。您不会在用于添加记录的同一设备上收到通知。 我已经添加了添加订阅的代码。命令记录是在 Mac 上创建的,应该在我的 iPhone 上接收。我确认记录确实是创建的:当我在我的 iPhone 上获取所有命令记录时,我可以读取它。 【参考方案1】:

您是否在该行注册了您的应用程序委托。

application.registerForRemoteNotifications()

您的应用委托中是否有类似这样的代码?

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) 
    let notification = CKQueryNotification(fromRemoteNotificationDictionary: userInfo as! [String : NSObject])

    let container = CKContainer(identifier: "iCloud.blah.com")
    let publicDB = container.publicCloudDatabase

    if notification.notificationType == .Query 
        let queryNotification = notification as! CKQueryNotification
        if queryNotification.queryNotificationReason  == .RecordUpdated 
            print("queryNotification.recordID \(queryNotification.recordID)")


        
    

【讨论】:

谢谢。是的,我注册了远程通知。【参考方案2】:

需要加shouldSendContentAvailable

let info = CKSubscription.NotificationInfo()
info.shouldSendContentAvailable = true
subscription.notificationInfo = info

【讨论】:

以上是关于添加 CloudKit 记录时未调用 didReceiveRemoteNotification的主要内容,如果未能解决你的问题,请参考以下文章

IOS:没有互联网连接时未调用 fetchRecordZoneChangesCompletionBlock

tvOS 中的 CloudKit 订阅

如何向 CloudKit 中的现有记录添加字段

Swift 2 和 Cloudkit 的通知

swift Swift - CloudKit - 添加保存删除多个记录

iOS:didCompleteWithError、didReceive 响应未由 URLSession.uploadTask 触发