在应用程序内启用或禁用 Iphone 推送通知

Enable or Disable Iphone Push Notifications inside the app

提问人:Sameera Chathuranga 提问时间:5/9/2012 最后编辑:KrunalSameera Chathuranga 更新时间:1/4/2022 访问量:33934

问:

我有一个 iphone 应用程序,可以接收推送通知。目前,我可以通过转到 iphone 设置/通知来禁用我的应用程序的推送通知。

但我想在我的应用程序中添加一个开关或按钮来启用或禁用推送通知。

这是可以做到的,因为我在 foursqure iphone 应用程序中看到了它。他们在设置呼叫通知设置中有一个部分,用户可以为应用程序启用或禁用不同类型的通知。

我在网上寻找合适的解决方案,但仍然没有找到方法。任何人都可以给出任何想法吗?

提前致谢:)

iOS Swift 推送通知 unusernotificationcenter usernotifications

评论

0赞 Anil 2/13/2014
苹果允许这样做吗?
0赞 shaqir saiyed 1/18/2018
@Anil我也在寻找同样的答案,但仍然没有得到任何明确的答案。

答:

24赞 Nitin 5/9/2012 #1

第一件事是你进入应用程序。如果您找到一些应用程序可以做到这一点,那么必须有解决方法。can not enable and disablepush notification

就像你想在应用程序内做一样,然后使用一个标识符,并根据推送通知启用和禁用按钮将其发送到服务器。因此,您的服务器端编码使用此标识符并据此工作。就像标识符说它已启用,否则您的服务器将发送通知。

您可以使用以下代码检查该用户集。enabledisablePush Notifications

启用或禁用 Iphone 推送通知

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone) 
 // Yes it is..

希望,这会对你有所帮助..

评论

2赞 Tony Million 6/25/2012
如下面的答案所述,调用 unregisterForRemoteNotificationTypes 将停止推送通知的传递 - 我已经在用户注销时在我的应用程序上测试了这一点,它确实有效。
35赞 Varun Bhatia 6/25/2012 #2

[仅供参考 - 很少有用户报告说它停止在iOS 10上运行]

您可以通过再次调用 和 来轻松启用和禁用应用程序中的推送通知。我已经尝试过这个,它有效。registerForRemoteNotificationTypesunregisterForRemoteNotificationTypes

评论

0赞 Anil 2/13/2014
苹果允许这样做吗?
0赞 nmr 2/19/2014
不过,这仍然取决于通知中心设置,对吧?
0赞 Matthias 1/12/2017
正如@TiagoAlmeida所说,它不再适用于iOS10,Apple也不推荐。他们在文档中说,unregisterForRemoteNotificationTypes 应该只在极少数情况下使用,例如完全禁用应用程序的通知
2赞 Krunal 7/20/2017 #3

实际上,可以通过注册和取消注册推送通知来启用和禁用推送通知。

启用推送通知:

if #available(iOS 10.0, *) {
   // For iOS 10.0 +
   let center  = UNUserNotificationCenter.current()
   center.delegate = self
   center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in
        if error == nil{
           DispatchQueue.main.async(execute: {
                 UIApplication.shared.registerForRemoteNotifications()
           }) 
        }
   }
}else{
    // Below iOS 10.0

    let settings = UIUserNotificationSettings(types: [.sound, .alert, .badge], categories: nil)
    UIApplication.shared.registerUserNotificationSettings(settings)

    //or
    //UIApplication.shared.registerForRemoteNotifications()
}

委托方法

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

}

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

}


func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // .. Receipt of device token
}


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

禁用推送通知:

UIApplication.shared.unregisterForRemoteNotifications()

评论

0赞 shaqir saiyed 1/18/2018
所以你的意思是说你的应用程序设置中有一个启用/禁用按钮,并且你正在使用此代码启用和禁用通知,对吧?它有效吗?苹果会批准这个吗?
0赞 Dyary 3/11/2019 #4

如果您使用 to 向设备发送推送通知,则可以使用主题订阅在订阅的设备中启用推送通知,并在不希望用户在已取消订阅的设备中接收推送通知时取消订阅该主题。FireBase

要为用户订阅主题,只需导入 Firebase,然后使用以下方法:

Messaging.messaging().subscribe(toTopic: "topicName")

并取消订阅用户使用:

Messaging.messaging().unsubscribe(fromTopic: "topicName")
0赞 Tulon 1/4/2022 #5

首先检查权限,然后进行相应的更改。

func checkPermission(completion: @escaping (_ isCameraPermissionOn: Bool) -> ()) {
        let current = UNUserNotificationCenter.current()
        current.getNotificationSettings(completionHandler: { permission in
            switch permission.authorizationStatus  {
            case .authorized:
                //If user allow the permission
                completion(true)
            case .denied:
                //If user denied the permission
                completion(false)
            case .notDetermined:
                //First time
                current.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
                    if granted {
                        completion(true)
                    } else {
                        completion(false)
                    }
                }
            case .provisional:
                // @available(iOS 12.0, *)
                // The application is authorized to post non-interruptive user notifications.
                completion(true)
            case .ephemeral:
                // @available(iOS 14.0, *)
                // The application is temporarily authorized to post notifications. Only available to app clips.
                completion(true)
            @unknown default:
                print("Unknow Status")
            }
        })
    }

叫:

AppsPermissionCheckingManager.shared.checkPermission { isPermissionOn in
            DispatchQueue.main.async {
                if isPermissionOn == true {
                    //It's on
                } else {
                    //It's off
                }
            }
        }