使用Unity配置多个Firebase项目

Sam*_*erg 9 unity-game-engine firebase firebase-authentication

是否可以为我的Unity应用程序配置多个Firebase项目而无需深入Android或iOS代码?我尝试过简单地切换google-services.json文件,但这未能将我的Unity应用指向正确的Firebase应用.理想情况下,我希望能够做到这样的事情:

 void Awake()
{
    if (environment == Environment.Development)
    {
        SetDevelopmentEnvironment();
    }

    FirebaseApp.CheckDependencies();
    FirebaseApp.FixDependenciesAsync();
    auth = FirebaseAuth.DefaultInstance;
}

public void SetDevelopmentEnvironment()
{
    AppOptions firebaseDevelopmentAppOptions = new AppOptions();
    firebaseDevelopmentAppOptions.ProjectId = "test";
    firebaseDevelopmentAppOptions.StorageBucket = "test.appspot.com";
    firebaseDevelopmentAppOptions.AppId = "1:12345:android: xyz";
    firebaseDevelopmentAppOptions.ApiKey = "123Key";
    firebaseDevelopmentAppOptions.MessageSenderId = "123SenderID";
    System.Uri dbURL = new System.Uri("https://test.firebaseio.com");
    firebaseDevelopmentAppOptions.DatabaseUrl = dbURL;
    FirebaseApp.Create(firebaseDevelopmentAppOptions);
}
Run Code Online (Sandbox Code Playgroud)

或者更好的是,只需从Resources文件夹中传递相应的google-services.json即可.

小智 5

要专门添加有关 Unity 的更多信息:

最简短的回答是,目前 Unity 插件不正式支持多种配置。为了向后兼容,有许多自定义流程

这在 Android 上的工作方式是脚本generate_xml_from_google_services_json.py将您的google-services.json文件转换为google-services.xml并将其放置在一个可以复制到 Android 版本的位置(请注意,在 Windows 上,它被编译成generate_xml_from_google_services_json.exe这样,开发人员不必安装 python)。这意味着当你换出这个文件时,你需要确保 xml 重新生成(如果你在更改google-services文件之前导出了一个 Android 项目,那么你需要替换 xml 而不是 json)。这基本上复制了google services 插件过程,同时还保持了与 gradle 支持之前的 Unity 版本的向后兼容性。由于它确实使用了Android 资源系统,因此在构建游戏后很难换出。

在 iOS 上,GoogleServices-Info.plist复制到最终的 XCode 项目中。在构建过程中的任何时候替换它会相当简单,尽管在构建后更换它并不容易。

现在做您在问题中首先提出的问题,如果您可以在运行时以某种方式做到这一点。你必须非常小心,Unity 中的 Firebase 是一个延迟初始化的单例。也就是说,访问该属性FirebaseApp.DefaultInstance或调用依赖于它的任何函数都会导致创建 Firebase 单例。您可以尝试使用 手动创建 Firebase 实例FirebaseApp.Create(AppInfo),但您必须在游戏设计中非常结构化,以确保在FirebaseApp隐式构造之前调用它(Create设置全局默认实例,但它CheckAndFixDependenciesAsync是一个异步调用,可能需要不止一帧需要完成。这可能会呈现一个棘手的错误表面)。您可以从 json 文件生成的 AppOptions像@Twinsens 指出的那样传入,但是google-services.json在您的文件中命名了多个文件Assets/目录不是一个定义明确的场景。您将需要重命名您的非默认配置(也可能将扩展名更改为.txt,以便您可以将它们检索为TextAsset)。

像这样的东西:

async void Awake()
{
    var dependencyStatus = await FirebaseApp.CheckAndFixDependenciesAsync();
    if (dependencyStatus != DependencyStatus.Available) {
        // error handling here
        return;
    }

    FirebaseApp app;
    if (environment == Environment.Development)
    {
        // I'm being extra cautious. `DefaultInstance` should have the one you create.
        app = SetDevelopmentEnvironment();
    }
    else {
        app = FirebaseApp.DefaultInstance;
    }

    // I'm being extra explicit just in case
    // for large projects, I'd prefer some sort of DI over the singletons anyway
    auth = FirebaseAuth.GetAuth(app);
}

public FirebaseApp SetDevelopmentEnvironment()
{
    AppOptions firebaseDevelopmentAppOptions = new AppOptions();
    firebaseDevelopmentAppOptions.ProjectId = "test";
    firebaseDevelopmentAppOptions.StorageBucket = "test.appspot.com";
    firebaseDevelopmentAppOptions.AppId = "1:12345:android: xyz";
    firebaseDevelopmentAppOptions.ApiKey = "123Key";
    firebaseDevelopmentAppOptions.MessageSenderId = "123SenderID";
    System.Uri dbURL = new System.Uri("https://test.firebaseio.com");
    firebaseDevelopmentAppOptions.DatabaseUrl = dbURL;
    return FirebaseApp.Create(firebaseDevelopmentAppOptions);
}
Run Code Online (Sandbox Code Playgroud)


laz*_*g87 2

您需要在每个平台(android 和 ios)上设置一些配置来加载不同的 firebase 配置文件(google-services.json)

安卓:

基本上,您可以配置不同的产品风格来区分不同的配置文件

在此输入图像描述

将口味添加到 build.gradle 中。您可以根据需要在此处添加更多环境特定字段:

在此输入图像描述

资源

https://developer.android.com/studio/build/build-variants

iOS:

它在 iOS 上非常相似,但是您在 Xcode 中设置不同的目标而不是产品风格

在此输入图像描述

您将每个 firebase 配置文件添加到其自己的文件夹中

在此输入图像描述

并将它们包含在 xcode 项目中

在此输入图像描述

将每个文件分配给正确的目标

在此输入图像描述

资源:

https://www.appcoda.com/using-xcode-targets/

  • Unity 的自动构建不会让您有机会对生成的 xcode 或 android 项目进行修改。有没有办法自动化这些步骤? (3认同)