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. js替换iframe的内容

    使用如下方法可以替换页面中iframe里面的内容: for (var i=0; i<window.parent.frames.length; i++) { //window.parent.fra ...

  2. SpringMVC中异常处理详解

    Spring MVC处理异常最基本的就是HandlerExceptionResolver这个接口,先看张图 分析上图可以轻松总结出,spring mvc里有三种异常处理方法: 1.使用官方提供的简单异 ...

  3. 创建者模式Builder

    创建者模式: 分离对象子组件的单独构造(由Builder来负责)和装配(由Director负责),对象的构造比较复杂时使用 该模式. 类图: Builder 抽象建造者接口,规范各个组成部分的构建. ...

  4. vim:关于映射和跳出括号

    先说如何自动补全. 命令:vim .vimrc inoremap ( ()<ESC>i inoremap [ []<ESC>i inoremap { {}<ESC> ...

  5. Progressive Web App

    下一代 Web 应用? 近年来,Web 应用在整个软件与互联网行业承载的责任越来越重,软件复杂度和维护成本越来越高,Web 技术,尤其是 Web 客户端技术,迎来了爆发式的发展. 包括但不限于基于 N ...

  6. css3实现立方体效果

    <!DOCTYPE html><html><head><meta charset="utf-8" /><title>&l ...

  7. 【Java】包装类总结

    Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数 ...

  8. vim复制粘贴常用命令

    在Windows下我们习惯的操作,复制单个字符,复制单行多行,删除单行多行,在linux的vim中操作如下: G(shift+g+g):跳到文档尾 g+g:跳转到文档首 home键:光标移动到行首 e ...

  9. java 关于同步异步的理解

    经常看到介绍 ArrayList 和HashMap是异步,Vector和HashTable是同步,这里同步是线程安全的,异步不是线程安全的,举例说明: 当创建一个Vector对象时候, Vector ...

  10. 【WPF】ComboBoxItem的禁用

    需求:下拉列表ComboBox中,要求部分Item不可用.效果是鼠标一上去后不获得焦点,且无法点击. 前台XAML界面: <!-- 下拉列表:省份 --> <ComboBox Gri ...