【问题标题】:CloudKit CKSubscription without notifications?CloudKit CKSubscription 没有通知?
【发布时间】:2016-02-29 07:08:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios swift cloudkit


    【解决方案1】:

    在这种情况下,您无需致电registerUserNotificationSettings

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

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

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

    【讨论】:

    • 这是正确答案。没有提示用户允许推送通知,但仍会收到需要由 AppDelegate 处理的通知,但回调是 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler。答案中上面提到的回调是错误的,但可能是因为这是一个非常古老的答案。
    • 如果不想在应用程序处于后台时收到通知并且也不显示警报,则无需添加UIBackgroundModes 和关联的子键remote-notification。在这种情况下,应用程序在AppDelegate 中的常用远程通知处理程序中获取通知,但仍然没有用户接受提示以启用推送通知。所以根据需要有两种方式。所以基本上不调用 registerUserNotificationSettings 适用于 CloudKit 通知的特殊情况。
    【解决方案2】:

    是的,您确实需要致电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]) {}
    

    【讨论】:

    • 即使推送来自 CloudKit,我也会因为触发了 didReceiveRemoteNotification 而忽略了这一点。 notificationInfo.shouldSendContentAvailable = true 但是一旦添加,我的无声通知就像一个魅力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 2018-08-29
    相关资源
    最近更新 更多