iOSapp如何使用Reachability解决app安装后首次运行网络授权的问题?

情况介绍

现在有一个iOS Swift语言开发的app,主要功能是在app启动后加载一个远程网页,所有业务功能都在该网页内操作,app只是一个壳子。

第三方库

我使用https://github.com/ashleymills/Reachability.swift.git来处理。

问题描述

iOS 的机制是:app安装后、首次运行的时候,会弹窗询问用户是否启用网络访问的权限。
我期望在用户通过网络授权后(不论是蜂窝网络还是WIFI),才开始后续的webview的加载。但现在是app刚启动,还未等用户授权网络访问,就加载webview,导致无法打开网页。
我想使用Reachability库来解决这个问题,但是无论如何都无法进入whenReachable和whenUnreachable回调里。

麻烦请教大家,是什么原因导致的?我该如何修改?

代码结构

import Reachability

class ViewController: UIViewController {

...

override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        // 网络检测 开始
        let reachability = try! Reachability()
        reachability.whenReachable = { reachability in
            if reachability.connection == .wifi {
                print("Reachable via WiFi")
            } else {
                print("Reachable via Cellular")
            }
        }
        reachability.whenUnreachable = { _ in
            print("Not reachable")
        }
        do {
            try reachability.startNotifier()
        } catch {
            print("Unable to start notifier")
        }
        // 网络检测 结束

        // 加载html页面
        let request = URLRequest(url: url)
        self.webView.load(request)
}


阅读 2.2k
avatarAI BotBETA

根据你提供的代码,你的Reachability回调没有按预期工作,可能是因为Reachability的回调是异步的,这意味着它可能在你的webview加载请求之后才开始运行。这可能是你在webview加载后才得到网络连接的状态。

你需要将你的webview加载代码移动到Reachability的回调中,如下所示:

import Reachability

class ViewController: UIViewController {

...

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    
    // 网络检测 开始
    let reachability = try! Reachability()
    reachability.whenReachable = { reachability in
        if reachability.connection == .wifi {
            print("Reachable via WiFi")
        } else {
            print("Reachable via Cellular")
        }
        // 当网络可访问时,加载网页
        loadWebView()
    }
    reachability.whenUnreachable = { _ in
        print("Not reachable")
        // 当网络不可访问时,处理无法加载网页的情况
        handleNoInternetConnection()
    }
    do {
        try reachability.startNotifier()
    } catch {
        print("Unable to start notifier")
    }
    // 网络检测 结束
}

func loadWebView() {
    // 加载html页面
    let request = URLRequest(url: url)
    self.webView.load(request)
}

func handleNoInternetConnection() {
    // 处理无网络连接的情况,例如显示一个错误消息或者引导用户去设置网络权限等。
}
...
}

这样,只有当网络可访问时,才会加载webview。如果网络不可访问,你可以在handleNoInternetConnection函数中处理这种情况,例如显示一个错误消息或者引导用户去设置网络权限等。

1 个回答

你需要在UIApplicationDelegate中监听网络状态的变化,使用 let monitor = NWPathMonitor()
monitor.pathUpdateHandler = { path in

if path.status == .satisfied {
    print("Yay! We have internet!")
    //发出通知
}

}
获取网络状态后,发出通知,在你需要刷新的页面接受通知。通知到了,刷新页面

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏