【问题标题】:Can I disable Firebase for Unity iOS builds only? (while keeping it in Android builds)我可以只为 Unity iOS 版本禁用 Firebase 吗? (同时保留在 Android 版本中)
【发布时间】:2021-12-29 01:18:19
【问题描述】:

这个问题被问了好几次都没有合适的答案:

How to exclude Firebase Messaging from Unity iOS builds, but not Android builds

How to disable Firebase in Unity for iOS?

我正在构建一个使用 PlayFab 的游戏,我需要使用 Apple 的 iOS 原生 APNS 和 Android 的 Firebase 消息传递。但是 Firebase 在我的 iOS 版本中搞砸了一些东西,而且我也没有使用它的任何功能。

我尝试从 podfile 中删除所有 Firebase 引用,并尝试选择 Assets/Firebase/Plugins 文件夹中的所有文件并取消选中“为插件选择平台”下的“iOS”。但两者都导致 Xcode 中的构建失败。

我不想为同一个游戏维护两个单独的项目(一个用于 iOS,一个用于 Android),因此我需要一种方法将其保留在项目中而不包含在 iOS 构建中。

编辑:我对 Firebase 的问题是,在用户在 iOS 上启用推送通知后,完全关闭应用程序(强制退出),应用程序每次启动时都会崩溃。根据日志,它就在 FCM(Firebase 云消息传递)调试输出之前。

根据this comment on PlayFab forums,FCM 窃取推送通知,这也是我需要禁用它的原因。

【问题讨论】:

  • 我从来没有遇到过这样的问题。确保构建中不包含所有插件文件,在检查器中取消选中它们,并在项目中引用它们的任何代码周围添加适当的#if 条件。由于您没有提及任何具体错误,我只能说它对我有用。
  • 我已经在 #if UNITY_ANDROID 条件中包含了对 Firebase 的所有引用,正如我所提到的,我已经尝试在检查器中取消选中它们。我遇到的问题是启用推送通知后我的应用程序崩溃了,根据调试日志,它在 FCM 初始化时是正确的,所以我几乎可以肯定这就是问题所在。

标签: ios firebase unity3d


【解决方案1】:

终于明白了。发布我的解决方案以帮助其他人搜索(从 Google 搜索看来,很多人都在寻找这个但没有答案)。

从您的 iOS 版本中删除 Firebase Cloud Messaging (FCM):

  1. 为 Android 添加所需的任何 Firebase 模块。
    • 我添加了分析、身份验证和消息传递。
  2. google-services.jsonGoogleService-info.plist 文件添加到 Assets 文件夹中的某个位置(我将我的文件放在 Assets/Firebase 文件夹中)。
  3. 取消选中检查器中消息插件的“iOS”(在“为插件选择平台”下)。插件位于两个地方:
    • Assets/Firebase/Plugins/iOS/Firebase.Messaging
    • 资产/插件/iOS/Firebase/libFirebaseCppMessaging
  4. 从依赖文件中删除 pod。
    • 打开文件 Assets/Firebase/Editor/MessagingDependencies 并删除以下行(<iosPods> 标记内的所有内容):
<iosPod name="Firebase/Messaging" version="8.9.1" minTargetSdk="9.0">
  1. 在您的代码(通常是 FirebaseApp.CheckAndFixDependenciesAsync())中初始化 Firebase 之后,请确保对这些行使用 #if UNITY_ANDROID 条件:
#if UNITY_ANDROID
    FirebaseMessaging.TokenReceived += OnTokenReceived;
    FirebaseMessaging.MessageReceived += OnMessageReceived;
#endif

从 iOS 版本中删除 所有 Firebase:

  1. 为 Android 添加所需的任何 Firebase 模块。
    • 我添加了分析、身份验证和消息传递。
  2. google-services.jsonGoogleService-info.plist 文件添加到 Assets 文件夹中的某个位置(我将我的文件放在 Assets/Firebase 文件夹中)。
  3. 取消选中位于以下文件夹中的检查器中所有插件模块的“iOS”(在“为插件选择平台”下):
    • 资产/Firebase/插件/iOS/
      • 就我而言,Firebase.AnalyticsFirebase.AppFirebase.AuthFirebase.Messaging
    • 资产/插件/iOS/Firebase/
      • 就我而言,libFirebaseCppAnalyticslibFirebaseCppApplibFirebaseCppAuthlibFirebaseCppMessaging
  4. 需要取消选中以下文件的“iOS”:
    • 资产/Firebase/Plugins/Firebase.Platform
    • 资产/Firebase/Plugins/Firebase.TaskExtension
  5. 从所有依赖文件中删除 pod。
    • 在 Assets/Firebase/Editor/ 文件夹中有几个 Dependencies 文件。打开它们中的每一个(您添加的每个模块都应该有一个,加上一个应用程序)并删除 &lt;iosPods&gt; 标记内的所有内容。
    • 就我而言,AnalyticsDependenciesAppDependenciesAuthDependenciesMessagingDependencies
  6. 使用#if UNITY_ANDROID 条件确保在 iOS 版本中删除对 Firebase 的任何引用。
#if UNITY_ANDROID
  using Firebase;
  using Firebase.Messaging;
#endif
#if UNITY_ANDROID
  FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
    var dependencyStatus = task.Result;
    if (dependencyStatus == DependencyStatus.Available) {

      app = FirebaseApp.DefaultInstance;
  
      firebaseAPIReady = true;
 
      FirebaseMessaging.TokenReceived += OnTokenReceived;
      FirebaseMessaging.MessageReceived += OnMessageReceived;
  
    } else {
      Debug.LogError(string.Format(
        "GameManager: Could not resolve all Firebase dependencies: {0}", dependencyStatus));
    }
  });
#endif

我的应用崩溃的原因:

如上所述,在游戏中启用推送通知后,我的应用会在启动时崩溃,然后退出应用。

事实证明,iOS 15 上的 Unity IPA(应用内购买)包版本 1.4.2 存在一个错误。它已被标记为问题,应该在版本 1.4.3 中修复,但目前,有如下所示的解决方法: https://github.com/Unity-Technologies/com.unity.mobile.notifications/issues/121#issuecomment-956703241

请务必在您创建的文件顶部添加以下指令:

using System.IO;
using System.Linq;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 2020-11-22
    • 2014-03-24
    • 2020-01-05
    • 2019-11-08
    • 2018-04-30
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多