阿里雲推送服務


移動推送

  • 提供從雲端到移動終端的優質推送服務,支持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!")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM