发送到后台的本地通知在模拟器中有效,但在设备上无效
Local notifications sent to background works in simulator but not on device
在模拟器中我能够得到我想要的确切结果:当我触发通知并且我的模拟器 phone 被锁定时,通知被推送到手表。
这曾经在设备上工作(我的 iPhone 6 在 iOS 9.1 上,Watch 在 watchOS 2.0 上)。由于某种原因它停止工作,我不知道如何调试问题。
所以在设备上,我通过转到主屏幕并锁定 phone 并确保我的手表处于睡眠状态来确保该应用程序处于后台。触发通知时,什么也不会发生。当我打开应用程序时,通知终于被触发了。 IE。如果我触发 3 个通知,其中 none 个会注册,直到我将应用程序重新打开到前台。这不是它在模拟器中的工作方式(模拟器具有上述正确行为)。
通知是由我更改存储在我的 Firebase 数据库中的文本对象触发的。更改调用 sendNotification 函数。同样,这在模拟器中工作得非常好,并且曾经在设备上工作,但由于某种原因不再工作了。
在应用委托中我有:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert, categories: nil))
// Setting up Local Notification
let assistAction = UIMutableUserNotificationAction()
assistAction.activationMode = UIUserNotificationActivationMode.Background
assistAction.identifier = categoryID
assistAction.title = "Assist"
assistAction.authenticationRequired = false
assistAction.destructive = false
// Category
let assistCategory = UIMutableUserNotificationCategory()
assistCategory.identifier = categoryID
assistCategory.setActions([assistAction], forContext: UIUserNotificationActionContext.Default)
// Only way to get this to work with parameter
let categories = NSSet(object: assistCategory)
// Settings
let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: categories as? Set<UIUserNotificationCategory>)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
// UIApplication.sharedApplication().registerForRemoteNotifications()
return true
}
然后在我的视图控制器中我有:
func sendNotification(customerName: String, helpText: String) {
// Local Notification
let notification = UILocalNotification()
notification.alertBody = "\(customerName) \(helpText)"
notification.soundName = UILocalNotificationDefaultSoundName
notification.fireDate = NSDate()
notification.category = categoryID
UIApplication.sharedApplication().presentLocalNotificationNow(notification)
print("Sent notification");
}
模拟器的工作方式似乎与设备不同。奇怪的是,模拟器本地通知就像远程推送通知一样。
我最终放弃了尝试在应用程序处于设备后台时显示本地通知,因为我了解到这不是预期的行为。
正确的解决方案是只设置远程推送通知,我使用 Parse 来做到这一点。现在它按预期工作。我有一个使用 Parse REST API 向 Parse 发送 POST 请求的网络服务器,然后我的 iOS 应用程序被设置为接收远程推送通知,这些通知现在显示在我的手表上当我的 phone 被锁定时。
在模拟器中我能够得到我想要的确切结果:当我触发通知并且我的模拟器 phone 被锁定时,通知被推送到手表。
这曾经在设备上工作(我的 iPhone 6 在 iOS 9.1 上,Watch 在 watchOS 2.0 上)。由于某种原因它停止工作,我不知道如何调试问题。
所以在设备上,我通过转到主屏幕并锁定 phone 并确保我的手表处于睡眠状态来确保该应用程序处于后台。触发通知时,什么也不会发生。当我打开应用程序时,通知终于被触发了。 IE。如果我触发 3 个通知,其中 none 个会注册,直到我将应用程序重新打开到前台。这不是它在模拟器中的工作方式(模拟器具有上述正确行为)。
通知是由我更改存储在我的 Firebase 数据库中的文本对象触发的。更改调用 sendNotification 函数。同样,这在模拟器中工作得非常好,并且曾经在设备上工作,但由于某种原因不再工作了。
在应用委托中我有:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert, categories: nil))
// Setting up Local Notification
let assistAction = UIMutableUserNotificationAction()
assistAction.activationMode = UIUserNotificationActivationMode.Background
assistAction.identifier = categoryID
assistAction.title = "Assist"
assistAction.authenticationRequired = false
assistAction.destructive = false
// Category
let assistCategory = UIMutableUserNotificationCategory()
assistCategory.identifier = categoryID
assistCategory.setActions([assistAction], forContext: UIUserNotificationActionContext.Default)
// Only way to get this to work with parameter
let categories = NSSet(object: assistCategory)
// Settings
let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: categories as? Set<UIUserNotificationCategory>)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
// UIApplication.sharedApplication().registerForRemoteNotifications()
return true
}
然后在我的视图控制器中我有:
func sendNotification(customerName: String, helpText: String) {
// Local Notification
let notification = UILocalNotification()
notification.alertBody = "\(customerName) \(helpText)"
notification.soundName = UILocalNotificationDefaultSoundName
notification.fireDate = NSDate()
notification.category = categoryID
UIApplication.sharedApplication().presentLocalNotificationNow(notification)
print("Sent notification");
}
模拟器的工作方式似乎与设备不同。奇怪的是,模拟器本地通知就像远程推送通知一样。
我最终放弃了尝试在应用程序处于设备后台时显示本地通知,因为我了解到这不是预期的行为。
正确的解决方案是只设置远程推送通知,我使用 Parse 来做到这一点。现在它按预期工作。我有一个使用 Parse REST API 向 Parse 发送 POST 请求的网络服务器,然后我的 iOS 应用程序被设置为接收远程推送通知,这些通知现在显示在我的手表上当我的 phone 被锁定时。