如果没有Internet,

时间:2018-10-16 16:39:48

标签: swift firebase google-cloud-functions

有一个函数在AccountKit授权后触发,它调用Firebase函数在Facebook上验证令牌,如果确认所有内容,则返回userId;如果尚未注册用户,则注册该用户。

它可以在Internet可用但处于脱机状态时正常工作-Firebase函数不会返回或引发任何错误或至少没有结果,并且我希望它返回诸如无互联网连接或任何可能捕获的错误的错误

挖掘Web和APIReference没有结果。在这种情况下(脱机),firebase函数的调用是否真的不返回任何内容?

func checkUserCredentials(phoneNumber: String, FBId: String, Token: String) {

functions.httpsCallable("checkUserCredentials").call(["phone":"\(phoneNumber)", "FBId":"\(FBId)", "Token":"\(Token)"])
{   (result, error) in

    if let error = error as NSError?
    {
        if error.domain == FunctionsErrorDomain
        {
            let code = FunctionsErrorCode(rawValue: error.code)
            let message = error.localizedDescription
        }
    }

    if let userDoc = (result?.data as? [String: Any])?["userID"] as? String
    {
        DispatchQueue.main.async(execute: { self.performSegue(withIdentifier: "StartTheApp", sender: self) })
    }
} }

1 个答案:

答案 0 :(得分:0)

我建议在发出任何网络请求之前检查网络连接。这样一来,您就不必依赖用于与网络进行通信的任何库的可变性。

在执行任何请求之前,我使用Reachability检查网络连接(然后使用Alamofire执行)。以下是检查网络的示例函数:

import Reachability
...
func networkIsReachable(shouldShowAlert: Bool) -> Bool {

    if let reachability: Reachability = Reachability(), reachability.connection != .none {
        return true
    }

    if shouldShowAlert {
        let alertController = UIAlertController(title: "Error", message: "No internet connection.", preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
        present(alertController, animated: true, completion: nil)
    }
    return false
}

由于我在整个代码库中都使用了此功能,因此我甚至将其移至扩展名中,以免违反DRY principle

更新代码以使用此功能如下:

func checkUserCredentials(phoneNumber: String, FBId: String, Token: String) {

    guard let networkIsReachable(shouldShowAlert: true) else {
        // network is not reachable, and user has been shown an error message 
        return
    }

    // now perform network request
    // ...
}