如何正确禁用/启用推送通知

Posted

技术标签:

【中文标题】如何正确禁用/启用推送通知【英文标题】:How to correctly disable/enable push notifications 【发布时间】:2019-08-12 08:00:54 【问题描述】:

各位开发者您好。

我正在尝试使用 UISwitch 创建一个操作,该操作允许用户禁用/启用他们的推送通知。当我关闭开关时,我不再收到推送通知。但是,如果我尝试重新打开它,我仍然没有收到它。也使用 Firebase。

这是我的应用委托代码。我会尝试分享相关代码,但如果您需要,请随时请求更多代码。

PS:我用于切换器的代码实际上来自我在 *** 上找到的答案。

// App delegate

  func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 
        print("Registered for notifications", deviceToken)
        Messaging.messaging().apnsToken = deviceToken

    

    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) 
        print("Registered with FCM with token:", fcmToken)
    

  private func attemptRegisterForNotifications(application: UIApplication) 
        // APNS means Apple push notification services
        print("Attempting to register APNS...")

        Messaging.messaging().delegate = self
        UNUserNotificationCenter.current().delegate = self



        // user notification auth
        // all of this works for ios 10+
        let options: UNAuthorizationOptions = [.alert, . badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(options: options)  (granted, error) in
            if let error = error 
                print("Failed to request auth:", error)
                return
            

            if granted 
                print("Auth granted.")
             else 
                print("Auth denied")
            

        

        application.registerForRemoteNotifications()


    

这是我在设置视图控制器中的代码


   self.notificationSwitch.addTarget(self, action: #selector(action(sender:)), for: .valueChanged)...

 @objc func action(sender: UISwitch) 

        let userDefaults = UserDefaults.standard
        userDefaults.set(sender.isOn, forKey:"identifier")

        if(notificationSwitch.isOn) 
            print("Switch is on")
            UIApplication.shared.registerForRemoteNotifications()

         else 

            print("Switch is off")
            UIApplication.shared.unregisterForRemoteNotifications()
        

    

【问题讨论】:

尝试从您的服务器/firebase 以及在您的切换操作中删除设备令牌。 @charanjitsingh 好的,我试试看! 【参考方案1】:

根据unregisterForRemoteNotifications 的文档:

您应该只在极少数情况下调用此方法,例如当 该应用程序的新版本取消了对所有类型遥控器的支持 通知。用户可以暂时阻止应用接收 通过设置的通知部分进行远程通知 应用程序。通过此方法取消注册的应用始终可以重新注册。

正确的方式(其实在我做过的项目中看到的方式)是调用一个api,告诉后端不应该发送推送通知。

【讨论】:

我想知道我是否应该只是从头开始操作然后将其删除。我只是认为如果用户在收到诸如 cmets、like 等通知时感到恼火,给用户提供选项是一种很好的用户体验 确实是不错的用户体验。每个应用程序都有它。你只需要引入一个新的 api 设置一个标志后端来取消注册。后端实际上不会注销设备令牌,但它会检查标志并决定是否向 APNS 发送推送通知。 知道了。明天我会努力的,谢谢,我完全理解。接受答案。

以上是关于如何正确禁用/启用推送通知的主要内容,如果未能解决你的问题,请参考以下文章

如何部分启用/禁用远程推送通知客户端?

如何从应用程序 iOS 8 启用/禁用推送通知

如何禁用或启用onMessageReceived的firebase推送通知?

从设置应用程序 ios 获取推送通知启用/禁用事件?

实现细粒度启用/禁用推送通知

如何仅针对该应用禁用来自应用的推送通知?