CloudKit CKSubscription没有通知?

我正在使用CloudKit编写Swift应用程序。 当设备在CloudKit中修改记录时,我希望在其他设备的本地存储中更新相应的记录,而不显示推送通知。

我是否需要在didFinishLaunchingWithOptions调用registerUserNotificationSettings (意味着用户必须接受我的应用程序的通知),即使我不打算显示任何推送通知?

 application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert, categories: nil)) 

是的,你需要调用registerUserNotificationSettings甚至你需要的是后台远程通知。 因此用户将提示通知权限。 没有意义,因为用户不会看到通知,但事实就是如此。

我用它来设置它:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let settings = UIUserNotificationSettings(forTypes: .None , categories: nil) application.registerUserNotificationSettings(settings) application.registerForRemoteNotifications() }

确保在调用CloudKit saveSubscription时提供了shouldSendContentAvailable = true 。 以下代码用于订阅自定义区域:

 let subscription = CKSubscription(zoneID:zoneID, options: CKSubscriptionOptions(rawValue: 0)) let notificationInfo = CKNotificationInfo() notificationInfo.shouldSendContentAvailable = true subscription.notificationInfo = notificationInfo CKContainer.defaultContainer().privateCloudDatabase.saveSubscription(subscription) { subscription, error in } 

您还需要在项目的Xcode下启用后台模式function,并勾选远程通知框。

用户可以转到“设置”应用以停用您应用的通知。 但您仍会收到CloudKit服务器的远程通知触发器。

在AppDelegate中实现以下function以接收远程通知:

 func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {} func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {} func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {} 

在这种情况下,您不需要调用registerUserNotificationSettings

您需要添加Info.plist设置“必需的后台模式”( UIBackgroundModes ),“应用程序下载内容以响应推送通知”( remote-notification )。 并且还调用registerForRemoteNotifications 。 最后,设置notificationInfo.shouldSendContentAvailable = YES; 在您的订阅。

现在,由于您的应用程序正在运行以响应所有通知,因此您需要小心处理错过通知的情况,您可以使用飞行模式来测试,只有最后一次发送。

请注意,一旦您从任何设备创建了订阅, application:didReceiveRemoteNotification:fetchCompletionHandler:将在使用相同iCloud帐户并安装了应用程序的所有设备上调用。