A3L中基于主题的消息传递
A3L中基于主题的消息传递
基于主题的消息传递可让您向订阅相同主题的用户组发送消息。要使用基于主题的消息传递来发送消息,Android或Fire OS设备上的应用程序实例必须订阅主题。A3L Messaging为Amazon Device Messaging (ADM)和Firebase Cloud Messaging (FCM) API中的subscribeToTopic()
和unsubscribeFromTopic()
方法提供抽象。
注册您的安全配置文件
对于Fire OS设备,必须通过ADM注册基于主题的消息传递的安全配置文件。有关说明,请参阅为基于主题的消息传递注册安全配置文件。在FCM中使用基于主题的消息传递不需要此步骤。
订阅或取消订阅主题
要为您的应用订阅ADM或FCM主题,请调用A3L Messaging subscribeToTopic()
方法并将主题名称传递给它。此方法返回一个Task
,完成侦听器可以使用它来确定订阅是否成功,如以下代码所示。
A3LMessaging.subscribeToTopic(topic).addOnCompleteListener(
new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
String msg = "已订阅";
if (!task.isSuccessful()) {
msg = "订阅失败";
}
Log.d(TAG, msg);
}
}
);
要为您的应用取消订阅ADM或FCM主题,请调用A3L Messaging unsubscribeFromTopic()
方法并将主题名称传递给它。此方法返回一个Task
,完成侦听器可以使用它来确定取消订阅是否成功,如以下代码所示。
A3LMessaging.unsubscribeFromTopic(topic).addOnCompleteListener(
new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
String msg = "Unsubscribed";
if (!task.isSuccessful()) {
msg = "取消订阅失败";
}
Log.d(TAG, msg);
}
}
);
使用服务器端脚本进行测试
要测试基于主题的消息传递,您可以使用这些服务器端脚本向主题发送消息。
- ADMSendMessageToTopic.py是一个python脚本,它向Fire OS设备发送基于主题的消息。
- FCMSendMessageToTopic.py是一个python脚本,它向Android设备发送基于主题的消息。
单击以下按钮获取脚本代码。要发送测试消息,请复制代码,将其粘贴到编辑器中,并更新注释中指示的值。然后将每个脚本保存为.py文件并运行脚本。
已复制到剪贴板。
ADMSendMessageToTopic.py
import requests
import json
# 更新这些值以发送推送通知
# 用于发送ADM消息的客户端ID
client_id = ""
# 用于发送ADM消息的客户端密钥
client_secret = ""
# 要向其发送通知的主题
topic = ""
notification = {"title":"A3L通知","body":"A3L通知在Fire OS平台上正常运行!"}
########### 请勿更改此行下方的任何代码 ##################
Auth_token_URL = "https://api.amazon.com/auth/O2/token"
auth_token_headers = {'Content-Type' : 'application/x-www-form-urlencoded', 'Accept-Charset' : 'application/x-www-form-urlencoded'}
auth_token_data = {'grant_type' : 'client_credentials', 'scope': 'messaging:push', 'client_id': client_id, 'client_secret': client_secret}
send_message_to_topic_url = "https://api.amazon.com/v1/messaging/topic/messages"
send_message_to_topic_headers = {'Accept' : 'application/json', 'Content-Type': 'application/json', 'x-amzn-type-version': 'com.amazon.device.messaging.ADMMessage@1.0', 'x-amzn-accept-type': 'com.amazon.device.messaging.ADMSendResult@1.0'}
a3l_prefix = "a3l.notification."
def transformAndroidNotifcationToA3LNotification(notification):
a3l_notification = {"data":{}}
for notification_key, notification_value in notification.items():
a3l_notification["data"][ a3l_prefix + notification_key] = notification_value
return a3l_notification
def getAccessToken():
r = requests.post(Auth_token_URL, data = auth_token_data, headers = auth_token_headers)
json_response = r.json()
auth_token = json_response["access_token"]
return auth_token
def sendMessageToTopic():
auth_token = "Bearer " + getAccessToken()
send_message_to_topic_headers['Authorization'] = auth_token
send_message_data = transformAndroidNotifcationToA3LNotification(notification)
send_message_data["topic"] = topic
r = requests.post(send_message_to_topic_url, data = json.dumps(send_message_data), headers = send_message_to_topic_headers)
print('成功发送消息:', r.json())
sendMessageToTopic()
已复制到剪贴板。
FCMSendMessageToTopic.py
import firebase_admin
from firebase_admin import credentials
from firebase_admin import messaging
# 更新这些值以发送推送通知
# 这是Admin SDK JSON文件,其中包含
# 您的Firebase服务器凭证
admin_sdk_json_file = "Admin SDK JSON文件的路径"
# 要向其发送通知的主题
topic = ""
########### 请勿更改此行下方的任何代码 ##################
cred = credentials.Certificate(admin_sdk_json_file)
firebase_admin.initialize_app(cred)
def send_to_topic():
message = messaging.Message(
notification=messaging.Notification(
title='A3L通知',
body='A3L通知在Android平台上正常运行!',
),
topic = topic
)
response = messaging.send(message)
print('成功发送消息:', response)
send_to_topic()
使用特定于解决方案的API测试
您还可以使用特定于解决方案的API测试基于主题的消息传递。有关如何通过ADM和FCM API向主题发送消息的详细说明,请参考以下指南。