所以我在我的应用程序中实现了推送通知,当应用程序首次启动时,它会询问用户是否愿意允许推送通知(此实现按预期工作正常)。
如果此用户不允许推送通知,是否可以在应用程序中设置一个允许用户单击的按钮,然后它会再次要求允许权限?
这就是我想要实现的目标:
设置 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
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/