【问题标题】:How to handle push notification allow from settings in iOS如何从iOS中的设置处理推送通知允许
【发布时间】:2017-07-27 06:15:07
【问题描述】:

我已经在我的应用程序中集成了推送通知。我在我的AppDelegate 中获取设备令牌,并在我的LoginViewController 中发送到服务器。当用户单击“不允许”时出现警报时,我没有调用我的设备注册服务。但我不知道如何处理这种情况。

如果用户在推送通知警报中单击不允许并进入应用程序,则他打开设备设置并启用推送通知。

在这种情况下,我该如何调用我的设备注册服务? 请帮我 谢谢

【问题讨论】:

  • 每次注册应用时都会调用设备注册方法来获取通知。因此设置更改后,当您再次启动应用程序并注册接收通知时,将调用该方法。
  • @lostInTransit 谢谢。如果用户更改设置并重新打开应用程序,当它从后台转到前台时,是否也可以注册?
  • 你必须确保你调用了registerForRemoteNotifications方法

标签: ios swift3 apple-push-notifications


【解决方案1】:

实际上并没有委托来观察用户更改了推送通知的状态。

但是你可以在applicationDidBecomeActive:这样的方法中使用这个方法来检查

目标 C:

iOS 8 及更高版本

   if (![[UIApplication sharedApplication] isRegisteredForRemoteNotifications]){
        NSLog(@"push notifications are disabled");
}

适用于 iOS 10

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

if (types == UIRemoteNotificationTypeNone) {
    NSLog(@"push notifications are disabled");
}

斯威夫特:

iOS 8 及更高版本

let isRegisteredForRemoteNotifications = UIApplication.shared.isRegisteredForRemoteNotifications
if isRegisteredForRemoteNotifications {
    NSLog(@"push notifications are enabled");
} else {
    NSLog(@"push notifications are disabled");
}

适用于 iOS 10

let current = UNUserNotificationCenter.current()

current.getNotificationSettings(completionHandler: { (settings) in

    if settings.authorizationStatus == .denied {
    NSLog(@"push notifications are disabled");
    }
})

希望对你有帮助。

【讨论】:

    【解决方案2】:

    注意

    设置中的任何更改都会重新启动应用程序。 因此,如果用户从设置中打开通知,那么您的应用程序将重新启动,您将在 app-delegate 中获得设备令牌,您可以将其发送到您的服务器。如果您的登录信息保存在本地,并且您在登录 api 中发送 device_token,那么您需要使用单独的服务将 device_token 发送到服务器。

    【讨论】:

    • 但是当我打开应用程序并更改设置时,它仍然在后台运行。似乎没有重新启动
    【解决方案3】:

    在 AppDelegate 中

    如果用户允许通知,令牌将在下面的函数中返回,您将调用您的服务发送到您的服务器

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    }
    

    如果用户不允许通知,您将在下面的函数中收到错误

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    
    }
    

    【讨论】:

    • 是的,我在我提到的场景中要问什么......然后如何在不关闭和重新打开应用程序的情况下获得通知,因为我没有调用我的服务设备注册服务,因为用户在提示时不允许跨度>
    • 当您打开应用程序时,您总是使用真实设备在 func didRegisterForRemoteNotificationsWithDeviceToken 中收到令牌,您会将令牌发送到您的服务器,当您向用户发送通知时,如果用户允许通知,设备会自动显示通知并且不会显示用户是否不通知
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多