沒想到做 PHP 還會接觸這方面的東西尉共,感覺風馬牛不相及迷郑,在這里碰頭了。從 PHP api到 Cordova 搭建打包 App再到里面的極光推送和小紅點的數(shù)值段标,真是禿了半邊頂力麸。(話說回來可款,我們 BOSS 和個推可是校友,我可是力排眾議末盔,毅然決然選擇了極光推筑舅,滑稽.jpg)
--萌新寄語
本篇主要介紹 Cordova 和 PHP 配合,完成極光推送消息( iOS 集成推送的證書申請, PHP 推送代碼實現(xiàn))及角標數(shù)值(badgeNum)的自我實現(xiàn)陨舱。多以截圖為主翠拣,直擊老鐵痛點。
這邊主要介紹 jpush ios 推送證書的申請游盲,申請好了的误墓,可以直接跳下面 PHP 部分
先介紹下我的環(huán)境蛮粮,我只用到了 jpush。所以申請極光賬號還是很簡單的谜慌,不需要什么身份認證然想。
一. 創(chuàng)建應用后的操作
其中 AppKey 是 Cordova 安裝 jpush 插件的必須 也是后面推送的必須(還有隱藏的
Master Secret)
- 下面就可以設(shè)置推送的相關(guān)信息了
安卓的無腦操作這里就不介紹了
注意包名一定要統(tǒng)一 避免不必要的麻煩,這里詳細介紹下 iOS 的證書設(shè)置(鑒權(quán)方式為 證書)我這里用的是個人開發(fā)者賬號 $99 沒有證書欣范、Mac 的之類的兄弟姐妹就早點兒下班休息吧航
首先需要用你的開發(fā)者賬號登陸蘋果開發(fā)者中心
-
然后打開這個慘絕人寰的頁面
-
Development 顧名思義即開發(fā)證書
-
點擊加號后出現(xiàn)的頁面 選中開發(fā)的按鈕后就可以下一步 continue 了
-
選擇以后繼續(xù) continue
-
一直 continue 到這個頁面 選擇簽名 這個時候就需要 Mac 的鑰匙串去請求簽名證書了 這一步先放在這里
-
Mac 請求證書
-
請求成功之后变泄,保存在本地,創(chuàng)建一個這個包名的文件夾 方便區(qū)分
- 回到已經(jīng)打開的 蘋果開發(fā)者中心 選擇剛才存到本地的證書 down 下來
下載下來的 .cer 后綴的文件就是我們要的了恼琼。拖到鑰匙串中打開
下面就是導出 .p12 的文件了7劣肌!G缇骸蛙卤! 盼星星盼月亮 終于盼到這一步了
-
走完下面這一步就大功告成了
-
都是明白人兒 放進去就行了噩死。雖然下面有提示 是否將生產(chǎn)證書用于開發(fā)環(huán)境颤难,想都別想,趁熱把另一個證書申請了吧
- 開發(fā)證書和生產(chǎn)證書操作是一毛一樣的 兩個同時操作也行 也沒意見
-
最終結(jié)果
PHP 端處理 badge 的思路的自我實現(xiàn)
關(guān)于推送的信息已维,一定要多看極光的控制臺行嗤。reg_id和msg_id 平臺信息等都在上面。方便你去查找錯誤信息
之前一直不懂 Jpush 服務器的角標值是怎么玩的捂敌,現(xiàn)在大概明白了艾扮。關(guān)于推送的 badge數(shù)量在我上面截圖紅圈的 badge 參數(shù)。這樣我們不要自己去計算角標值占婉,根據(jù)下面的兩個接口定義 就可以根據(jù)用戶是否點擊泡嘴,在原有的基數(shù)上去對應的增加減少即可 但是如果我們想要看到消息日志的話和推送日志方便自己管理的話 就要自己去建表存儲狀態(tài)了
大概思路是 這里我用了三張表去控制 大概實現(xiàn)了角標的核銷。
- 用戶每一次登陸都會去獲取一下設(shè)備的 id逆济,也就是極光的 registration_id 酌予。(防止設(shè)備 ID 改變,極光介紹,或者用戶更換手機奖慌,能準確的推送到該設(shè)備)
- message 表主要做存儲發(fā)送消息的記錄抛虫。方便后臺管理員了解曾經(jīng)推送過得信息。
-
message_log 表主要就是存儲推送的消息日志(用戶太多的話肯定要優(yōu)化數(shù)據(jù)表的简僧,暫時不做考慮)建椰,根據(jù)表里的
status
就可以判斷是否已讀,用戶每次點擊消息詳情頁都要去訪問下接口去修改status
的狀態(tài)岛马,從而完成核銷棉姐。核銷的基礎(chǔ)是該用戶的 id 和消息 id屠列,因為這兩個都是唯一的。
PHP 邏輯代碼簡單的封裝了一下
詳見 jpushPHPdemo
protected function pi_push($member_id,$content,$badgeNum,$array){
try {
// 配置引入
$app_key = PI_Config::APP_KEY;
$master_secret = PI_Config::MASTER_SECRET;
// use jpush
$client = new JPush($app_key, $master_secret);
$response = $client->push()
->setPlatform("all")
->addRegistrationId( $member_id )
->iosNotification( $content, array(
'sound' => 'sound.caf',
'badge' => "$badgeNum" + 1,
'content-available' => true,
'mutable-content' => true,
'extras' => $array
))
->androidNotification( $content, array(
// 'title' => ,
'extras' => $array
))
->options(array(
// !!!! apns_production:這里我試過去掉 option參數(shù) 以為默認推送生產(chǎn)環(huán)境伞矩,其實不然笛洛。需要生產(chǎn)環(huán)境的推送的時候,最好指定D死ぁ?寥谩!
// True 表示推送生產(chǎn)環(huán)境湿诊,F(xiàn)alse 表示要推送開發(fā)環(huán)境蝌诡;如果不指定則默認為推送生產(chǎn)環(huán)境
'apns_production' => true,
))
->send();
if ( $response['http_code'] == 200) {
return $response['body']['msg_id'];
}else{
return false;
}
} catch (\JPush\Exceptions\APIConnectionException $e) {
return false;
} catch (\JPush\Exceptions\APIRequestException $e) {
return false;
}
}
下面執(zhí)行推送的代碼
// 手動推送的設(shè)置
public function post_push( $request ){
$res['title'] = $request['title']; // 推送的標題
$res['content'] = $request['content']; // 推送的內(nèi)容
$res['remark'] = $request['remark']; // 推送的備注
$res['create_date'] = date( "Y-m-d H:i:s" );
// 推送類型
$push_type = $request['push_type'];
// 推送前插入 推送記錄表 (WordPress的mysql insert方法)
if ( $push_type === '0' ) {
$info = $this->wpdb->insert(
$this->pi_message,
$res,
array( '%s', '%s', '%s' )
);
}
// 插入成功 推送并插日志表
if( $info ){
// 查找所有設(shè)備ID 上面接受過 每次登陸或者注冊 都要重新獲取一下reg_id
$find_sql = "SELECT device_id FROM $this->pi_bindinguser";
//設(shè)備ID的數(shù)組集合
$total_user = $this->wpdb->get_results( $find_sql, ARRAY_A );
// 找到所有的設(shè)備id 發(fā)送數(shù)據(jù)
foreach ($total_user as $key => $value) {
// 每個設(shè)備id
$device_id = $value['device_id'];
// 通過設(shè)備id 去查找 member_id 從而計算該用戶的未讀和已讀
$sql = "SELECT member_id FROM $this->pi_bindinguser WHERE device_id = ". " '$device_id' ";
// 計算badge_num的數(shù)值
$member_id = $this->wpdb->get_var( $sql );
// 獲取當前的狀態(tài)為零 未讀取的小紅點
$total_sql = "SELECT count(id) FROM $this->pi_message_log WHERE member_id = $member_id AND status = 0" ;
//如果該用戶消息為空的話 即默認為0開始
$badge_num = empty( $this->wpdb->get_var( $total_sql ) ) ? '0' : $this->wpdb->get_var( $total_sql );
$msg_id = $this->pi_push($device_id,$res['content'],$badge_num,$array);
// var_dump( $msg_id );
//推送成功之后 拿到msg_id 和 member_id 也就是消息id和用戶id 兩個對應的數(shù)據(jù)唯一 去存入消息列表 做核銷使用
if( $msg_id ){
$time = date( "Y-m-d H:i:s" );
$info = $this->wpdb->insert(
$this->pi_message_log,
array('member_id'=>$member_id,'msg_id'=>$msg_id,'content'=>$res['content'],'create_date'=>$time,'push_type'=>$push_type),
array( '%s', '%s', '%s', '%s', '%s' )
);
}
}
return PI_Response::init( 0 );
}else{
return PI_Response::init( 1003 );
}
}
到此 推送和本地計算角標值也就差不多了》惆桑客戶端的 badge 改動就要他們自己去掉 jpush 的接口了浦旱。因為每查看一次消息就去訪問接口的,這樣的話客戶端和服務端的角標值的數(shù)值就對應上了九杂,有點像 ajax 的無刷新刪除
我是用蒲公英做的內(nèi)測版 App 發(fā)布的颁湖。事先打包了 ipa 。這種情況的推送例隆,必須要生產(chǎn)證書甥捺,也就是上面說的
'apns_production' => true,
推送成功的條件:設(shè)備id、正確的 AppKey master secret 镀层、環(huán)境和對應的證書是否一致等镰禾。重要的事情說三遍 多看推送歷史詳情和社區(qū)
做完一套流程到后面才發(fā)現(xiàn)不需要自己控制消息日志,調(diào)用 jpush 的接口就可以去完成角標數(shù)值的增刪設(shè)置唱逢、顯示對應的小紅點吴侦。我問老大,我們這樣做是不是多余的坞古。老大:相信極光,也相信我們自己备韧。
「本文系極光征文 | 寫寫文章就能贏 Filco,豈不美滋滋的參賽文章」