Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase能否可靠地用于检测可达性而不是iOS可达性API_Ios_Swift_Firebase_Reachability - Fatal编程技术网

Firebase能否可靠地用于检测可达性而不是iOS可达性API

Firebase能否可靠地用于检测可达性而不是iOS可达性API,ios,swift,firebase,reachability,Ios,Swift,Firebase,Reachability,我最近开始开发由firebase支持的iOS应用程序。我想知道使用firebase的特殊位置/.info/connected是否是检测用户是否有internet连接的好方法。我知道这通常是通过苹果提供的可达性API来实现的。以下是我的想法: 在应用程序代理中,我将设置如下内容 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObj

我最近开始开发由firebase支持的iOS应用程序。我想知道使用firebase的特殊位置
/.info/connected
是否是检测用户是否有internet连接的好方法。我知道这通常是通过苹果提供的可达性API来实现的。以下是我的想法: 在应用程序代理中,我将设置如下内容

func application(application: UIApplication, didFinishLaunchingWithOptions
    launchOptions: [NSObject: AnyObject]?) -> Bool {
          //Configure some stuff
          let connectedRef =
          Firebase(url:"https://serengeti.firebaseio.com/.info/connected")
          connectedRef.observeEventType(.Value, withBlock: { snapshot in
            let connected = snapshot.value as? Bool
            let userDefaults = NSUserDefaults.standardUserDefaults()
            if connected != nil && connected! {
                //User is connected
                userDefaults.setBool(true, forKey: "connected")
            } else {
                //User not connected
                userDefaults.setBool(false, forKey: "connected")
            }
            userDefaults.synchronize() //Force value into NSUserDefaults
    }
然后在我需要检查连接的函数中(例如,当他们单击facebook注册按钮时),我查找
NSUserDefaults
条目

func authWithFacebook() {
    let userDefaults = NSUserDefaults.standardUserDefaults()
    if userDefaults.boolForKey("connected") == false {
        //Segue to a popup saying internet connection is required  
    } else {
      //Continue with signup
    }
}

这是检查internet连接而不是使用可达性API的有效且健壮的方法吗。如果没有,它将以什么方式缺少。

正如Jay所说:Firebase的
.info/connected
检测用户是否连接到Firebase服务器

用户可能连接到internet,但无法访问Firebase服务器的原因有很多。Firebase宕机可能是其中之一,但在设备首次连接到internet和Firebase服务器之间也可能存在各种各样的问题


但是,除非你更换iOS的“你在互联网上”图标,否则你的用户可能更感兴趣的是应用程序是否连接到其后端。如果您使用Firebase作为应用程序的后端,
.info/connected
非常适合检测

您使用的是Firebase,因此使用他们的API查看您是否与他们有连接是正确的方法。事实上,苹果公司的建议是,始终先尝试连接到您的web服务,然后使用可达性诊断任何故障:

重要
SCNetworkReachability
API不打算用作 用于确定网络连接的飞行前机制。你 通过尝试连接来确定网络连接。如果 连接失败,请参阅
SCNetworkReachability
API以获得帮助 诊断故障的原因


我认为这里的问题是定义什么是互联网连接。您是否希望查看Firebase是否连接到Firebase服务器或设备到internet。假设该设备位于防火墙后面,网络流量被阻止,那么浏览器可能可以工作,但没有其他功能。如果我们遇到Firebase服务器脱机的罕见情况,该怎么办?@Jay我的意思是检查设备是否一般都连接了互联网。但要让用户能够登录,必须连接到firebase,因为我使用firebase的
authWithOAuthProvider
登录facebook。因此,在我的具体案例中,这样做似乎可以侥幸逃脱?我的主要目的是在用户首次尝试登录时提示他们网络不可用。我正在使用firebase登录并存储其他信息。正如你所说,我只需检查一下。info/connected就足够了。如果用户在暂时丢失后重新连接,并进行了一些挂起的更新,我还将使用它自动将本地存储数据同步到firebase服务器。可以肯定的是,.info/connected。我们在我们的应用程序中做到了这一点,而且效果非常好。您可能还希望在应用程序中保留一个标志(我们使用KVO),这样在使用应用程序的过程中,如果它离线,用户就会知道。