【问题标题】:Unable to connect to Firebase Emulator with iOS device无法使用 iOS 设备连接到 Firebase 模拟器
【发布时间】:2022-05-07 22:15:46
【问题描述】:

我正在尝试将 iOS 设备连接到 Firebase Auth 和 RealTime Database Emulator。

问题是,我可以通过 Firebase Admin 在本地机器上使用 NodeJS 连接和使用模拟器(通过 http://localhost:9000?ns=my-project)。

我还可以将 iOS 设备连接到远程 Firebase 服务器……但在本地它不起作用。它会引发一堆随机错误,如下所示(当我尝试完成注册/身份验证时):

Error Domain=NSURLErrorDomain Code=-1004 "无法连接到 服务器。" NSLocalizedDescription=无法连接到服务器。, NSErrorFailingURLStringKey=http://192.168.1.3:9099/www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?key=myKeyGoesHere

可选(错误域=com.firebase.core 代码=1“无法获取最新 查询 FQuerySpec 的值(路径:/news,参数:{}),客户端离线 没有活动的侦听器,也没有匹配的磁盘缓存条目”

这里是 firebase.json:

{
  "database": {
    "rules": "database.rules.json"
  },
  "emulators": {
    "auth": {
      "port": 9099
    },
    "database": {
      "port": 9000
    },
    "ui": {
      "enabled": true
    }
  }
}

我更改了规则以防万一:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

但事实并非如此。

这是我尝试在我的 iOS 应用程序(我的 FirebaseManager 类)中连接到数据库的方法:

 init(){
      Auth.auth().useEmulator(withHost:"192.168.1.3", port:9099)
 }

  private lazy var newsNodeRef:DatabaseReference? = {
    
    guard let urlString = getBaseURL() else {return nil}
    
    let node = LocalConstants.kNewsRef // this has value of 'news'
    return Database.database(url: urlString).reference(withPath: node)
}()


    
    private func getBaseURL()->String?{
        let environment = Environment()
        guard let connectionProtocol = environment.configuration(PlistKey.firebaseConnectionProtocol), let baseURL = environment.configuration(PlistKey.firebaseDatabaseURL) else {return nil}
        let urlString = "\(connectionProtocol)://\(baseURL)"
        
        return urlString // this produces something like 'http://192.168.1.3:9000?ns=my-project' (its fetched from Configuration Settings file based on selected environment)
    }

问题是,如果我只是更改环境(它会自动更改基本 url),则完全相同的设置适用于远程服务器。

我还在 info.plist 中允许不安全的 http 加载,只是为了确定它是否不是这样,但仍然不起作用。

这是我在运行模拟器时在控制台中看到的:

这里有什么问题?

【问题讨论】:

  • 我认为 firebase 模拟器中存在错误。我认为您没有错过诸如您的设备和计算机连接到同一个 wi-fi 网络之类的细节。我做了一些试验,得到了以下结果。该模拟器不适用于 iOS 12 及更早版本的 Firebase 身份验证和存储。 Firestore 正在运行。我还没有尝试过 iOS 13,但它在当前的 iOS 版本上运行良好。当您在 Xcode 模拟器中使用 iOS 12 进行尝试时,您会看到同样的错误。
  • 是的,我和我的 Mac 连接在同一个 Wifi 上......说到 iOS,我在说话的那一刻是最新版本,15.3.1 @İsaDiliballı 在我的情况下,iPhone模拟器与 Firebase 模拟器一起正常工作。
  • 有这个问题的人很多。我有同样的问题。我的结论是模拟器不能在真实设备上运行。有一个关于这个问题的问答,我找不到链接。谷歌员工有答案,问题在于解决方法。
  • @İsaDiliballı 实际上我得到了它的工作。但我也发现了与本地网络访问提示相关的整个事情的一个相当大的问题。如果有兴趣,您可以查看我的答案中的 Dev Portal 链接以获取更多详细信息。

标签: ios swift firebase firebase-realtime-database firebase-authentication


【解决方案1】:

我真的解决了。解决方案/问题,我什至不知道如何声明它,是 Local Network Access prompt & permissions 及其错误行为(以及我如何尝试通过 ip 访问我的 Mac)。

一开始我什至没有每次都看到提示,但我猜这与porthost等的错误设置有关。

但是当我正确设置本地计算机的 ip 并将firebase.json 恢复为默认设置(这对我有用)时,提示每次都开始跳出。

问题是,prompt 的行为似乎被破坏了,因为它不是在您尝试访问本地网络中的设备之前跳转,而是在执行该操作后弹出。挺快的,但是在Auth系统回复之后还是这样,没有意义。

在这里,它可能会令人困惑,导致在您不允许使用 Local Network Access 的情况下从 Firebase 身份验证系统返回的错误,并不能真正告诉您真正的原因。请参阅上面我的 ( original question) 以查看错误。

在那次可怕的流程之后,我允许通过提示进行访问。一旦我这样做了,每次对Emulator 的“api”调用都会成功。像魅力一样工作。

这里真正的问题是Local Network Access prompt。因为我们根本无法控制它,所以我们不能那么容易地触发它,或者容易地获取用户在此刻/或之前选择/选择的信息。它是由系统在特定条件下触发的。

幸运的是,这只是为了开发 :) 但我希望它会很快得到修复/改进,因为它应该。

我在开发门户网站上发现了很多关于此主题的信息,并将其视为错误Local Network Access Prompt problems

【讨论】:

    【解决方案2】:

    我在 iOS 模拟器中使用 firebase auth 时也遇到了同样的问题 然后我稍微改变一下我的代码

    Future<void> main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp();
      if (Platform.isAndroid) {
        await FirebaseAuth.instance.useAuthEmulator('localhost', 9099);
      }
    
      runApp(const MyApp());
    }
    

    我只检查了 android,它对我有用 在这个方法中你可以看到它只适用于android。

    【讨论】:

      猜你喜欢
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2021-05-25
      • 1970-01-01
      相关资源
      最近更新 更多