我正在开发一个从Firebase接收推送通知的Android应用程序。
我可以毫无问题地获取令牌并从Postman发送推送通知。
如果App位于前台,一切都按预期工作,我在onMessageReceived中接收了有效负载(我测试了各种有效负载)。
但如果我关闭应用程序它就什么也得不到。我尝试了很多有效载荷,并且我阅读了所有文档(数据和有效载荷中的通知之间的差异)。
这是我的项目使用的课程:
1 - 扩展FirebaseMessagingService的类
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "Android Push App";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
sendNotification("Received notification");
}
private void sendNotification(String messageBody) {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.push_icon)
.setContentTitle("FCM Message")
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
2 - 负责获取令牌的类
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static String TAG = "Android Push App";
@Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
sendRegistrationToServer(refreshedToken);
}
private void sendRegistrationToServer(String token) {
Log.d(TAG, "Did obtained token");
Log.d(TAG, token);
}
3 - 我的清单:
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="FIREBASE_ACTIVITY" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<service android:name=".push.core.MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service
android:name=".push.core.MyFirebaseMessagingService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/push_icon" />
<meta-data android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorAccent" />
</application>
4 - MainActivity
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (getIntent().getExtras() != null) {
for (String key : getIntent().getExtras().keySet()) {
Object value = getIntent().getExtras().get(key);
Log.d("MainActivity", "Key: " + key + " Value: " + value);
}
}
}
5 - 最后我在Postman中尝试了这个有效载荷
POST https://fcm.googleapis.com/fcm/send Content-Type application / json 授权密钥= AIzaSy(...)kY
JSON Body(我试过的例子):
{
"to": "dxe0RDKbP...m9Uc","notification" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
"icon" : "push_icon",
"sound" : "default"
}}
和
{
"to": "dxe0RDKbP...m9Uc","notification" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
"icon" : "push_icon",
"sound" : "default"
}}
和
{
"to": "d3j-9OJ6R...C6w",
"notification" : {
"title": "title",
"body": "body"
},
"data": {
"tipo": "normal"
}}
还添加了&#34;优先级&#34;关键,它不起作用。
我做错了什么?
感谢您给予我的所有帮助:)
更新
现在它正在运作。
FireBaseMessagingService与正在运行的Geofence Push之间存在冲突(由应用程序触发)。
删除此Geofence服务后,一切都按预期工作。
还可以在推送的有效负载中使用通知和数据键。
由于
答案 0 :(得分:1)
试试这个
您不得在请求中将JSON密钥'notification'
放入firebase API,而是使用'data'
。
示例强>
使用此
{
"to": "dxe0RDKbP...m9Uc",
"data": {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
"icon" : "push_icon",
"sound" : "default"
}
}
修改强> 你可以尝试只使用正文和标题
{
"to": "dxe0RDKbP...m9Uc",
"data": {
"body" : "great match!",
"title" : "Portugal vs. Denmark"
}
}
修改新
在清单文件android:stopWithTask="false"
服务属性中添加此内容。
<service
android:name="com.yourapp.YourPushService"
android:stopWithTask="false"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
答案 1 :(得分:0)
您需要从json中删除通知负载并向其添加数据负载。这是因为Android具有内置功能,可以在看到通知有效负载时处理通知,即,每当发送通知有效负载时,android直接将其发送到系统dray和onMessageReceived函数,不会被调用。
答案 2 :(得分:0)
根据firebase文档,Firebase通知的行为会有所不同,具体取决于接收应用的前景/背景状态。
为大多数消息类型提供了onMessageReceived,但以下情况除外:
当您的应用在后台时传递通知消息。在这种情况下,通知将传递到设备的系统托盘。用户点按通知会默认打开应用启动器。
包含通知和数据有效负载的消息,包括后台和前台。在这种情况下,通知将传递到设备的系统托盘,并且数据有效负载将在启动器活动的附加内容中传递。
因此,您需要从json中删除通知有效内容,并且只需要在应用程序处于后台时保持数据有效负载触发onMessageReceived。
链接:https://firebase.google.com/docs/cloud-messaging/android/receive