問題描述
在Android 8.0以上的設備集成推送SDK后,發現推送的信息接收不到,查看日志顯示通知已經從服務端發送到客戶端,但是并未創建通知。
問題原因
自Android 8.0(API Level 26)起,Android推出了NotificationChannel機制,旨在對通知進行分類管理。如果用戶App的targetSdkVersion大于等于26,且并未設置NotificaitonChannel,那么創建的通知是不會彈出顯示。
解決方案
阿里云提醒您:
- 如果您對實例或數據有修改、變更等風險操作,務必注意實例的容災、容錯能力,確保數據安全。
- 如果您對實例(包括但不限于ECS、RDS)等進行配置與數據修改,建議提前創建快照或開啟RDS日志備份等功能。
- 如果您在阿里云平臺授權或者提交過登錄賬號、密碼等安全信息,建議您及時修改。
阿里云移動推送自V3.1.1版本開始支持NotificationChannel機制,您可以參考以下接入步驟定位并解決問題:
集成新版SDK
- 集成移動推送SDK V3.1.1及其以上版本
- 集成服務端OpenApi SDK V3.9.0及其以上版本:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-push</artifactId>
<version>3.9.0</version>
</dependency>
注冊NotificationChannel
參考以下代碼,在客戶端創建自己的NotificationChannel。具體調用位置為Application的onCreate,阿里云移動推送初始化前后都可以注冊,詳情請參見Demo。
注意:修改NotificationChannel后,App需要卸載重裝才會生效。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 通知渠道的id。
String id = "1";
// 用戶可以看到的通知渠道的名字。
CharSequence name = "notification channel";
// 用戶可以看到的通知渠道的描述。
String description = "notification description";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel mChannel = new NotificationChannel(id, name, importance);
// 配置通知渠道的屬性。
mChannel.setDescription(description);
// 設置通知出現時的閃燈(如果Android設備支持的話)。
mChannel.enableLights(true);
mChannel.setLightColor(Color.RED);
// 設置通知出現時的震動(如果Android設備支持的話)。
mChannel.enableVibration(true);
mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
// 最后在notificationmanager中創建該通知渠道。
mNotificationManager.createNotificationChannel(mChannel);
}
推送通知
利用OpenApi推送
在服務端推送時指定其NotificationChannelid,詳情請參見如下代碼:
@Test
public void testAdvancedPush() throws Exception {
PushRequest pushRequest = new PushRequest();
// 推送目標。
pushRequest.setAppKey(appKey);
pushRequest.setTarget("DEVICE"); // 推送目標。DEVICE:推送給設備、ACCOUNT:推送給指定賬號、TAG:推送給自定義標簽、ALL:推送給全部。
pushRequest.setTargetValue("xxxxxxxxxxxxxxx");
pushRequest.setPushType("NOTICE"); // 消息類型。取值為MESSAGE、NOTICE。
pushRequest.setDeviceType("ANDROID"); // 設備類型。取值為ANDROID、iOS、ALL。
// 推送配置。
pushRequest.setTitle("ALi Push Title"); // 消息的標題。
pushRequest.setBody("Ali Push Body"); // 消息的內容。
// 推送配置:Android。
pushRequest.setAndroidNotifyType("BOTH");//通知的提醒方式。VIBRATE:震動、SOUND:聲音、BOTH:聲音和震動、NONE:靜音。
pushRequest.setAndroidOpenType("APPLICATION"); //點擊通知后動作。APPLICATION:打開應用、ACTIVITY:打開AndroidActivity、URL:打開URL、NONE:無跳轉。
// 指定notificaitonchannel id。
pushRequest.setAndroidNotificationChannel("1");
......
}
利用阿里云控制臺推送
- 登錄EMAS控制臺,單擊左側移動推送,選擇對應的產品及其應用,單擊左側推送通知。
- 然后單擊高級設置(選填),填寫通知通道,也就是上述客戶端注冊的NotificationChannel的id,然后單擊確定發送即可。
NotificationChannel注意事項
- 指定NotificationChannel后,通知的提醒方式(震動、聲音等)均為NotificationChannel所指定的提醒方式,服務端的提醒方式配置不再生效。
- NotificationChannel的通知權限,一般品牌是默認給權限的,但是OPPO和VIVO默認不給權限,需要開啟權限。
適用于
- 移動推送
文檔內容是否對您有幫助?