27

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

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

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

我在网上找了一个合适的解决方案,但仍然没有找到方法。任何人都可以给任何想法如何做到这一点?

提前致谢 :)

4

5 回答 5

34

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

registerForRemoteNotificationTypes您可以通过分别调用和轻松启用和禁用应用程序中的推送通知unregisterForRemoteNotificationTypes。我已经尝试过了,它有效。

于 2012-06-25T10:10:06.193 回答
23

首先是您can not enable and disable push notification在应用程序中。如果您找到了一些应用程序,那么必须有解决方法。

就像如果您想在应用程序内部进行操作,则使用一个标识符并根据推送通知启用和禁用按钮将其发送到服务器。因此,您的服务器端编码使用此标识符并根据该标识符工作。就像标识符一样,它是启用的,否则您的服务器将发送通知,否则不会。

您可以检查该用户设置enabledisable Push Notifications使用以下代码。

启用或禁用 iPhone 推送通知

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

希望对你有帮助..

于 2012-05-09T06:03:38.017 回答
2

务实地说,可以通过注册和注销推送通知来启用和禁用推送通知。

启用推送通知:

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()
于 2017-07-20T14:12:55.157 回答
0

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

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

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

并取消订阅用户使用:

Messaging.messaging().unsubscribe(fromTopic: "topicName")
于 2019-03-10T19:12:52.337 回答
0

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

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
                }
            }
        }
于 2022-01-04T13:46:50.803 回答