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. laravel5的Bcrypt加密方式对系统保存密码

    laravel5文档介绍 //对 A 密码使用Bcrypt 加密 $password = Hash::make('mima'); //你也可直接使用 bcrypt 的 function $passwo ...

  2. Windows Azure Mobiles Services实现client的登录注冊

    下文仅仅是简单实现,client以Android端的实现为例: 用户表Account: package com.microsoft.ecodrive.model; public class Accou ...

  3. TCP通信的三次握手和四次撒手的详细流程(顿悟)

    TCP(Transmission Control Protocol) 传输控制协议 三次握手 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位 ...

  4. angular学习笔记(十四)-$watch(3)

    同样的例子,还可以这样写: <!DOCTYPE html> <html ng-app> <head> <title>11.3$watch监控数据变化&l ...

  5. ny16 矩形嵌套

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...

  6. 命令运行带参数的jar

    一.打包(此处用的是eclipse) 代码如下,此如引用了某博主的代码,因忘记地址,如博主发现此文,可私信我 package com.example.Open; import java.io.File ...

  7. JavaHbase连接代码示例

    package com.rokid.hbase; import java.io.IOException; import org.apache.hadoop.conf.Configuration; im ...

  8. JSP页面最终是编译为Servlet执行的

    JSP页面最终是编译为Servlet执行的,你可以在Tomcat的%CATALINA_HOME%/work/Catalina/localhost中找到一个文件夹,该文件夹跟你的web-project的 ...

  9. Ubuntu设置root密码

    最初使用系统时,只有当前管理员的密码,root密码为随机生成的. 通过 sudo passwd 设置root密码,然后su获得root,也就是最高权限

  10. tomcat架构分析(概览)

    出处:http://gearever.iteye.com Tomcat是目前应用比较多的servlet容器.关于tomcat本身的特点及介绍,网上已经有很多描述了,这里不再赘述.Tomcat除了能够支 ...