前言
前文,我們介紹了在kbmMW服務端集成DPush,實現kbmMWServer向DPush代理服務器發送消息,由於DPush優美的封裝,代碼量已經非常少了,實現起來非常方便與簡潔。這個實現后,我們就可以在App客戶端調用kbmMWServer封裝的方法,輕松實現App推送消息給其他的用戶。現在來看一下具體調用的代碼:
procedure TTestForm.Button4Click(Sender: TObject); var s:string; begin s:=kbmMWSimpleClient.Request('MyQueryService','1.0','SendPush',['用戶的ID','消息的標題','消息的摘要!','{“Data”:"消息的內容"}']); ShowMessage(s); end;
如果你熟悉kbmMW,那很容易就看懂上面代碼,就是用SimpleClient實現客戶端調用服務端的SendPush方法。
好了,我們已經知道在App中發送消息,現在我們來看如何集成DPush,實現App離線接收消息。
第一步,我們要在項目中發布各個廠商推送消息SDK的中客戶端Jar。
如下圖:
在項目管理器中,增加上面6個Jar.
第二步:發布hmsrootcas.bks文件
這兩步的文件,都在 XXX:\DPush\Client\res目錄下。
第三步,去各個廠家的開發平台去申請推送
這一步是最麻煩的,要有心理准備,各個廠家的申請過程中需要的資料是不一樣的,申請好以后呢,就可以做下一步了。
我准備用單獨的文章來介紹這復雜的申請過程以及申請過程中的注意事項。
第四步,修改AndroidManifest.template.xml
這一步比較麻煩,改的地方很多,不過,DPush Client Demo中已經給我們做好了例子,直接復制過來,然后按從各廠商申到的推送的參數來配置。
首先增加需要的權限:
<!-- 以下是通用需要的權限要求 --> <!-- 開機啟動事件 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!-- SD卡寫權限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 網絡權限 --> <uses-permission android:name="android.permission.INTERNET" /> <!--檢測網絡狀態 | Detecting Network status--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!--檢測wifi狀態 | Detecting WiFi status--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 允許訪問振動設備 --> <uses-permission android:name="android.permission.VIBRATE" /> <!--獲取用戶手機的IMEI,用來唯一的標識設備。 | Gets the IMEI of the user's phone, used to uniquely identify the device.--> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
然后,配置廠家的參數:
1. 分別替換以下對應的通配符(包名必須替換,如果其他沒有賬號,可以對應測試(比如測試華為,申請好華發推送之后,只替換{華為AppID}即可):
{包名}
{華為AppID}
{小米AppID}
{小米AppKey}
{OppoAppID}
{OppoAppKey}
{OppoAppSecret}
{VivoAppID}
{VivoAppKey}
第五步,用代碼來聯接DPush代理服務器
uses Leo.Enum.Helper, Leo.FMX.Log, Leo.PushService.Consts, Leo.PushService.DPush, ... private FPushService: TLeoDPushService; ... //以下代碼從ClientDemo中復制的: const AppName = 'xxxxx'; AppKey = 'xxxxx'; ServerUrl = 'dpush.yseas.com/mydemo'; procedure TMainFrm_DPush.InitPushService; begin if FPushService = nil then begin FPushService := TLeoDPushService.Create(ServerUrl, AppName, AppKey); FPushService.OnPushError := DoPushError; FPushService.OnLogEvent := OnPushLog; FPushService.OnGetPushDataEvent := DoObservePushNotfiy; FPushService.OnSuccRegistDevice := DoSuccRegistDevice; FPushService.Connect(); // Connect后正常應該會收到獲取到業務Token的回調DoGetToken(可以通過OnLogEvent觀察),表示業務推送庫已經連接成功,如果沒有需要檢查 log日志 // 搜6003錯誤,表示華為的Sdk,后台是是否配置了指紋,請參見華為推送申請說明 end; end;
ServerUrl,AppName,AppKey:這三個值跟服務端用到的是相同的,都是在申請DPush服務時得到的。用這三個參數,就可以建立一個TLeoDPushService實例,上面的代碼中是FPushService。
TLeoDPushService實現了四個事件:
OnPushError:執行Connect方法時出現錯誤觸發
OnLogEvent:接收推送的日志,用這個事件,可以跟蹤TLeoDPushService執行過程情況
OnGetPushDataEvent:App收到消息,用戶在點擊時啟動App並觸發,在這個事件中,我們可以根據收到的消息處理自己的業務邏輯。
OnSuccRegisDevice:執行Connect成功時觸發。
當我們使用Connect方法聯接了DPush代理服務器之后,接下來,我們還需要在代理服務器上注冊我們的手機設備。直接轉貼Client Demo代碼:
procedure TMainFrm_DPush.btnAfterLoginClick(Sender: TObject); var vInitInfo: TLeoDPushInitInfo; begin // App 包名 ,指服務端配置的軟件標識。 vInitInfo.ClientAppName := 'com.kinglandsoft.zhlm'; // 業務系統的賬號,與后台添加推送信息時的賬號對應 vInitInfo.ClientAppAccount := Trim(edtBizAccount.Text); // Start之后,會讓D推在app服務中使用對應的推送,所以這個方法一般是在業務登錄(或者切換賬號)后調用 FPushService.RegistDevice(vInitInfo); end;
萬事大吉,假設第三、四步正確完成,那么編譯程序到手機上並運行,就可以收到離線消息了!
現在,這里還有一種需求需要在客戶端實現:按上面的實現,當你的用戶在手機App上登錄后,可以接收離線消息了,但是當用戶退出登錄時,是不希望再收到離線消息的。那怎么辦呢?
TLeoDPushService為我們提供了RemoveRegist方法,實現從DPush代理服務器退出,從而滿足上面的需求,不再收取離線消息。當然了,如果你在用戶推出app,但還是需要他在那台手機上收到離線消息,那就不用執行這個方法,何去何從,取決於你的用戶需求。
這個RemoveRegist方法,調用時需要注意:必須在成功調用RegistDevice之后才能調用,如果調用成功,會觸發OnSuccRemoveRegistedDevice事件。
最后
如果你也想使用DPush實現自己的App離線推送,請加入官方QQ群513637288,以了解更多情況。