在 Unity 中对 onMessageReceived 函数进行 FCM 自定义处理



我正在为统一开发FCM,当android客户端收到推送通知时,我需要发送一些统计信息。

为此,如果应用程序处于前台,我能够处理这种情况。但是如果应用程序被杀死/后台,我将无法处理这种情况。

任何人都可以帮助实现这种情况。

为此,我遇到了 https://firebase.google.com/docs/cloud-messaging/cpp/client#custom_message_handling_on_android

我尝试覆盖ListenerService方法,对于这种方法,我尝试创建一个jar,但是每当我无法导入"com.google.firebase.messaging.cpp.ListenerService"时。

您能否建议我如何实现此功能

首先,您缺少的 jar 是 Firebase C++ SDK 的一部分。在一个普通的C++和Android项目中,你会有这样的东西:

apply from: "$gradle.firebase_cpp_sdk_dir/Android/firebase_dependencies.gradle"
firebaseCpp.dependencies {
messaging
}

如果要执行"创建 jar"路线,则需要引用这些依赖项,也不能与 Unity 外部依赖项管理器 (EDM4U( 冲突。我会推荐这篇文章来了解那里发生的事情,但拥有自由浮动的 Java 或 Kotlin 文件并让 EDM4U 做它的事情可能更方便。

话虽如此,我相信您不需要在 Unity 中配置该方法。您应该看到此表,以了解您可以在前台和后台处理和不能处理的内容。如果您正在发送数据消息(而不是通知消息(并且未触发 MessageReceived,则可能需要执行一些本机 Android 活动工作(来自 Unity 文档,而不是 OP 中链接的C++(。

请记住,这仅适用于您在 Android 上有自定义活动的情况,无论是您设置了一个还是另一个插件设置了。您需要重写 onNewIntent 才能将数据发送到消息转发服务。在onCreate中还有一些明确的清理要做,我已经粘贴了下面的整个示例:

/**
* Workaround for when a message is sent containing both a Data and Notification payload.
*
* When the app is in the background, if a message with both a data and notification payload is
* received the data payload is stored on the Intent passed to onNewIntent. By default, that
* intent does not get set as the Intent that started the app, so when the app comes back online
* it doesn't see a new FCM message to respond to. As a workaround, we override onNewIntent so
* that it sends the intent to the MessageForwardingService which forwards the message to the
* FirebaseMessagingService which in turn sends the message to the application.
*/
@Override
protected void onNewIntent(Intent intent) {
Intent message = new Intent(this, MessageForwardingService.class);
message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT);
message.putExtras(intent);
message.setData(intent.getData());
startService(message);
}
/**
* Dispose of the mUnityPlayer when restarting the app.
*
* This ensures that when the app starts up again it does not start with stale data.
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
if (mUnityPlayer != null) {
mUnityPlayer.quit();
mUnityPlayer = null;
}
super.onCreate(savedInstanceState);
}

如果两者都无法转发消息,请在此处或 GitHub 上提交错误。如果您仍然遇到缺少依赖项的问题,您可能需要在 Unity 中使用自定义 gradle 模板,并可能将新代码添加为模块。然后,您可以正确使用实现并使用 EDM4U。

我知道这有很多东西需要解开,所以如果您还有任何具体问题,请告诉我!

--帕特里克

相关内容

  • 没有找到相关文章

最新更新