使用 Unity 配置多个 Firebase 项目

问题描述 投票:0回答:4

是否可以为我的 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);
}

或者更好的是,只需从 Resources 文件夹传递适当的 google-services.json 即可。

firebase unity-game-engine firebase-authentication
4个回答
7
投票

专门添加有关 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 单例。您可以尝试使用
FirebaseApp.Create(AppInfo)
手动创建 Firebase 实例,但您的游戏设计必须非常结构化,以确保在隐式构造
FirebaseApp
之前调用它(创建 should 设置全局默认值)实例,但
CheckAndFixDependenciesAsync
是一个异步调用,可能需要多个帧才能完成。这可能会出现一个棘手的错误表面)。正如 @Twinsens 指出的那样,您可以传入从 json 文件生成的 AppOptions ,但是在
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);
}

3
投票

你可以试试这个;

 AppOptions.LoadFromJsonConfig(string json);

欲了解更多信息,请访问,

https://firebase.google.com/docs/reference/unity/class/firebase/app-options#loadfromjsonconfig


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/


0
投票

我刚刚用编辑器工具交换了

google-services.json
GoogleService-Info.plist
。我在与资源文件夹同一级别创建了一个名为
FirebaseAppConfigurations
的文件夹。然后我为每个环境创建了一个子文件夹(
com.mygame.dev
com.mygame.prod
)。每个环境都有自己的 Firebase 项目。然后我将
google-services.json
GoogleService-Info.plist
放入每个 Firebase 项目各自的文件夹中。

然后当我想切换环境时,我运行

UpdateEnvironment()

private enum Environment
{
    Dev,
    Prod
}

private static readonly Dictionary<Environment, string> FirebaseEnvironments = new()
{
    { Environment.Dev, "com.mygame.dev" },
    { Environment.Prod, "com.mygame.prod" }
};

public void UpdateEnvironment(Environment environment)
{
    string source = $"FirebaseAppConfigurations/{FirebaseEnvironments[environment]}";
    string destination = $"Assets/GoogleServices";
    FileUtil.ReplaceDirectory(source, destination);
    string googleServicesStreamingAssets = $"Assets/StreamingAssets/google-services-desktop.json";
    FileUtil.DeleteFileOrDirectory($"{googleServicesStreamingAssets}");
    FileUtil.DeleteFileOrDirectory($"{googleServicesStreamingAssets}.meta");
    AssetDatabase.Refresh();
}
© www.soinside.com 2019 - 2024. All rights reserved.