【问题标题】:How can I disable Firebase In-App Messaging button action open url如何禁用 Firebase 应用内消息按钮操作打开 url
【发布时间】:2020-03-25 13:49:44
【问题描述】:

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

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

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

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。如何覆盖或禁用它?

【问题讨论】:

    标签: android firebase-in-app-messaging


    【解决方案1】:

    我也在为此苦苦挣扎。

    不幸的是,目前似乎没有办法解决它。 Firebase 将调用您的自定义 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 中的建议正确支持您的应用中的深层链接。

    【讨论】:

      【解决方案2】:

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

      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...
         }
      }
      

      【讨论】:

        【解决方案3】:

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

        我认为更好的选择是使用 Firebase 云消息传递。实现看起来更复杂,但我强烈建议看这个人详细解释一切:https://www.youtube.com/watch?v=p7aIZ3aEi2w

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-16
          • 2012-10-14
          • 1970-01-01
          • 1970-01-01
          • 2019-12-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多