最近作一個後臺發送消息推送到app(android和ios)的功能,該功能採用的是個推接口,基於php的,我用TP5來實現這個推送流程。先看官方demo吧。能夠先參考官方給到的例子來看http://docs.getui.com/getui/server/php/push/。php
因爲該APP下載量比較大,考慮到要推送給全部下載app的用戶,因此這裏就不能用針對於單個用戶進行推送了,必須針對應用羣體進行推送。場景以下:html
文檔中給到的php例子是這個:前端
<?php //消息推送Demo header("Content-Type: text/html; charset=utf-8"); require_once(dirname(__FILE__) . '/' . 'IGt.Push.php'); define('APPKEY','請輸入您的APPKEY'); define('APPID','請輸入您的APPID'); define('MASTERSECRET','請輸入您的MASTERSECRET'); define('HOST','http://sdk.open.api.igexin.com/apiex.htm'); define('CID','請輸入您的CID'); pushMessageToApp(); function pushMessageToApp(){ $igt = new IGeTui(HOST,APPKEY,MASTERSECRET); $template = IGtLinkTemplateDemo(); //個推信息體 //基於應用消息體 $message = new IGtAppMessage(); $message->set_isOffline(true); $message->set_offlineExpireTime(10 * 60 * 1000);//離線時間單位爲毫秒,例,兩個小時離線爲3600*1000*2 $message->set_data($template); $appIdList=array(APPID); $phoneTypeList=array('ANDROID'); $provinceList=array('浙江'); $tagList=array('haha'); $cdt = new AppConditions(); $cdt->addCondition(AppConditions::PHONE_TYPE, $phoneTypeList); $cdt->addCondition(AppConditions::REGION, $provinceList); $cdt->addCondition(AppConditions::TAG, $tagList); $message->set_appIdList($appIdList); $message->set_conditions($cdt); $rep = $igt->pushMessageToApp($message); var_dump($rep); echo ("<br><br>"); } function IGtLinkTemplateDemo(){ $template = new IGtLinkTemplate(); $template ->set_appId(APPID);//應用appid $template ->set_appkey(APPKEY);//應用appkey $template ->set_title("請輸入通知標題");//通知欄標題 $template ->set_text("請輸入通知內容");//通知欄內容 $template ->set_logo("");//通知欄logo $template ->set_isRing(true);//是否響鈴 $template ->set_isVibrate(true);//是否震動 $template ->set_isClearable(true);//通知欄是否可清除 $template ->set_url("http://www.getui.com/");//打開鏈接地址 //$template->set_notifyStyle(0); //$template->set_duration(BEGINTIME,ENDTIME); //設置ANDROID客戶端在此時間區間內展現消息 //iOS推送須要設置的pushInfo字段 // $apn = new IGtAPNPayload(); // $apn->alertMsg = "alertMsg"; // $apn->badge = 11; // $apn->actionLocKey = "啓動"; // // $apn->category = "ACTIONABLE"; // // $apn->contentAvailable = 1; // $apn->locKey = "請輸入通知欄內容"; // $apn->title = "請輸入通知欄標題"; // $apn->titleLocArgs = array("titleLocArgs"); // $apn->titleLocKey = "請輸入通知欄標題"; // $apn->body = "body"; // $apn->customMsg = array("payload"=>"payload"); // $apn->launchImage = "launchImage"; // $apn->locArgs = array("locArgs"); // // $apn->sound=("test1.wav");; // $template->set_apnInfo($apn); return $template; } ?>
而後下載sdk,下載地址:http://docs.getui.com/download.htmlandroid
而後看我本身實現流程:ios
當我在後臺對某一條消息進行推送的時候 利用ajax傳過來消息標題和內容,在控制器中用一個方法去接收:ajax
//手機推送 public function pushPhone() { $this->base(); if ($this->token == 2) { return ''; } $list_id = Request::instance()->param('list_id'); $list_title = Request::instance()->param('list_title'); $info = new geTui();//實例化個推類 $listId = [ 'type' => 'list', 'value' => $list_id, 'title' => '消息標題', 'content' => $list_title,//消息內容 ]; $res = $info->pushMessageToApp($listId);/調用推送類 if ($res['result'] == 'ok') { return ['code' => '1', 'msg' => '推送成功!']; } else { return ['code' => '0', 'msg' => '推送失敗!']; } }
看一下這個geTui類存放位置以及代碼:json
我把下載的sdk放在extend文件夾下了。api
而後從新建立了一個名爲geTui的php文件app
<?php namespace app\push; use think\Loader; class GeTui { private $host = 'http://sdk.open.api.igexin.com/apiex.htm'; //測試 private $appkey = ''; private $appid = ''; private $mastersecret = ''; //羣推接口案例 function pushMessageToApp($mes,$listId){ import('getui.IGt', '', '.Push.php'); $igt = new \IGeTui($this->host, $this->appkey, $this->mastersecret); $template = $this->IGtTransmissionTemplateDemos($mes,$listId); //$template = IGtLinkTemplateDemo(); //個推信息體 //基於應用消息體 Loader::import('getui\igetui\IGT.AppMessage', EXTEND_PATH); $message = new \IGtAppMessage(); $message->set_isOffline(true); $message->set_offlineExpireTime(10 * 60 * 1000);//離線時間單位爲毫秒,例,兩個小時離線爲3600*1000*2 $message->set_data($template); $appIdList=array($this -> appid); $phoneTypeList=array('ANDROID');//忽略了 $provinceList=array('浙江');//這個也忽略了 $tagList=array('haha'); //用戶屬性 //$age = array("0000", "0010"); //$cdt = new AppConditions(); // $cdt->addCondition(AppConditions::PHONE_TYPE, $phoneTypeList); // $cdt->addCondition(AppConditions::REGION, $provinceList); //$cdt->addCondition(AppConditions::TAG, $tagList); //$cdt->addCondition("age", $age); $message->set_appIdList($appIdList); //$message->set_conditions($cdt->getCondition()); $rep = $igt->pushMessageToApp($message); return $rep; } //全部推送接口均支持四個消息模板,依次爲通知彈框下載模板,通知連接模板,通知透傳模板,透傳模板 //注:IOS離線推送需經過APN進行轉發,需填寫pushInfo字段,目前僅不支持通知彈框下載功能 function IGtTransmissionTemplateDemos($mes,$listId){ import('getui.IGt', '', '.Push.php');//引入sdk文件 $template = new \IGtTransmissionTemplate(); $template->set_appId($this -> appid);//應用appid $template->set_appkey($this->appkey);//應用appkey $template->set_transmissionType(2);//透傳消息類型 $template->set_transmissionContent(json_encode($listId));//透傳內容 //APN高級推送 Loader::import('getui\igetui\IGT.APNPayload', EXTEND_PATH); $apn = new \IGtAPNPayload(); $alertmsg=new \DictionaryAlertMsg(); $alertmsg->body=$mes['content']; $alertmsg->actionLocKey="查看"; $alertmsg->locKey=$listId['content']; $alertmsg->locArgs=array("locargs"); $alertmsg->launchImage="launchimage"; // IOS8.2 支持 $alertmsg->title=$mes['title']; $alertmsg->titleLocKey="電力頭條"; $alertmsg->titleLocArgs=array("TitleLocArg"); $apn->alertMsg=$alertmsg; $apn->badge=1; $apn->sound=""; $apn->add_customMsg("payload","payload"); $apn->contentAvailable=1; $apn->category="ACTIONABLE"; $template->set_apnInfo($apn); //PushApn老方式傳參 // $template = new IGtAPNTemplate(); // $template->set_pushInfo("", 10, "", "com.gexin.ios.silence", "", "", "", ""); return $template; } }
好了,若是前端(android和ios)都以及作好接收處理的話,應該是沒問題的了,該案例應用場景於因此下載app的客戶,包含註冊和未註冊的,若是是針對於全部以及註冊的用戶進行推送的話 建議使用對單個用戶進行推送消息。測試
本文屬原創內容,爲了尊重他人勞動,轉載請註明本文地址: