Swift iOS13中的网络监视器崩溃

Swift iOS13中的网络监视器崩溃,swift,xcode,swiftui,Swift,Xcode,Swiftui,因此,我试图保持我目前在iOS 13+上的状态,同时引入一些iOS 14的功能。 新功能之一是监控用户是否失去网络连接 然而,当我运行下面的代码时,我遇到了一个奇怪的错误 TaView.swift(默认视图) 班长,斯威夫特 import Network import SwiftUI // An enum to handle the network status enum NetworkStatus: String { case connected case disconnec

因此,我试图保持我目前在iOS 13+上的状态,同时引入一些iOS 14的功能。 新功能之一是监控用户是否失去网络连接

然而,当我运行下面的代码时,我遇到了一个奇怪的错误

TaView.swift(默认视图)

班长,斯威夫特

import Network
import SwiftUI

// An enum to handle the network status
enum NetworkStatus: String {
    case connected
    case disconnected
}

class Monitor: ObservableObject {
    private let monitor = NWPathMonitor()
    private let queue = DispatchQueue(label: "Monitor")

    @Published var score = 0
    @Published var status: NetworkStatus = .connected
  
    init() {
        monitor.pathUpdateHandler = { [weak self] path in
            guard let self = self else { return }

            // Monitor runs on a background thread so we need to publish
            // on the main thread
            DispatchQueue.main.async {
                if path.status == .satisfied {
                    print("We're connected!")
                    self.status = .connected
                    self.score = 1
                  

                } else {
                    print("No connection.")
                    self.score = 0
                    self.status = .disconnected
                }
            }
        }
        monitor.start(queue: queue)
    }
}

错误是

线程1:信号SIGABRT

我想知道如何解决这个问题


@StateObject
更改为
ObservedObject
效果非常好

注意:检查
@availability
(向后兼容时)时,您不必总是在
if
else
中再次编写相同的代码,您只需为
视图创建一个变量
并重用它,就像在本例中我们重用
选项卡视图内容

struct TaView: View {
    @ObservedObject var monitor = Monitor()
    
    @ObservedObject var location = LocationManager()
    @State var errorDetail = false
    
    
    var lat: String{
        return "\(location.lastKnownLocation?.coordinate.latitude ?? 0.0)"
    }
    
    var lon: String{
        return "\(location.lastKnownLocation?.coordinate.longitude ?? 0.0)"
    }
    
    var state: String{
        return "\(UserSettings().state)"
    }
    
    init() {
        //        print(self.data.connected)
        self.location.startUpdating()
    }
    @ObservedObject var userSettings = UserSettings()
    
    var tabViewContent: some View {
        TabView {
            ContentView()
                
                .tabItem {
                    Image(systemName: "dot.radiowaves.left.and.right")
                    Text("Radio")
                }
            
            WinView()
                .tabItem {
                    Image(systemName: "w.circle")
                    Text("Win")
                }
            
            SettingsView()
                .tabItem {
                    Image(systemName: "gear")
                    Text("Settings")
                    
                }
        }.accentColor(Color.red)
        .onAppear(){
            Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in
                if monitor.score == 0{
                    self.errorDetail = true
                } else {
                    self.errorDetail = false
                    
                }
                
                //print("this is the score \(monitor.score)")
            }
        }
    }
    
    var body: some View {
        if (self.lat == "0.0" && self.lon == "0.0"){
            LocationDisabled()
        }
        else{
            if #available(iOS 14.0, *) {
                tabViewContent
                    .fullScreenCover(isPresented: self.$errorDetail, content: NetworkOutageView.init)
            } else {
                tabViewContent
                    .sheet(isPresented: self.$errorDetail, content: NetworkOutageView.init)
            }
        }
    }
}

使用
Xcode 12.4
,在
iOS13.3.1
ios14.4.2

上测试,我无法重现此错误,您是否在
模拟器上运行,这对我来说运行正常,在
iOS14.4
Xcode 12.4
上测试是的,它在iOS14+上运行良好,但不是ios13.6。请注意,此代码无法在
ios13.6
上运行,因为您使用的是
@StateObject
属性包装器,该包装器可从
iOS14.0
及更高版本获得。请尝试改用
@observeobject
。不知道是什么解决此问题的方法是使其向后兼容
struct TaView: View {
    @ObservedObject var monitor = Monitor()
    
    @ObservedObject var location = LocationManager()
    @State var errorDetail = false
    
    
    var lat: String{
        return "\(location.lastKnownLocation?.coordinate.latitude ?? 0.0)"
    }
    
    var lon: String{
        return "\(location.lastKnownLocation?.coordinate.longitude ?? 0.0)"
    }
    
    var state: String{
        return "\(UserSettings().state)"
    }
    
    init() {
        //        print(self.data.connected)
        self.location.startUpdating()
    }
    @ObservedObject var userSettings = UserSettings()
    
    var tabViewContent: some View {
        TabView {
            ContentView()
                
                .tabItem {
                    Image(systemName: "dot.radiowaves.left.and.right")
                    Text("Radio")
                }
            
            WinView()
                .tabItem {
                    Image(systemName: "w.circle")
                    Text("Win")
                }
            
            SettingsView()
                .tabItem {
                    Image(systemName: "gear")
                    Text("Settings")
                    
                }
        }.accentColor(Color.red)
        .onAppear(){
            Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in
                if monitor.score == 0{
                    self.errorDetail = true
                } else {
                    self.errorDetail = false
                    
                }
                
                //print("this is the score \(monitor.score)")
            }
        }
    }
    
    var body: some View {
        if (self.lat == "0.0" && self.lon == "0.0"){
            LocationDisabled()
        }
        else{
            if #available(iOS 14.0, *) {
                tabViewContent
                    .fullScreenCover(isPresented: self.$errorDetail, content: NetworkOutageView.init)
            } else {
                tabViewContent
                    .sheet(isPresented: self.$errorDetail, content: NetworkOutageView.init)
            }
        }
    }
}