SwiftUI 再次询问推送通知权限

SwiftUI ask Push Notifications Permissions again

所以我在我的应用程序中实现了推送通知,当应用程序首次启动时,它询问用户是否愿意允许推送通知(此实现按预期工作正常)。

如果这个用户不允许推送通知,是否可以在应用程序中有一个按钮允许用户点击并再次要求允许权限?

这就是我要实现的目标:

设置视图

//IF PUSH NOTIFICATIONS NOT ENABLED, SHOW THIS SECTION

Section (header: Text("Push Notifications")) {
                        HStack {
                            Image(systemName: "folder")
                                .resizable()
                                .frame(width: 20, height: 20)
                            VStack(alignment: .leading) {
                                Text("Enable Push Notifications").font(.callout).fontWeight(.medium)
                            }
                            Spacer()
                            Button(action: {
                                checkPushNotifications()
                            }) {
                                Text("View").font(.system(size:12))
                            }
                        }
                    }

在我的推送通知功能中:

class PushNotificationService: NSObject, MessagingDelegate {
    
    static let shared = PushNotificationService()
    private let SERVER_KEY = "myserverkey"
    private let NOTIFICATION_URL = URL(string: "https://fcm.googleapis.com/fcm/send")!
    private let PROJECT_ID = "my project name"
    
    private override init() {
        super.init()
        Messaging.messaging().delegate = self
    }
    
    func askForPermission() {
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted: Bool, error: Error?) in
            if granted {
                self.refreshFCMToken()
            } else {
                // Maybe tell the user to go to settings later and re-enable push notifications
            }
        }
    }
    
    func refreshFCMToken() {
        InstanceID.instanceID().instanceID { (result, error) in
            if let error = error {
                print("Error fetching remote instance ID: \(error)")
            } else if let result = result {
                print("Remote instance ID token: \(result.token)")
                self.updateFCMToken(result.token)
            }
        }
    }
    
    func updateFCMToken(_ token: String) {
        guard let currentUser = Auth.auth().currentUser else { return }
        let firestoreUserDocumentReference = Firestore.firestore().collection("users").document(currentUser.uid)
        firestoreUserDocumentReference.updateData([
            "fcmToken" : token
        ])
    }
}

我想要实现的是,如果用户 HAS NOT 启用了通知,然后才要求他们在 SettingsView 中重新启用的选项。

简短的回答是否定的,您不能再次询问用户是否曾经为您的应用禁用推送通知。 您可以做的是将用户导航到他们 phone 中的设置以再次允许推送通知。

SwiftUI 中按钮的代码片段为:

Button(action: {
    guard let url = URL(string: UIApplication.openSettingsURLString) else { return }
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}, label: {
    Text("Allow Push")
})

我也会参考这个问题:

不,你不能。然而,一个好的 UI/UX 设计会在燃烧一次性请求权限的机会之前小心。相反,使用用户友好的 UI 来解释为什么需要某些权限。例如,我经常发现实现权限显示视图并在单独的视图模型中处理各种异步权限请求令人沮丧。所以我最近做了一个 SwiftUI 包:

PermissionsSwiftUI

     

PermissionSwiftUI 是一个精美显示和处理权限的包。

EmptyView()
.JMPermissions(showModal: $showModal, for: [.locationAlways, .photo, .microphone])       

只需一行代码,您就会得到漂亮的 UI 和权限对话框。 它已经支持 7 OUT OF 12 iOS 系统权限。即将推出更多功能

完整示例

struct ContentView: View {
    @State var showModal = false
       
    var body: some View {
        Button(action: {showModal=true},
               label: {Text("Ask user for permissions")})
           .JMPermissions(showModal: $showModal, for: [.locationAlways, .photo, .microphone])
       }
   }

要使用 PermissionsSwiftUI,只需将 JMPermission 修饰符添加到任何视图即可。 传入一个 Binding 来显示模态视图,并添加任何你想显示的权限。