firebase / quickstart-unity

Firebase Quickstart Samples for Unity
https://firebase.google.com/games
Apache License 2.0
833 stars 429 forks source link

Able to generate google-services.xml properly if Application Id is changed right before building. #768

Open chkuang-g opened 4 years ago

chkuang-g commented 4 years ago

Based on https://github.com/googlesamples/unity-jar-resolver/issues/365

The user request to be able to generate google-services.xml properly if they try to change application Id right before building. Ex.

using UnityEditor;

public class Build
{
    [MenuItem("Tools/Build/Debug")]
    public static void BuildDebug()
    {
        PlayerSettings.productName = "debug";
        PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, "com.firebaseExample.debug");
        BuildPipeline.BuildPlayer(new[] { "Assets/Scenes/SampleScene.unity" }, "debug.apk", EditorUserBuildSettings.activeBuildTarget, BuildOptions.None);
    }

    [MenuItem("Tools/Build/Release")]
    public static void BuildRelease()
    {
        PlayerSettings.productName = "release";
        PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.Android, "com.firebaseExample2.release");
        BuildPipeline.BuildPlayer(new[] { "Assets/Scenes/SampleScene.unity" }, "release.apk", EditorUserBuildSettings.activeBuildTarget, BuildOptions.None);
    }
}

Currently GenerateXmlFromGoogleServicesJson.cs (in Firebase.Editor.dll) relies on PlayServicesResolver.BundleIdChanged event to change google-services.xml when application id change. However, the event only triggered in the next update from the main thread. https://github.com/googlesamples/unity-jar-resolver/blob/825901fa297065d651709fdc34cc5433410c8869/source/AndroidResolver/src/PlayServicesResolver.cs#L1370

@master-lincoln came up with a workaround to utilize reflection to force trigger this event

Type type = Type.GetType("Firebase.Editor.GenerateXmlFromGoogleServicesJson, Firebase.Editor");
var method = type.GetMethod("OnBundleIdChanged", BindingFlags.Public | BindingFlags.NonPublic| BindingFlags.Static);
method.Invoke(null, new[] {
    (object)null,
    new PlayServicesResolver.BundleIdChangedEventArgs
    {
        BundleId = newAppId,
        PreviousBundleId = oldAppId
    }
});

However, there should be a better way to support such case.

AntonPetrov83 commented 3 years ago

I was changing Application Id from the build script and game-services.xml was not updated properly.

I think I fixed it and my current build script looks like this:

  1. Change Application Id (it MUST be done before step 4);
  2. Copy corresponding google-services.json and GoogleService-Info.plist to the Assets folder.
  3. Call AssetDatabase.Refresh(); (I am not sure if this is really needed);
  4. Call GenerateXmlFromGoogleServicesJson.ForceJsonUpdate(false) to regenerate google-services.xml