CloudKit CKSubscription 没有通知?

CloudKit CKSubscription without notifications?

我正在用 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 下为您的项目启用后台模式功能,并勾选远程通知框。

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

在您的 AppDelegate 中实现以下功能以接收远程通知:

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 设置 "Required background mode" (UIBackgroundModes), "App downloads content in response to push notifications" (remote-notification)。并且还调用了registerForRemoteNotifications。最后,在您的订阅上设置 notificationInfo.shouldSendContentAvailable = YES;

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

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