首页 > 解决方案 > 当视图从“应用程序设置”返回更改通知设置时如何触发“onAppear”方法?

问题描述

我目前正在使用 SwiftUI 开发应用程序。

我正在尝试使用Local Notification.

我想反思一组Allow Notifications中的App Settings一些观点。

但是,当App Settings使用我附加的导航链接(不是后退按钮)返回视图时,该onAppear方法不会触发并且我无法显示收集值......

在我的代码中:

在此处输入图像描述

我该如何解决这个问题?


以下是代码:

内容视图.swift

import SwiftUI

struct ContentView: View {
    
    @State var isNotification = false
    
    var body: some View {
        VStack{
            Text(isNotification ? "STATUS:ON" : "STATUS:OFF")
                .padding()
            Text("Open Settings")
                .padding()
                .onTapGesture {
                    UIApplication.shared.open(URL(string:UIApplication.openSettingsURLString)!)
                }
        }
        .onAppear(){
            confirmNotification()
        }
    }
    
    func confirmNotification(){
        UNUserNotificationCenter.current()
            .requestAuthorization(options: [.alert, .badge, .sound]){
                success, error in
                if success{
                    isNotification = true
                    print("Notification set")
                }else{
                    isNotification = false
                }
            }
    }
}

NotificationTestApp.swift

import SwiftUI

@main
struct NotificationTestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Xcode:版本 12.0.1

iOS:14.0

生命周期:SwiftUI 应用

标签: swiftui

解决方案


视图已经出现,只是应用程序在后台。尝试改用(或另外)scenePhase

struct ContentView: View {
    
    @Environment(\.scenePhase) private var scenePhase
    @State var isNotification = false
    
    var body: some View {
        VStack{
            Text(isNotification ? "STATUS:ON" : "STATUS:OFF")
                .padding()
            Text("Open Settings")
                .padding()
                .onTapGesture {
                    UIApplication.shared.open(URL(string:UIApplication.openSettingsURLString)!)
                }
        }
        .onAppear(){
            confirmNotification()
        }
        .onChange(of: scenePhase) { phase in
            switch phase {
                case .active:
                    confirmNotification()
                default:
                    break
            }
        }
    }


推荐阅读