os apns-apple notification server 与第三方provider的通信原理网上已有很多介绍,这里不再介绍,有想了解的大家可以去IOS官网https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW1
学习了解.
网上关于IOS apns自己实现的很少,一般是Java或者PHP,目前还有一个用C++实现的,看了看,然后自己想用erlang实现与IOS apns的通信,进过努力实现了,与大家分享.
-define(URL,"gateway.sandbox.push.apple.com").
-define(PORT,2195).
-define(DEVICE_TOKEN,"3bd9dbf509cd92d41a3334d8ab0fcced1a6fc27c7c1bc60324b2bafe1c15cadf").
start() ->
ssl:start(),
case gen_tcp:connect(?URL,?PORT,[binary],infinity) of
{ok,Socket} ->
case ssl:connect(Socket,[{certfile,"./ios_app/PushChatCert.pem"},
{keyfile,"./ios_app/PushChatKey.pem"},
{password,"123456"}],
infinity) of
{ok,SslSocket} ->
io:format("####socket connect:~p~n",["ok"]),
Command = <<0:8>>,
Token = ?DEVICE_TOKEN,
DeviceList = change_16_to_10(Token,[]),
Device = list_to_binary(DeviceList),
io:format("##Device:~p~n",[Device]),
DeviceL = length(DeviceList),
DeviceBin = <<DeviceL:16>>,
Message = "{\"aps\":{\"alert\":\"哈哈我的测试\",\"badge\":4,\"sound\":\"default\"}}",
MessageL = length(Message),
MessageBin = <<MessageL:16>>,
Data = list_to_binary([Command,DeviceBin,Device,MessageBin,Message]),
case ssl:send(SslSocket,Data) of
ok ->
io:format("######send ok!~n");
{error,SReason} ->
io:format("####SReason:send error:~p~n",[SReason])
end;
{error,Reason} ->
io:format("####Reason:~p~n",[Reason])
end;
{error,FRe} ->
io:format("#FRe:~p~n",[FRe])
end.
 
 
change_16_to_10([],L) ->
lists:reverse(L);
change_16_to_10([H,T|Tail],L) ->
First = assci_to_10_type(H),
Second = assci_to_10_type(T),
One = First * 16 + Second,
change_16_to_10(Tail,[One|L]).
 
 
assci_to_10_type(Term) when Term >= $a andalso Term =< $f ->
Term - $a + 10;
assci_to_10_type(Term) when Term >= $A,Term =< $F ->
Term - $A + 10;
assci_to_10_type(Term) when Term >= $0,Term =< $9 ->
Term - $0;
assci_to_10_type(_Term) ->
0.
 
与苹果apns通信的证书怎么来的?参考IOS官方文档.
简单介绍:需要iOS开发者提供给服务端的开发者aps_production.cer从苹果开发者网站下载;
然后在终端中输入下面命令
openssl x509 -in aps_production.cer -inform der -out PushChatCert.pem
得到PushChatCert.pem
双击安装aps_production.cer到钥匙串,在钥匙串中找到刚才安装的推送证书,点开,右键导出秘要,命名为youkey.p12;demo中是PushChatKey.p12
然后在终端中输入下面命令
openssl pkcs12 -nocerts -out PushChatKey.pem -in  PushChatKey.p12
此处需要输入密码,demo中的密码:123456
重复确认密码,得到PushChatKey.pem

erlang -- ios apns provider -- erlang 实现的更多相关文章

  1. Easy APNs Provider 消息推送测试工具

    1.Easy APNs Provider 简介 Easy APNs Provider 是一款为 iOS.Mac App 提供推送测试的小工具. App Store 下载地址 Easy APNs Pro ...

  2. ios APNS注册失败 本地push

    - (void)addLocalNotice:(NSString *)titlepush { if (@available(iOS 10.0, *)) { UNUserNotificationCent ...

  3. iOS APNs实战分享

    序言: 因为App的功能需要,最近一直在调研苹果的APNs推送,开始时觉得超麻烦,现在感觉还是比较easy,“难者不会,会者不难”,自己踩过了这么多的坑终于会了,不出来吐槽(装X)一下对不起自己,23 ...

  4. iOS apns推送

    前言:推送分为本地推送以及远程推送. 两者的区别为本地推送一般为定时推送.定期推送或者位置推送.而远程推送更为多样化,能满足较高的要求.当然远程推送需要服务器端开发,开发流程较复杂. 1.本地推送只需 ...

  5. c#上iOS apns p12文件制作记录 iOS推送证书制件

    前期一些准备工作可参考:http://jingyan.baidu.com/article/7082dc1c6bb86de40a89bd1a.html 1.在桌面上建一个"apns_p12&q ...

  6. c#上iOS apns p12文件制作记录

    1.在桌面上建一个"apns_p12"文件夹,所有的保存和生成文件都放在这里 2.从钥匙串中生成CertificateSigningRequest.certSigningReque ...

  7. iOS APNs远程推送流程精简版

    1.去Apple Developer Center里创建应用的信息,指定APP ID(Bundle ID),配置里开启推送功能(Push Notifications). 后续步骤需要用到这个应用的包名 ...

  8. iOS APNS配置(转)

    Introduction To send Push notification to an application/device couple you need an unique device tok ...

  9. iOS APNS远程推送(史上最全步骤)

    /*****************************************1************************************************/ waterma ...

随机推荐

  1. 《Effective Java》读书笔记五(枚举和注解)

    No30 用enum代替int常量 一:综述 int枚举模式,示范: // The int enum pattern - severely deficient! public static final ...

  2. Java:Swing篇,实现JList、JTextArea的自动滚动,实时刷新功能

    1. 功能 作为swing的组件,JList与JTextArea是不可以单独实现滚动功能的,需要与JScrollPane结合才可以. 本代码中: JList实现从其它数据源获取数据,然后依次对这些数据 ...

  3. typedef的用法再思考

    最近重读c语法,有所感悟,记录. 有时候感悟,其实就是猜,假想,作者创建语言的想法,通俗的讲就是丹尼斯灵魂附体了,这个时候任何c语言难点对于你来说,就像吃饭喝水一样简单了,同时还能发现它优美动人之处. ...

  4. git的全局变量

    git的全局变量可以用在命令行设置: git config --global user.name "litifeng" git config --global user.email ...

  5. js控制表单操作的常用代码小结

    收集了一些在WEB前台开发中常用的一些控制表单操作函数. 1.鼠标经过时自动选择文本鼠标划过自动选中:<input type="text" value="默认值&q ...

  6. 使用UINavigationController后导致UIScollView尺寸变化

    转自:http://www.w3c.com.cn/%E4%BD%BF%E7%94%A8uinavigationcontroller%E5%90%8E%E5%AF%BC%E8%87%B4uiscollv ...

  7. hdoj2571 命运

    命运 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  8. vue-cli脚手架里如何配置屏幕自适应

    很多同学可能在写h5的时候,也会遇到移动端如何控制屏幕自适应问题!在移动端网页开发中,我们可以用手机淘宝的flexible.那么在vue当中,也同样可以用!接下来就介绍下如何在vue-cli配置的项目 ...

  9. FreeRTOS 低功耗之待机模式

    STM32F103 如何进入待机模式在 FreeRTOS 系统中,让 STM32 进入待机模式比较容易,调用固件库函数PWR_EnterSTANDBYMode 即可. STM32F103 如何退出待机 ...

  10. Windows获取线程起始地址

    typedef enum _THREADINFOCLASS { ThreadBasicInformation, ThreadTimes, ThreadPriority, ThreadBasePrior ...