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帐户并安装了应用程序的所有设备上调用。