首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用户授予接收推送通知的权限时未调用

用户授予接收推送通知的权限时未调用
EN

Stack Overflow用户
提问于 2020-03-26 15:41:37
回答 1查看 35关注 0票数 0

我在AppDelegate中设置,如下所示:

代码语言:javascript
运行
复制
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let token = deviceToken.map { String(format:"%02.2hhx", $0) }.joined()
        print("didRegisterForRemoteNotificationsWithDeviceToken got called - Token is: \(token)")
        // delegate might get called even before an authtoken has been set for the user. Return in such cases:
        guard UserDefaults.standard.string(forKey: "authtoken") != nil else {return}

        // otherwise continue:
        if (token != UserDefaults.standard.string(forKey: "apnsToken")) {
            self.apiService.setAPNSToken(apnsToken: token, completion: {result in
                switch result {
                case .success(let resultString):
                    DispatchQueue.main.async {
                        UserDefaults.standard.set(token, forKey: "apnsToken")
                        print(resultString, " Token is: \(token)")
                    }
                case .failure(let error):
                    print("An error occured \(error.localizedDescription)")
                }
            })
        } else {
            print("User is registered for Push Notifications. Token did not change and is: \(token)")
        }

    }

我请求用户允许在我的一个视图控制器中发送推送通知,如下所示:

代码语言:javascript
运行
复制
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
            DispatchQueue.main.async {
                if (granted) {
                    UserDefaults.standard.set(true, forKey: "pushNotificationsEnabled")
                }
                print("permission granted?: \(granted)")
            }
        }

我想都是相当标准的。我的困惑/问题是:不会在用户交互时被调用--也就是说,只要用户点击“允许推送通知”,它就会被调用,这样apns令牌就会存储在我的后端。但事实并非如此,当我关闭应用程序并重新启动它时,会调用并将令牌存储在后端。

当用户点击“允许推送通知”后,我需要做什么才能访问令牌并将其存储在后台?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-26 16:10:14

当您的用户确认他们想要通知时,您应该调用UIApplication.shared.registerForRemoteNotifications()。看起来你不是在这么做。

你可以这样做

代码语言:javascript
运行
复制
UNUserNotificationCenter.current()
  .requestAuthorization(options: [.alert, .sound, .badge]) {
    [weak self] granted, error in

    print("Permission granted: \(granted)")
    guard granted else { return }
    self?.getNotificationSettings()
}

然后,getNotificationSettings在注册远程通知之前检查它是否已被授权。

代码语言:javascript
运行
复制
func getNotificationSettings() {
  UNUserNotificationCenter.current().getNotificationSettings { settings in
    print("Notification settings: \(settings)")

    guard settings.authorizationStatus == .authorized else { return }

    DispatchQueue.main.async {
       UIApplication.shared.registerForRemoteNotifications()
    }
  }
}

有关如何处理推送通知的更多信息,请查看此Ray Wenderlich tutorial

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60862764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档