移動推送
提供從雲端到移動終端的優質推送服務,支援Android和iOS平台的通知/消息的推送功能.
推送内容及模式
通知:會自動在手機端彈出通知欄,使用者可以打開或者清除通知欄。iOS的通知走APNs(蘋果官方推送通知服務),android 走移動推送自己的通道
消息:不會自動在通知欄彈出,會在app中提示消息的接收。iOS和android的消息都走移動推送自己的通道
推送方式
按裝置号推送,在用戶端調用getDeviceld獲得裝置号,再通過控制台/openapi接口推送
名詞解釋
AppKey:app在移動推送中的唯一标示。推送SDK初始化和調用openapi推送時需要,從推送控制台APP清單頁的應用證書中擷取。
AppSecret:app的秘鑰。推送SDK初始化時需要,從推送控制台APP清單頁的應用證書中擷取。
accessKeyld和accessKeySecret:阿裡雲使用者使用雲産品的openapi接口驗權時需要,從阿裡雲官網控制台擷取
https://ak-console.aliyun.com/#/accesskeyresponseld:openapi推送請求傳回ID(如需排查問題可告訴客戶人員該ID)。
messageld:某一次推送的消息ID。從控制台通知記錄/消息記錄中可以找到消息ID。
deviceld:裝置在推送的唯一标示。 32位,數字和小寫字母組合,通過代碼擷取:Android:CloudPushService的getDeviceld方法,iOS:CloudPushSDK的getDeviceld方法。
deviceToken:iOS裝置在蘋果中心注冊時傳回的64位裝置辨別符(iOS裝置同時會有deviceld和deviceToken,請不要混淆)。
account:給裝置添加的賬号,可以是任意您的業務需要的,一個裝置隻能添加一個account,account可以添加多個裝置。
alias:給裝置添加的别名,可以是任意您的業務需要的,一個裝置可以最多添加128個alias,一個alias可以最多添加128個裝置。
tag:給裝置添加的标簽,可以是任意您的業務需要的,一個appkey最多能綁定1萬個tag,一個tag下綁定的裝置沒有限制
限制說明
targetValue如果為集合,按别名或者裝置推送,一次最多傳遞1000個(通過“,”分割),按賬戶推送,則最多傳遞100個;
每個App最多建立1萬個tag,tag名稱要小于等于128個字元(中文算1個),一個Tag下可以綁定多個裝置,裝置個數沒有限制;
開始配置
Android配置: 勾選Android,并填入PackageName,包名需要與您的代碼中的applicationID保持一緻。請務必確定您建立的不同應用具有不同的PackageName(就是建立應用的bundleld),阿裡雲移動推送Android SDK以PackageName作為路由依據,不同應用配置相同包名,可能導緻消息錯誤發送,即與目标應用有相同包名的應用接收到推送消息。
檢視Appkey&Secret
在産品清單,進入單個産品管理,在APP清單點選檢視資訊按鈕即可檢視該應用的Appkey和Secret。
API | 說明 |
------- | ------- |
QueryAliases | 查詢别名
UnbindAlias | 解綁别名
QueryTags | 查詢TAG
ListTags | TAG清單
BindTag | 綁定TAG
UnbindTag | 解綁TAG
RemoveTag | 删除TAG
示例
https://cloudpush.aliyuncs.com/?Format=XML
&RegionId=cn-hangzhou
&Version=2016-08-01
&AccessKeyId=testid
&Signature=Pc5WB8gokVn0xfeu%2FZV%2BiNM1dgI%3D
&SignatureMethod=HMAC-SHA1
&SignatureNonce=15215528852396
&SignatureVersion=1.0
&Timestamp=2016-02-25T12:00:00Z
&<接口相關參數>
公共傳回參數
使用者發送的每次接口調用請求,無論成功與否,系統都會傳回一個唯一識别碼RequestId給使用者。
JSON示例
1
2
3
4
{
"RequestId": "4C467B38-3910-447D-87BC-AC049166F216"
/* 傳回結果資料 */
}
服務位址
移動推送API的服務接入位址為:cloudpush.aliyuncs.com
請求參數
每個請求都需要指定要執行的操作,即Action參數(例如Push),以及每個操作都需要包含的公共請求參數和指定操作所特有的請求參數。
字元編碼
請求及傳回結果都使用UTF-8字元集進行編碼
python 實作推送
-- coding: utf-8 --
import properties
import os
import re
from aliyunsdkpush.request.v20160801 import PushRequest
from aliyunsdkcore import client
from datetime import *
import configparser
from Config import *
import time
class AliPushRequest:
TAG_MAX_OPER_NUM = 50
MESSAGES = {
"I10000": "Arranging Result Initialized. (School: {0})",
"I10001": "Arranging Result Changed. (School: {0})",
"I20000": "Restart. (School: {0})"
}
def __init__(self, target, targetValue):
self._target = target
# 标簽
# JSON格式
# tags = {"or":[{"tag":"123456878"}, {"tag": "53488700341"} ]}
self._targetValue = targetValue
# 讀取配置檔案
self._cf = configparser.ConfigParser()
self._cf.read(ConfigPath)
# 讀取環境變量或定義常量
self._access_key_id = os.getenv('PREQ_ACCESS_KEY_ID', self._cf.get("push_request","PREQ_ACCESS_KEY_ID"))
self._access_key_secret = os.getenv('PREQ_ACCESS_KEY_SECRET', self._cf.get("push_request","PREQ_ACCESS_KEY_SECRET"))
self._region_id = os.getenv('PREQ_REGION_ID', self._cf.get("push_request","PREQ_REGION_ID"))
self._app_key = os.getenv('PREQ_APP_KEY', self._cf.get("push_request","PREQ_APP_KEY"))
self._clt = client.AcsClient(self._access_key_id, self._access_key_secret, self._region_id)
self._request = PushRequest.PushRequest()
self._request.set_AppKey(self._app_key)
async def banpai_push_msg(self, title, message):
# 檢查參數不為空
if title and message:
#推送目标: 按标簽推送
self._request.set_Target(self._target)
#設定Tag Value
self._request.set_TargetValue(self._targetValue)
#裝置類型 ANDROID
self._request.set_DeviceType("ANDROID")
#消息類型 MESSAGE
self._request.set_PushType("MESSAGE")
#消息的标題
self._request.set_Title(title)
#消息的内容
self._request.set_Body(message)
#30秒之後發送, 也可以設定成你指定固定時間
pushDate = datetime.utcnow() + timedelta(seconds = +5)
#24小時後消息失效, 不會再發送
expireDate = datetime.utcnow() + timedelta(hours = +24)
#轉換成ISO8601T資料格式
pushTime = pushDate.strftime("%Y-%m-%dT%XZ")
expireTime = expireDate.strftime("%Y-%m-%dT%XZ")
self._request.set_PushTime(pushTime)
self._request.set_ExpireTime(expireTime)
#設定過期時間,機關是小時
# self._request.set_TimeOut(24)
self._request.set_StoreOffline(True)
res = self._clt.do_action(self._request)
res = res.decode('unicode_escape')
messageId = re.findall("<MessageId>(.*)?</MessageId>", res)
return messageId
else:
return None
調用推送
tagsValue = {
"and": [
{ "tag": self._Rucode },
{ "or": list(map(lambda x: {"tag": x}, arr)) }
]
print(tagsValue)
apr = AliPushRequest("TAG", tagsValue)
if self._jobType == CourseArranging.ConstJobTypeInit:
push_title = "I10000"
push_msg = {
"type": 0, # 0 message 1 functional
"message": AliPushRequest.MESSAGES["I10000"].format(self._Rucode)
}
elif self._jobType == CourseArranging.ConstJobTypeSync:
push_title = "I10001"
push_msg = {
"type": 0, # 0 message 1 functional
"message": AliPushRequest.MESSAGES["I10001"].format(self._Rucode)
}
else:
continue
cnt = 1
pushedFlag = False
while not pushedFlag and cnt <= 3:
try:
await apr.banpai_push_msg(push_title, push_msg)
pushedFlag = True
except Exception as ex:
cnt += 1
if cnt > 3:
raise Exception("3 times push failed!")