使用Unity配置多个Firebase项目

时间:2018-01-09 17:19:29

标签: firebase unity3d firebase-authentication

如果没有深入Android或iOS代码,我的Unity应用程序是否可以configure multiple Firebase projects?我尝试过简单地切换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即可。

3 个答案:

答案 0 :(得分:3)

要专门添加有关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之前调用它(创建应该< / em>设置全局默认实例,但是CheckAndFixDependenciesAsync是一个异步调用,可能需要花费一帧以上的时间才能完成(这可能会带来棘手的错误表面)。您可以按照@Twinsens的指示传递AppOptions generated from a json file,但是在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);
}

答案 1 :(得分:1)

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

Android:

基本上,您可以配置不同的产品样式以在不同的配置文件之间进行分隔

enter image description here

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

enter image description here

资源

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

iOS:

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

enter image description here

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

enter image description here

并将它们包含在xcode项目中

enter image description here

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

enter image description here

资源:

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

答案 2 :(得分:0)

您可以尝试这个;

 AppOptions.LoadFromJsonConfig(string json);

有关更多信息,请访问

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