当前位置: 首页 > 知识库问答 >
问题:

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

长孙阳嘉
2024-02-29

情况介绍

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

第三方库

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

问题描述

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

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

代码结构

import Reachabilityclass 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)}

共有1个答案

邵华皓
2024-02-29

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

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

import Reachabilityclass 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函数中处理这种情况,例如显示一个错误消息或者引导用户去设置网络权限等。

 类似资料:
  • 我已安装UiPath并接受免费许可证。但是,如果我们关闭该工具并再次尝试打开它,那么每次它打开安装屏幕并请求许可证时。请给出这个问题的解决方案。谢谢 预期结果:一旦安装了UiPath,就可以轻松地打开它。 实际结果:每次都需要安装UiPath工具。

  • 我有对话框,弹出第一次运行的应用程序。因为我在第一次运行后添加了布尔值设置为false,所以每次我运行模拟器(指向实际的电话而不是虚拟的),应用程序运行良好,但这些对话框不显示。我该怎么办?

  • 本文向大家介绍解决docker安装后运行hello-world报错的问题,包括了解决docker安装后运行hello-world报错的问题的使用技巧和注意事项,需要的朋友参考一下 在centos7.3上yum安装了docker V1.13。1 但是在运行:docker run hello-world的时候报错: # docker run docker.io/hello-world containe

  • 我已经在我的ubuntu终端上使用命令pip install scapy安装了scapy。我还有Python 2.7。安装了17个。如何在ubuntu终端上运行scapy?我已经尝试运行命令:sudo/斯卡皮。我的目标是使用scapy嗅探数据包并记录数据包的发送和接收时间。

  • 1、管理员登录企业管理平台,进入应用中心,点击进入应用市场 2、选择一个需要安装的应用,点击进入详情 3、点击安装按钮,开始授权安装 4、在弹窗中选择需要授权的成员范围,只有被授权的成员可以在客户端访问该应用 5、确定完成授权安装,可通知成员重新登录如流客户端访问应用

  • Cassandra:clustername:“test”contactpoints:[“127.0.0.1”]keyspace:reaper_db Cassandra-Reaper 查找:“./boot/efi”:权限拒绝查找:“./boot/grub2”:权限拒绝查找:“./proc/tty/driver”:权限拒绝查找:“./proc/1/task/1/fd”:权限拒绝查找:“./proc/1