百度雲推送官方地址http://developer.baidu.com/wiki/index.php?title=docs/cplat/pushphp
簡單的介紹下原理:node
百度雲推送支持IOS和Android的雲推送。Android支持的還不錯,可是IOS通常很難調通。百度雲對於IOS的推送來講,他只是作了一箇中間的代理,爲用戶提供接口,優勢是使用百度雲推送,Android和IOS能夠統一管理;缺點是:調通不容易,用戶的IOS證書須要上傳驗證,會直接暴露給第三方,而且IOS的apns支持用戶本身構建provider服務器,與apns直接通訊。c++
我的建議:Android使用百度雲推送,IOS的使用本身構建的provider與IOS的apns直接通訊。與IOS的apns直接通訊有許多實現,Java、PHP、object-c、c++,在個人博客中有一篇是使用erlang實現的,有興趣的能夠看看。c#
Android實現推送功能百度雲有本身的demo,你們能夠根據官網(http://developer.baidu.com/wiki/index.php?title=docs/cplat/push)的步驟,首先註冊一個百度開發者帳號,而後建立本身的一個應用,根據例子百度雲服務器會本身生產一個客戶端的demo,能夠運行在Android的手機上。而後在頁面進行推送實驗。固然也能夠下載百度雲推送服務器,而後經過運行使用服務器推送,官網中有php、Java、Python、node.js、c#實現。api
鑑於須要,我的使用erlang實現的服務端推送功能。瀏覽器
步驟:一、首先將上面你創建的工程中百度雲服務器爲你生產的例子demo安裝到手機上,而後以本身註冊的開發者帳號登錄,裏面有一個userid和channelId,channelId記錄下來,UserId和開發者上的對應一下,而後決定使用哪個,若是同樣,那沒問題,不同的話通常採用註冊者頁面中的那個。也能夠經過Android服務端獲取的數據分析出userid。服務器
二、獲取token也就是channelid,具體設備的id,app
三、獲取用戶的apikeyide
四、獲取用戶的secretekeypost
給用戶發送消息分幾種狀況分別以下:給某個用戶的全部設備發送信息此時須要用戶的userid;給用戶的某個設備發送信息此時須要用戶的userid和channelid;給某類用戶發送信息,須要tag分類,也就是給該類的全部用戶發送信息。
簡單示例,給用戶某一設備發送信息
start() ->
inets:start(),
{Mega,Sec,_} = now(),
ApiKey = "apikey=aghjklpoikmnbhjklpoijnbfd",%%用戶的APIkey %% 個人設備 % Channel_Id = "channel_id=1234567890098765432",%% 用戶的某一設備channelid,也就是客戶端demo安裝在的手機的channelid %% 模擬器 Channel_Id = "channel_id=3959774938927755088",%%客戶端模擬器的channelid Device_Type = "device_type=3",%%類型,細節在官方文檔中查看,1:瀏覽器設備;2:PC設備;3:Android設備;4:IOS設備;5:Windows phone設備 Message_Type = "message_type=1",%% 0:消息;1:通知;默認爲0 TitleStr = " :kkkk,嘎嘎嘎阿 達航空 件阿 斯頓,,,,哈哈哈,erlang", DescriptionStr = "行不:行啊!", Messages0 = "messages={\"title\":\"", Messages1 = TitleStr, Messages2 = "\",\"description\":\"", Messages3 = DescriptionStr, Messages4 = "\",\"notification_builder_id\":0," ++ "\"notification_basic_style\":2,\"open_type\":2,\"url\":\"\",\"user_confirm\":0,\"pkg_content\":\"\",\"custom_content\":\"\"}", Messages = Messages0 ++ Messages1 ++ Messages2 ++ Messages3 ++ Messages4, Method = "method=push_msg", Msg_keys= "msg_keys=erlang_keys", Push_Type = "push_type=1", Time = "timestamp="++ integer_to_list((Mega * 1000000 + Sec)), User_Id = "user_id=213123123",%%用戶的userid Url = "http://channel.api.duapp.com/rest/2.0/channel/channel", Http_Method = "POST", SecretKey = "123weqwe12wq12eqweqweqwe",%%用戶的secretekey Str0 = Http_Method ++ Url ++ ApiKey ++ Channel_Id ++ Device_Type ++ Message_Type ++ Messages0, Str1 = Messages2, Str2 = Messages4 ++ Method ++ Msg_keys ++ Push_Type ++ Time ++ User_Id ++ SecretKey, TitleBin = list_to_binary(TitleStr), TIntegerU = unicode:characters_to_list(TitleBin,utf8), TChanges = utf8(TIntegerU,[]), Title_Utf8 = lists:foldl(fun(Change,Acc) -> case Change of [Term] when Term >= $a, Term =< $z -> Acc ++ Change; [Term] when Term >= $A, Term =< $Z -> Acc ++ Change; [Term] when Term >= $0, Term =< $9 -> Acc ++ Change; [Term] when Term =:= $. -> Acc ++ Change; [Term] when Term =:= $_ -> Acc ++ Change; [Term] when Term =:= $- -> Acc ++ Change; [Term] when Term =:= 32 -> Acc ++ [43]; _ -> Acc ++ list_to_hex_s(Change) end end,[],TChanges), DesBin = list_to_binary(DescriptionStr), DIntegerU = unicode:characters_to_list(DesBin,utf8), DChanges = utf8(DIntegerU,[]), Des_Utf8 = lists:foldl(fun(Change,Acc) -> case Change of [Term] when Term >= $a, Term =< $z -> Acc ++ Change; [Term] when Term >= $A, Term =< $Z -> Acc ++ Change; [Term] when Term >= $0, Term =< $9 -> Acc ++ Change; [Term] when Term =:= $. -> Acc ++ Change; [Term] when Term =:= $_ -> Acc ++ Change; [Term] when Term =:= $- -> Acc ++ Change; _ -> Acc ++ list_to_hex_s(Change) end end,[],DChanges), StrValue = escape_uri(Str0) ++ Title_Utf8 ++ escape_uri(Str1) ++ Des_Utf8 ++ escape_uri(Str2), Md5Str = md5_hex(StrValue), Sign = "sign=" ++ Md5Str, PostInfo = ApiKey ++ "&" ++ Sign ++ "&" ++ User_Id ++ "&" ++ Channel_Id ++ "&" ++ Device_Type ++ "&" ++ Message_Type ++ "&" ++ Messages ++ "&" ++ Method ++ "&" ++ Msg_keys ++ "&" ++ Push_Type ++ "&" ++ Time, timer:sleep(30*1000), Result = httpc:request(post,{Url,[],"application/x-www-form-urlencoded",PostInfo},[],[]), case Result of {ok,{{"HTTP/1.1",200,"OK"},_,_}} -> nothing; _ -> io:format("Result:~p~n",[Result]) end.