2

虽然我已经创建了一个 Firebase 应用内消息点击监听器,但它会在点击按钮时尝试打开 android 系统。

像这样的网址:https://site_url/product_id

我想在逻辑操作后打开这个 url。

class MainActivity : AppCompatActivity() : FirebaseInAppMessagingClickListener {

  override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
      ....

     FirebaseInAppMessaging.getInstance().addClickListener(this)
     FirebaseInAppMessaging.getInstance().triggerEvent("main_activity_ready")
}

  override fun messageClicked(message: InAppMessage, action: Action) {
    val url =( action.actionUrl ?: "")
    Log.d(TAG, "in-app messaging url : $url")
    linkParsePresenter.startLinkParse(url, PreviousPage.InAppMessaging) // This is my logic function.

}
}

在此处输入图像描述

调用了 messageClicked 函数。没有问题。但是系统也试图打开这个 url。如何覆盖或禁用它?

4

3 回答 3

3

我也在为此苦苦挣扎。

不幸的是,目前似乎没有办法解决它。Firebase 将调用您的 custom FirebaseInAppMessagingClickListener,但无论如何它都会尝试导航到提供的操作 URL。

这是摘录自FirebaseInAppMessagingDisplay

actionListener = new OnClickListener() {
                    public void onClick(View v) {
                        if (FirebaseInAppMessagingDisplay.this.callbacks != null) {
                            FirebaseInAppMessagingDisplay.this.callbacks.messageClicked(action);
                        }

                        CustomTabsIntent i = (new Builder()).setShowTitle(true).build();
                        i.launchUrl(activity, Uri.parse(action.getActionUrl()));
                        FirebaseInAppMessagingDisplay.this.notifyFiamClick();
                        FirebaseInAppMessagingDisplay.this.removeDisplayedFiam(activity);
                        FirebaseInAppMessagingDisplay.this.inAppMessage = null;
                        FirebaseInAppMessagingDisplay.this.callbacks = null;
                    }
                };

如您所见,Firebase 将运行所有自定义回调,然后尝试导航,不管launchUrl(activity, Uri.parse(action.getActionUrl())).

我能想到的唯一选择是按照Customize your Firebase In-App Messaging messages中的建议正确支持您的应用中的深层链接。

于 2020-04-22T02:28:37.790 回答
1

我通过添加一个处理深层链接的透明活动来解决它。

  1. 创建空活动;
class FirebaseEmptyActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        finish()
    }

}
  1. 在清单中声明它:
<activity
   android:name=".FirebaseEmptyActivity"
   android:theme="@style/Theme.Transparent">

   <intent-filter>
      <action android:name="android.intent.action.VIEW" />

      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />

      <data
         android:host="example.com"
         android:pathPrefix="/path-to-access"
         android:scheme="customscheme" />
   </intent-filter>
</activity>

因此,上述深层链接适用于:customScheme://example.com/path-to-access

声明一个透明的主题:

<style name="Theme.Transparent" parent="AppTheme.NoActionbar">
   <item name="android:windowIsTranslucent">true</item>
   <item name="android:windowBackground">@android:color/transparent</item>
   <item name="android:windowContentOverlay">@null</item>
   <item name="android:windowNoTitle">true</item>
   <item name="android:windowIsFloating">false</item>
   <item name="android:backgroundDimEnabled">false</item>
</style>

现在在您的活动中听按钮单击:

FirebaseInAppMessaging.getInstance().removeAllListeners()
FirebaseInAppMessaging.getInstance().addClickListener { inAppMessage, action -> 
   if (action.actionUrl?.contains("your custom scheme url...") == true) {
      // The button was clicked for that action...
   }
}
于 2021-06-24T12:49:29.110 回答
0

Firebase 应用内消息 (FIAM) 处于测试阶段,目前不支持动态链接以外的操作。并且动态链接仍然是链接,所以它总是会先尝试导航到网络。跳出应用程序然后返回(这使它看起来像病毒)

我认为更好的选择是改用 Firebase Cloud Messaging。实现看起来更复杂,但我强烈建议观看这个人详细解释所有内容:https ://www.youtube.com/watch?v=p7aIZ3aEi2w

Firebase 云消息传递优于 Firebase 应用内消息传递的优势:

  • 推送通知 - 如果 FIAM 的目标是与用户沟通,这可以完成
  • 自定义数据 - 可以将键/值有效负载发送到应用程序,因此您可以自定义点击操作处理程序,比 FIAM 更好,它始终打开动态链接
  • 静默消息 - 如果您真的想在没有通知部分的情况下复制 FIAM,您可以发送静默消息并使用应用程序中的自定义对话框处理有效负载(静默消息只能从服务器发送,尚不能通过 Firebase 控制台发送)
  • FCM 可以作为 FIAM 进行 A/B 测试

希望对您有所帮助,并希望 Firebase 在未来使 FIAM 更加用户友好(例如使用自定义回调来处理按钮的点击)

于 2022-02-12T00:54:23.980 回答