天天看點

阿裡雲推送服務

移動推送

  • 提供從雲端到移動終端的優質推送服務,支援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 目前請設定為

cn-hangzhou

Version API版本号,為日期形式

YYYY-MM-DD

,請參見概覽。
AccessKeyId 阿裡雲頒發給使用者的通路服務所用的密鑰ID。
Signature 簽名結果串,關于簽名的計算方法,請參見 簽名機制。
SignatureMethod 簽名方式,目前支援HMAC-SHA1。
Timestamp 請求的時間戳。日期格式按照ISO8601标準表示,并需要使用UTC時間,格式為

YYYY-MM-DDThh:mm:ssZ

,例如

2016-02-25T12:00:00Z

(為UTC時間2016年2月25日12點0分0秒)。
SignatureVersion 簽名算法版本,目前版本是1.0。
SignatureNonce 唯一随機數,用于防止網絡重播攻擊,使用者在不同請求間要使用不同的随機數值。

示例

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!")