【问题标题】:Configure multiple Firebase projects with Unity使用 Unity 配置多个 Firebase 项目
【发布时间】:2018-01-09 17:19:28
【问题描述】:

是否可以为我的 Unity 应用程序 configure multiple Firebase projects 而无需深入研究 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 unity3d firebase-authentication


    【解决方案1】:

    要特别添加有关 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)。这基本上复制了process of the google services plugin,同时还保持了与支持 gradle 之前的 Unity 版本的向后兼容性。由于它确实使用了Android resources system,因此在构建游戏后很难将其替换掉。

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

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

    【讨论】:

      【解决方案2】:

      你可以试试这个;

       AppOptions.LoadFromJsonConfig(string json);
      

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

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

      【讨论】:

        【解决方案3】:

        您需要在每个平台(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 项目进行修改。有没有办法自动化这些步骤?
        猜你喜欢
        • 2017-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-28
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多