Closed gaoyong06 closed 4 years ago
问题1: 现在可以了,在umeng后台多推了几条,可以了收到了 问题3: 我现在将UmengAnalyticsPush.addPushCustomMessageCallback 叫到了app首页的build方法里面,在应用在前台的时候,是可以点击了,也能收到自定义数据。但是当点击手机的home,将应用退到后台(此时应用没有被杀死),手机可以收到推送,但是点击推送时,没有任何反应,是不是应该在androidManifest里面配置个service之类的?
对于第三个问题,我只是封装了Umeng的UmengNotificationClickHandler方法,在方法中调用了推送到flutter的stream,你可以跟踪看看,在后台的时候UmengNotificationClickHandler里面的dealWithCustomAction是不是调用了
对于第二个问题,你可以在进入flutter的某个页面widget时候,调用一下pageStart,离开的时候调用pageEnd即可
以下是友盟的备注: UmengNotificationClickHandler是在BroadcastReceiver中被调用,因此若需启动Activity,需为Intent添加Flag:Intent.FLAG_ACTIVITY_NEW_TASK,否则无法启动Activity。
对于第二个问题,你可以在进入flutter的某个页面widget时候,调用一下pageStart,离开的时候调用pageEnd即可
感谢回复,这个我觉得参考下 这个项目的实现 在封装一个NavigatorObserver,是不是更便利一些?
以下是友盟的备注: UmengNotificationClickHandler是在BroadcastReceiver中被调用,因此若需启动Activity,需为Intent添加Flag:Intent.FLAG_ACTIVITY_NEW_TASK,否则无法启动Activity。
嗯嗯,理论上是可以的,但实际操作的时候,确实不行。 因为现在的跳转是在flutter里面是通过Navigator.push 这样跳转,我现在的实现方案是这样的:
假设: 在umeng push的自定义数据是:qzone://www.qqhot.com/feed/feed_info?feed_id=uzV55I8aS3m5 这是一个业务上的Uri String 期望用户收到推送后点击后跳转至这个Uri 项目的首页对应的一个flutter文件是:qzone_app/lib/pages/BottomTabs.dart Android启动Activity是MainActivity.kt
流程是: 用户点击推送 先打开MainActivity.kt, 然后 BottomTabs.dart,调用MainActivity.kt中定义的方法getIntentDataString,获取到启动MainActivity.kt时传递的Android Intent.dataString(就是上面提到的Uri) 然后在Navigator.push来跳转至该Uri
实现:qzone_app/android/app/src/main/AndroidManifest.xml
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Deep Links -->
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with YOUR_SCHEME://YOUR_HOST -->
<data
android:scheme="qzone"
android:host="www.qqhot.com" />
</intent-filter>
</activity>
qzone_app/android/app/src/main/kotlin/cc/qzone_app/MainActivity.kt, 定义一个getIntentDataString 方法,获取到intent.dataString,然后通过flutter的页面获取
package cc.qzone
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
import io.github.zileyuan.umeng_analytics_push.UmengAnalyticsPushFlutterAndroid
import android.os.Bundle
import android.content.Intent
import io.flutter.embedding.engine.dart.DartExecutor
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import android.util.Log
///参考文档:
/// https://flutterchina.club/platform-channels/
/// https://www.jianshu.com/p/2e48cd960531
class MainActivity: FlutterActivity() {
private var sharedText = "NO DATA"
private val CHANNEL = "app.channel.shared.data"
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
var intent : Intent = intent
var action : String? = intent.action
Log.d("qzone", "action: $action")
var type : String? = intent.type
Log.d("qzone", "type: $type")
var uri : String? = intent.toUri(0);
Log.d("qzone", "uri: $uri")
var dataString : String? = intent.dataString
Log.d("qzone", "dataString: $dataString")
if (Intent.ACTION_SEND.equals(action) && type != null) {
if ("text/plain".equals(type)) {
handleSendText(intent) // Handle text being sent
}
}
var flutterView : DartExecutor? = flutterEngine.dartExecutor
MethodChannel(flutterView, CHANNEL).setMethodCallHandler {call, result ->
when (call.method) {
"getSharedText" -> {
result.success(sharedText)
sharedText = ""
}
"getIntentDataString" -> {
result.success(dataString)
}
else -> {
result.notImplemented()
}
}
}
}
override fun onResume() {
super.onResume()
UmengAnalyticsPushFlutterAndroid.androidOnResume(this)
}
override fun onPause() {
super.onPause()
UmengAnalyticsPushFlutterAndroid.androidOnPause(this)
}
private fun handleSendText(intent: Intent ) {
sharedText = if (intent.getStringExtra(Intent.EXTRA_TEXT) != null) intent.getStringExtra(Intent.EXTRA_TEXT) else "NO DATA"
}
}
qzone_app/lib/pages/BottomTabs.dart 获取到intentDataString后,然后通过Navigator.push来跳转
///获取从qzone_app/android/app/src/main/kotlin/cc/qzone_app/MainActivity.kt
///中执行getIntentDataString获取到的Intent Data String
getIntentDataString() async {
var intentDataString = await platform.invokeMethod("getIntentDataString");
if (intentDataString != null) {
logger.d("intentDataString: $intentDataString");
Routes.openQzoneUri(context, intentDataString);
}
}
对于第二个问题,你可以在进入flutter的某个页面widget时候,调用一下pageStart,离开的时候调用pageEnd即可
感谢回复,这个我觉得参考下 这个项目的实现 在封装一个NavigatorObserver,是不是更便利一些?
我觉得做的纯粹一点,不想参与到flutter本身的一些机制里面,毕竟每个人的目的和做法不一样,提供基本功能,大家自己去实现也不是多麻烦的事情
以下是友盟的备注: UmengNotificationClickHandler是在BroadcastReceiver中被调用,因此若需启动Activity,需为Intent添加Flag:Intent.FLAG_ACTIVITY_NEW_TASK,否则无法启动Activity。
嗯嗯,理论上是可以的,但实际操作的时候,确实不行。 因为现在的跳转是在flutter里面是通过Navigator.push 这样跳转,我现在的实现方案是这样的:
假设: 在umeng push的自定义数据是:qzone://www.qqhot.com/feed/feed_info?feed_id=uzV55I8aS3m5 这是一个业务上的Uri String 期望用户收到推送后点击后跳转至这个Uri 项目的首页对应的一个flutter文件是:qzone_app/lib/pages/BottomTabs.dart Android启动Activity是MainActivity.kt
流程是: 用户点击推送 先打开MainActivity.kt, 然后 BottomTabs.dart,调用MainActivity.kt中定义的方法getIntentDataString,获取到启动MainActivity.kt时传递的Android Intent.dataString(就是上面提到的Uri) 然后在Navigator.push来跳转至该Uri
实现:qzone_app/android/app/src/main/AndroidManifest.xml
<activity android:name=".MainActivity" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> <!-- Deep Links --> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.DEFAULT"/> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- Accepts URIs that begin with YOUR_SCHEME://YOUR_HOST --> <data android:scheme="qzone" android:host="www.qqhot.com" /> </intent-filter> </activity>
qzone_app/android/app/src/main/kotlin/cc/qzone_app/MainActivity.kt, 定义一个getIntentDataString 方法,获取到intent.dataString,然后通过flutter的页面获取
package cc.qzone import androidx.annotation.NonNull import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugins.GeneratedPluginRegistrant import io.github.zileyuan.umeng_analytics_push.UmengAnalyticsPushFlutterAndroid import android.os.Bundle import android.content.Intent import io.flutter.embedding.engine.dart.DartExecutor import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler import android.util.Log ///参考文档: /// https://flutterchina.club/platform-channels/ /// https://www.jianshu.com/p/2e48cd960531 class MainActivity: FlutterActivity() { private var sharedText = "NO DATA" private val CHANNEL = "app.channel.shared.data" override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine) var intent : Intent = intent var action : String? = intent.action Log.d("qzone", "action: $action") var type : String? = intent.type Log.d("qzone", "type: $type") var uri : String? = intent.toUri(0); Log.d("qzone", "uri: $uri") var dataString : String? = intent.dataString Log.d("qzone", "dataString: $dataString") if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent) // Handle text being sent } } var flutterView : DartExecutor? = flutterEngine.dartExecutor MethodChannel(flutterView, CHANNEL).setMethodCallHandler {call, result -> when (call.method) { "getSharedText" -> { result.success(sharedText) sharedText = "" } "getIntentDataString" -> { result.success(dataString) } else -> { result.notImplemented() } } } } override fun onResume() { super.onResume() UmengAnalyticsPushFlutterAndroid.androidOnResume(this) } override fun onPause() { super.onPause() UmengAnalyticsPushFlutterAndroid.androidOnPause(this) } private fun handleSendText(intent: Intent ) { sharedText = if (intent.getStringExtra(Intent.EXTRA_TEXT) != null) intent.getStringExtra(Intent.EXTRA_TEXT) else "NO DATA" } }
qzone_app/lib/pages/BottomTabs.dart 获取到intentDataString后,然后通过Navigator.push来跳转
///获取从qzone_app/android/app/src/main/kotlin/cc/qzone_app/MainActivity.kt ///中执行getIntentDataString获取到的Intent Data String getIntentDataString() async { var intentDataString = await platform.invokeMethod("getIntentDataString"); if (intentDataString != null) { logger.d("intentDataString: $intentDataString"); Routes.openQzoneUri(context, intentDataString); } }
你的做法可以给后来人参~~~
内置解决了问题
作者,您好,我在使用umeng_analytics_push遇到了3个问题
问题1. umeng push 集成以后,我在umeng push的后台,推送了5,6条,app的日志上都有答应,看起来都是正常的,但是手机的通知栏里面不显示
我在umeng的官网和百度上翻了一下,没找到通知栏里不显示通知原因,但是排除了几个可能的原因: 1)umeng Push后台设置的包名,和androidManifest里面的package名,以及build.grade里面的applicationId 不一致 . (我这里都是一致的) 2)手机上 app的推送通知 在手机设置 里面没有打开,(我这里是打开的) 3) "是否调用了PushAgent的setPushIntentServiceClass方法,如果调用了,需自己写代码实现通知的弹出。" (这个目前不确定,但是在umeng_analytics_push里面搜索“setPushIntentServiceClass” 也没找到相关的内容)
在umeng发送推送通知后,app显示的日志:
问题2.
页面埋点操作 import 'package:umeng_analytics_push/umeng_analytics_push.dart';
该如何使用,可不可以有个示例?
问题3: 自定义点击Push响应(需要初始化时候打开开关) import 'package:umeng_analytics_push/umeng_analytics_push.dart';
该如何使用,可不可以有个示例?