移動推送
- 提供從雲端到移動終端的優質推送服務,支持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/#/accesskey
-
responseld: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 | 查詢別名 |
BindAlias | 綁定別名 |
UnbindAlias | 解綁別名 |
QueryTags | 查詢TAG |
ListTags | TAG列表 |
BindTag | 綁定TAG |
UnbindTag | 解綁TAG |
RemoveTag | 刪除TAG |
公共請求參數
公共請求參數是指每個接口都需要使用到的請求參數。
名稱 | 類型 | 是否必須 | 描述 |
---|---|---|---|
Format | String | 否 | 返回值的類型,支持JSON與XML,默認為XML。 |
RegionId | String | 是 | 當前請設置為cn-hangzhou |
Version | String | 是 | API版本號,為日期形式YYYY-MM-DD ,請參見概覽。 |
AccessKeyId | String | 是 | 阿里雲頒發給用戶的訪問服務所用的密鑰ID。 |
Signature | String | 是 | 簽名結果串,關於簽名的計算方法,請參見 簽名機制。 |
SignatureMethod | String | 是 | 簽名方式,目前支持HMAC-SHA1。 |
Timestamp | String | 是 | 請求的時間戳。日期格式按照ISO8601標准表示,並需要使用UTC時間,格式為YYYY-MM-DDThh:mm:ssZ ,例如2016-02-25T12:00:00Z (為UTC時間2016年2月25日12點0分0秒)。 |
SignatureVersion | String | 是 | 簽名算法版本,目前版本是1.0。 |
SignatureNonce | String | 是 | 唯一隨機數,用於防止網絡重放攻擊,用戶在不同請求間要使用不同的隨機數值。 |
示例
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示例
{ "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!")