1. iOS APNS遠程推送 測試全方案匯總
最近弄了下推送,在測試時遇到了些問題,在此整理匯總了些推送測試相關的方案,並添加了一些補充信息。下方鏈接是相關文章,感謝各位作者的分享。
debug包和build切換為release直接在手機上跑生成的device token都是開發token。release打包後注冊生成的token是生產的。
向證書製作者要推送證書的 p12文件。 雙擊輸入密碼。在鑰匙串中找到如下。
證書有下方密鑰,沒有的話證書不可用。
將p12上傳的三方平台並填寫密碼即可。測試推送在這些推送平台填寫 設備token等信息即可。
給中台p12文件和密碼,協商好消息格式、提供對應環境的token,由中台觸發即可。
注意證書分為三種。測試(sanbox)、生產、 測試和生產合並。
如果發送成功,核對 token、證書、中台鏈接蘋果伺服器息的地址。是否為統一環境。(蘋果的推送伺服器也是區分測試和生產的,域名不同,下方腳本中可以看到)
在Xcode11.4之後,模擬器也支持推送測試
具體格式根據你們的產品要求,接入極光或者個推的可以在控制台發一條推送列印出具體格式內容查看,將文件保存後綴為apns,待會要用到
a、查看已啟動模擬器
會看到類似下面信息,如果沒有請先啟動模擬器
b、運行項目在模擬器上後執行相應命令simctl push <device> [<bundle identifier>] (<json file> | -)
示例如下
將第一步創建的json文件內容稍加修改,具體就是添加了"Simulator Target Bundle": "com.app.test"你項目的包名
然後直接拖動文件到模擬器上,出現綠色➕後鬆手,這樣也可以進行推送測試
參考蘋果官方文檔
Sending Push Notifications Using Command-Line Tools
<u>https://links.jianshu.com/go?to=https%3A%2F%2Fdeveloper.apple.com%2Fdocumentation%2Fusernotifications%2Fsending_push_notifications_using_command-line_tools</u>
1、在終端新建 shell 文件,這里命名為 push-remote-notification
2、編輯 shell 腳本,這里需要 der 和 pem 證書,如果已經有了 p12 證書,可以通過 openssl 進行轉換
運行 shell 腳本
真實腳本事例:
a、p12轉der需要先轉為pem格式,再從pem轉到der格式
openssl pkcs12 -in disPush.p12 -out disPush.pem -nodes
b、pem轉der
openssl x509 -outform der -in certificate.pem -out certificate.der
Smart push
git地址: https://github.com/shaojiankui/SmartPush
如果報錯
SSL端點域名不能被設置 -25300
Keychain中不能找到證書 -25300
說明鑰匙串中沒有密鑰,要新的p12文件並雙擊
不推薦,所以不例舉,網站風險無法判斷。
<u>https://www.jianshu.com/p/15d58b1ada5b</u> 證書轉換
<u>https://blog.csdn.net/u013250412/article/details/78729828</u> 證書轉換
<u>https://www.jianshu.com/p/9d7aece4a88d</u> 證書轉換
<u>https://developer.apple.com/documentation/usernotifications/sending_push_notifications_using_command-line_tools</u>
<u>https://blog.csdn.net/berryreload/article/details/52205397</u>
<u>https://www.jianshu.com/p/87168eecc395</u> 腳本
<u>https://developer.aliyun.com/article/116088?spm=a2c6h.13813017.content3.2.6bc0590ePir0NF</u>
<u>https://www.jianshu.com/p/87168eecc395</u> 腳本
<u>https://www.jianshu.com/p/e8e4f4984fee</u> 模擬器
2. 怎樣編寫Apple Push Notification伺服器
基本結構:
使用唯一的SSL許可證連接到APNS
循環通過你需要發送到消息
為各消息構建有效載荷
斷開與 APNS的連接
遠程通知數據的流程是單向的。提供者將包括客戶程序設備令牌和有效載荷的數據打包,發送到APNS,然後APNS再將通知發送給最終設備。
限制:
有效載荷限制為256位元組 – 它包括了消息主體以及你希望傳送帶其他屬性。推送通知並不適於傳送大量的數據。例如,我們僅僅傳送一條短消息通知伺服器監視的事件已經被觸發了。
APNS並不提供消息發送成功與否的回饋狀態。一個原因是如果一個設備無法聯系那麼發送給它的消息將被存於隊列中,然而只有最新發送的消息被存於隊列中 – 覆蓋了先前發送但不成功的消息。
推送通知不適合用於發送緊急通知,因為消息僅在設備具有wifi或手機服務連接的情況下才能被發送,這也是為什麼我們推薦與其它方法如email或SMS一起使用的原因。
用來與APNS通訊的SSL許可證(下面將討論)是在程序層生成的。本教程涉及到實現方法僅適於單個iPhone程序,所以如果你有多個程序,那麼你需要修改代碼使之適合於使用多個許可證。
設備令牌:
每條推送消息都必須針對某特定設備。這是通過使用在你的iPhone程序中由APNS產生的唯一deviceToken(設備令牌)來實現的。一旦獲取了此令牌,你需要將其存儲於伺服器而不是你的iPhone程序內。它看上去像這樣:
c9d4c07c fbbc26d6 ef87a44d 53e16983 1096a5d5 fd825475 56659ddd f715defc
在我們的 Server Density iPhone 程序中,我們在程序啟動時調用相應的令牌生成方法,然後通過 HTTP API 調用 傳回給我們的伺服器 。這將使得deviceToken存儲於伺服器的有關用戶的資料庫中,從而我們可以使用它與持有此設備的用戶進行通訊。
反饋服務:
Apple 還提供了一個 反饋服務 ,你應該定期查詢。它提供了一個以前使用過但不再有效的(例如用戶卸載了你的iPhone程序)設備令牌列表。你可以從你的資料庫中刪除這些設備令牌。
許可證:
要進行推送服務的第一件事就是獲取推送許可證。它用來對你通過SSL與APNS通訊進行識別。
在Mac上生成 Apple推送通知SSL許可證:
登錄到 iPhone Developer Connection Portal 並點擊 App IDs
創建一個不使用通配符的 App ID 。通配符 ID 不能用於推送通知服務。例如,我們的iPhone程序ID像這樣: AB123346CD.com.serverdensity.iphone
點擊App ID旁的「Configure」,然後按下按鈕生產 推送通知許可證。根據「向導」指導的步驟生成一個簽名並上傳,最後下載生成的許可證。此步驟在 Apple文檔中 也有談到。
通過雙擊.cer文件將你的 aps_developer_identity.cer 引入Keychain中。
在Mac上啟動 Keychain助手,然後在login keychain中選擇 Certificates分類。你將看到一個可擴展選項「Apple Development Push Services」
擴展此選項然後右擊「Apple Development Push Services」 > Export 「Apple Development Push Services ID123」。保存為 apns-dev-cert.p12 文件。
擴展「Apple Development Push Services」 對「Private Key」做同樣操作,保存為 apns-dev-key.p12 文件。
需要通過終端命令將這些文件轉換為PEM格式:
php">opensslpkcs12-clcerts-nokeys-outapns-dev-cert.pem-inapns-dev-cert.p12
opensslpkcs12-nocerts-outapns-dev-key.pem-inapns-dev-key.p12
如果你想要移除密碼,要麼在導出/轉換時不要設定或者執行:
opensslrsa-inapns-dev-key.pem-outapns-dev-key-noenc.pem
最後,你需要將鍵和許可文件合成為apns-dev.pem文件,此文件在連接到APNS時需要使用:
catapns-dev-cert.pemapns-dev-key-noenc.pem>apns-dev.pem
將此文件保存為一個易記的名字,你有可能以後會用到它。上述步驟同樣適合於生成產品許可證。
載荷內容:
載荷 格式化為遵循 RFC 4627標準的JSON格式。它由以下幾部分組成:
提示 – 顯示於設備上的文本串
標識 – 設備屏幕中程序圖標上顯示的整數
聲音 – 顯示消息在設備的同時發出的聲音的文本名字
本教程僅處理發送簡單提示文本串,但也可以發送包括諸如顯示自定義按鈕等在內的各種選項的字典集。
創建載荷:
使用 PHP 很容易根據數組並 轉換成 JSON而創建載荷:
$payload['aps']=array('alert'=>'Thisisthealerttext','badge'=>1,'sound'=>'default');
$payload=json_encode($payload);
顯示 $payload 的內容可以看到傳送到APNS 的 JSON字元串:
{
"aps":{"alert":"Thisisthealerttext","badge":1,"sound":"default"}
}
這將使消息顯示於設備上,觸發提升聲音並將「1」置於程序圖標上。默認按鈕「Close」和「View」同時會顯示於彈出窗口上。
對於 Server Density iPhone程序而言,讓用戶按下「View」直接進入產生此提示的伺服器是很重要的,所以我們增加了額外的自定義值:
$payload['aps']=array('alert'=>'Thisisthealerttext','badge'=>1,'sound'=>'default');
$payload['server']=array('serverId'=>$serverId,'name'=>$name);
$output=json_encode($payload);
當用戶按下「View」後,自定義server值將被傳遞到設備中的程序。JSON 值如下:
{
"aps":{"alert":"Thisisthealerttext","badge":1,"sound":"default"},
"server":{"serverId":1,"name":"Servername")
}
256位元組的限制適用於整個載荷,包括自定義字典集。
原生介面
在Server Density中,一旦產生了一條提示,將建立一個載荷並插入隊列中。因此有必要時我們可以同時發送多個載荷。
Apple推薦使用這種方法,因為如果你在發送各載荷時頻繁連接和斷開,APNS有可能會封鎖你的IP。
如Apple 描述:
原生介面使用原生socket,具有二進制內容,採用數據流技術,不產生回饋。
打開連接
打開連接的PHP 5代碼如下:
$apnsHost='gateway.sandbox.push.apple.com';
$apnsPort=2195;
$apnsCert='apns-dev.pem';
$streamContext=stream_context_create();
stream_context_set_option($streamContext,'ssl','local_cert',$apnsCert);
$apns=stream_socket_client('ssl://'.$apnsHost.':'.$apnsPort,$error,$errorString,2,
STREAM_CLIENT_CONNECT,$streamContext);
如果發送錯誤,你可以參考$errorString。它也包括了SSL許可證不正確時的詳細信息。
許可證文件處於執行的PHP代碼的當前工作目錄下,如果需要你可指定其絕對路徑。
注意測試時應該使用開發許可證及sandbox。成品主機名為 gateway.push.apple.com ,而且你必須使用不同的產品許可證。
發送載荷
在此,我們循環整個載荷隊列進行發送。構建發送到APNS的二進制內容簡單示例如下:
$apnsMessage=chr(0).chr(0).chr(32).pack('H*',str_replace('','',$deviceToken)).chr(0).
chr(strlen($payload)).$payload;
fwrite($apns,$apnsMessage)
注意 $deviceToken 是從資料庫中提取並去除空格得到的。我們還應該檢查是否$payload超過256個位元組。
$apnsMessage 包括了正確的二進制載荷,而fwrite 將載荷寫入當前活動的數據流連接中。
完成後,應關閉連接:
socket_close($apns);
fclose($apns);
php-apns
有一個開源伺服器庫php-apns實現了以上所有功能,它依賴於memcached。我們不想使用任何第三方代碼,所以完全自己編寫了自己的伺服器。我們使用自定義cron系統,幾秒鍾運行一次。
3. php 定時推送消息怎麼做
這個要用到伺服器系統的計劃任務,如果是linux伺服器 的cron。代碼實現是非常消耗性能的,需要不停的循環執行。