firebase - SwiftUI 再次询问推送通知权限

标签 firebase push-notification swiftui

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

如果此用户不允许推送通知,是否可以在应用程序中设置一个允许用户单击的按钮,然后它会再次要求允许权限?

这就是我想要实现的目标:

设置 View

//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 中重新启用的选项。

最佳答案

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

PermissionsSwiftUI

              enter image description here enter image description here

PermissionSwiftUI 是一个漂亮地显示和处理权限的包。

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

只需一行代码,您就可以获得漂亮的 UI 和权限对话框。 它已经支持 12 个 iOS 系统权限中的 7 个。更多功能即将推出🙌

完整示例

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 修饰符添加到任何 View 即可。 传入一个 Binding 以显示模态视图,并添加您想要显示的任何权限。

关于firebase - SwiftUI 再次询问推送通知权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65967570/

相关文章:

android - 无法使用Firebase性能进行编译。 (无法找到方法...)

ios - 在 Xcode 8/Swift 3.0 中注册推送通知?

android - getIntent.getExtras() 在通知点击时返回空数据 (Fcm)

ios - 列出重新加载动画故障

ios - 将 View (例如 Text())的不透明度设置为 0 或将背景设置为 Color.clear 会导致其不被绘制

date - 线程 1 : Fatal error: Can't remove last element from an empty collection SwiftUI

node.js - 为什么 Cloud Functions for Firebase 需要 25 秒?

ios - 构建登录演示时出现链接器错误

firebase - Firebase 的云功能无限运行然后超出配额

iphone - 在适用于 iOS 的 AdHoc 分发版本上使用沙盒 APNS