我正在用CloudKit编写一个Swift应用程序。当设备在CloudKit中修改记录时,我希望在其他设备的本地存储中更新相应的记录,而不显示推送通知。
我是否需要在registerUserNotificationSettings中调用didFinishLaunchingWithOptions (意味着用户必须接受我的应用程序的通知),即使我不打算显示任何推送通知?
application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert, categories: nil))发布于 2015-11-27 08:31:07
是的,您确实需要调用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下为您的项目启用后台模式功能,并勾选“远程通知”框。
用户可以转到Settings应用程序来禁用应用程序的通知。但是您仍然会收到CloudKit服务器的远程通知触发器。
在AppDelegate中实现以下函数以接收远程通知:
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {}
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {}
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {}发布于 2016-02-11 00:36:23
在这种情况下,您不需要调用registerUserNotificationSettings。
您需要添加Info.plist设置“必需的后台模式”(UIBackgroundModes),“应用程序下载内容以响应推送通知”(remote-notification)。也叫registerForRemoteNotifications。最后,在订阅上设置notificationInfo.shouldSendContentAvailable = YES;。
现在,由于您的应用程序正在运行以响应所有通知,因此您需要小心处理错过通知的情况,因此您可以使用飞机模式来测试,只有最后一个通知是交付的。
注意,一旦您从任何设备创建了订阅,将在所有使用相同iCloud帐户并安装了应用程序的设备上调用iCloud。
https://stackoverflow.com/questions/33934370
复制相似问题