- 浏览: 908820 次
- 性别:
- 来自: 湖北—》上海
最新评论
-
miketwais:
janyee2012 写道楼主在不,请问下面这句配置在disc ...
cas实现单点登录,登出(java和php客户端) -
f5528710:
IOS 利用UIScrollview实现滑动筛选 -
卡卡欧克:
php 客户端 不能和 java 客户端 同时登录 怎么办
cas实现单点登录,登出(java和php客户端) -
duanyutian:
大神 我加0 或者\n都没有用 和mina的通信有没有注意点 ...
ios socket AsyncSocket使用 -
周聪龙:
楼主,我按照你的那个配置之后,怎么反而不能登录了,我以前只是简 ...
cas 3.4登录成功返回用户更多信息
IOS推送消息是许多IOS应用都具备的功能,最近也在研究这个功能,参考了很多资料终于搞定了,下面就把步骤拿出来分享下:
iOS消息推送的工作机制可以简单的用下图来概括:
Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器。
上图可以分为三个阶段:
第一阶段:应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。
从上图我们可以看到:
1、应用程序注册消息推送。
2、iOS从APNS Server获取device token,应用程序接收device token。
3、应用程序将device token发送给PUSH服务端程序。
4、服务端程序向APNS服务发送消息。
5、APNS服务将消息发送给iPhone应用程序。
无论是iPhone客户端和APNS,还是Provider和APNS,都需要通过证书进行连接。
下面我介绍一下几种用到的证书。
一、CSR文件
1、生成Certificate Signing Request(CSR)
2、填写你的邮箱和常用名称,并选择保存到硬盘。
点击继续:
这样就在本地生成了一个Push.certSigningRequest文件。
二、p12文件
1、导出密钥。
2、输入你的密码。
这样就生成了一个Push.p12文件。
三、SSL certificate文件
1、用你付过费的帐号登录到iOS Provisioning Portal,并新建一个App ID,这个过程可以参考:iOS应用的真机调试,这样就会生成下面这条记录:
2、点击右侧的Configure:
3、点击Development Push SSL Certificate一行后的Configure:
4、点击Continue:
5、选择前面生成好的Push.certSigningRequest文件,点击Generate,出现如下所示的页面:
6、点击Continue:
7、点击Download,并将文件命名为aps_developer_identity.cer。
8、点击Done,你会发现状态变成了Enabled:
到现在为止,我们已经生成了三个文件:
1、Push.certSigningRequest
2、Push.p12
3、aps_developer_identity.cer
双击aps_developer_dientity.cer 注册到你的钥匙串中,这样你的钥匙串中就会有
二、准备profile证书,因为推送消息只能再真机上测试,所以要建一个profile证书
点击"new profile"为上面新建的APP ID建个profile ,成功之后下载*_Dev_Profile.mobileprovision
双击将其加入到xcode 的Provisioning Profiles 中,这里有一点要注意,再将这个加入xcode之前如果之前已经加入过一定要把之前加入的删掉,如果有多个的话会出错。
三、工程代码
到这里证书已经准备完毕,接下来,我们在xcode中新建一个测试工程,注意设置工程的Bundle Identifier必须与上面建的APP ID 里的相同
在didFinishLaunchingWithOptions 中加入一下代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self.window makeKeyAndVisible];
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
return YES;
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken {
NSLog(@"regisger success:%@", pToken);
//注册成功,将deviceToken保存到应用服务器数据库中
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
// 处理推送消息
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"通知" message:@"我的信息" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:nil, nil];
[alert show];
[alert release];
NSLog(@"%@", userInfo);
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"Regist fail%@",error);
}
到这里一切顺利的话我们就可以在真机运行了,注册成功我们会得到iphone 的deviceToken,
My token is:
<740f4707 bebcf74f 9b7c25d4 8e335894 5f6aa01d a5ddb387 462c7eaf 61bb78ad>
四、在应用服务器采用php的方式将消息推送给APNS,
1、php连接APNS也是需要证书的,还记得我们上面获得的几个证书吗?打开终端,对上面的证书做如下处理,
cd 进入证书所在目录
把.cer文件转换成.pem文件:
$ openssl x509 -in aps_developer_identity.cer -inform der
-out PushChatCert.pem
把私钥Push.p12文件转换成.pem文件:
$ openssl pkcs12 -nocerts -out PushChatKey.pem -in Push.p12
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying – Enter PEM pass phrase:
你首先需要为.p12文件输入passphrase密码短语,这样OpenSSL可以读它。然后你需要键入一个新的密码短语来加密PEM文件。还是使用”pushchat”来作为PEM的密码短语。你需要选择一些更安全的密码短语。
注意:如果你没有键入一个PEM passphrase,OpenSSL将不会返回一个错误信息,但是产生的.pem文件里面将不会含有私钥。
最后。把私钥和证书整合到一个.pem文件里:
$ cat PushChatCert.pem PushChatKey.pem > ck.pem
为了测试证书是否工作,执行下面的命令:
$ telnet gateway.sandbox.push.apple.com 2195
Trying 17.172.232.226…
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is ‘^]’.
它将尝试发送一个规则的,不加密的连接到APNS服务。如果你看到上面的反馈,那说明你的MAC能够到达APNS。按下Ctrl+C 关闭连接。如果得到一个错误信息,那么你需要确保你的防火墙允许2195端口。
然后再次连接,这次用我们的SSL证书和私钥来设置一个安全的连接:
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195
-cert PushChatCert.pem -key PushChatKey.pem
Enter pass phrase for PushChatKey.pem:
你会看到一个完整的输出,让你明白OpenSSL在后台做什么。如果连接是成功的,你可以键入一些字符。当你按下回车后,服务就会断开连接。如果在建立连接时有问题,OpenSSL将会给你一个错误消息,
ck.pem文件就是我们需要得到php连接APNS 的文件,将ck.pem和push.php放入同一目录上传到服务器,push.php的代码如下:
<?php
// 这里是我们上面得到的deviceToken,直接复制过来(记得去掉空格)
$deviceToken = '740f4707bebcf74f 9b7c25d4 8e3358945f6aa01da5ddb387462c7eaf 61bb78ad';
// Put your private key's passphrase here:
$passphrase = 'abc123456';
// Put your alert message here:
$message = 'My first push test!';
////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
// Open a connection to the APNS server
//这个为正是的发布地址
//$fp = stream_socket_client(“ssl://gateway.push.apple.com:2195“, $err, $errstr, 60, //STREAM_CLIENT_CONNECT, $ctx);
//这个是沙盒测试地址,发布到appstore后记得修改哦
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);
echo 'Connected to APNS' . PHP_EOL;
// Create the payload body
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);
// Encode the payload as JSON
$payload = json_encode($body);
// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;
// Close the connection to the server
fclose($fp);
?>
接下来我们访问http://localhost/push/push.php
iphone就会接收到一条推送消息了,如果有问题的话就检查上面的操作步骤,特别是加红的部分
另外去除标记的方法为,在viewDidApper中加入
int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
if(badge > 0)
{
badge--;
[UIApplication sharedApplication].applicationIconBadgeNumber = badge;
}
给一个参考地址:http://article.ityran.com/archives/194
评论
Warning: pack(): Type H: illegal hex digit s in apple.php on line 44
PHP Warning: pack(): Type H: illegal hex digit z in apple.php on line 44
就是这句出问题
// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
为什么呢?
Error opening client certificate private key file PushChatKey.pem
712:error:02001002:system library:fopen:No such file or directory:/SourceCache/OpenSSL098/OpenSSL098-44/src/crypto/bio/bss_file.c:356:fopen('PushChatKey.pem','r')
712:error:20074002:BIO routines:FILE_CTRL:system lib:/SourceCache/OpenSSL098/OpenSSL098-44/src/crypto/bio/bss_file.c:358:
unable to load client certificate private key file
你运行过pushmebaby的demo没?
你执行哪个命令报错啊,我写的东西全部测试过,都ok
Error opening client certificate private key file PushChatKey.pem
712:error:02001002:system library:fopen:No such file or directory:/SourceCache/OpenSSL098/OpenSSL098-44/src/crypto/bio/bss_file.c:356:fopen('PushChatKey.pem','r')
712:error:20074002:BIO routines:FILE_CTRL:system lib:/SourceCache/OpenSSL098/OpenSSL098-44/src/crypto/bio/bss_file.c:358:
unable to load client certificate private key file
你运行过pushmebaby的demo没?
我按您的步聚,执行程序成功后
显示 Connected to APNS Message successfully delivered
但是ipad 没有接收到消息,请问这是什么原因?
好好的检查一下你的各个步骤,设备的id获取到了没?
我按您的步聚,执行程序成功后
显示 Connected to APNS Message successfully delivered
但是ipad 没有接收到消息,请问这是什么原因?
发表评论
-
Xcode8下载与安装iOS模拟器
2016-11-14 10:52 1862由于天朝的网络环境,在macOS中安装体积较大的软件,都会遭 ... -
AFNetWorking 3.0 用法
2016-10-28 14:48 9061、文件下载 AFHTTPSessionManager ... -
iOS开发 适配iOS10以及Xcode8
2016-09-19 10:35 708现在在苹果的官网上 ... -
CocoaPods安装和使用教程
2015-05-27 11:09 953首先需要mac电脑上安装ruby环境系统需求Mac OS X ... -
IOS UIImagePickerController 不能全屏
2015-01-06 23:27 5959添加以下代码可以使取景框全屏 CGSize scre ... -
openfire 插件开发
2014-07-23 11:51 5194最近在做openfire的ios推送插件,下面介绍下ope ... -
openfire3.9.3导入eclipse
2014-07-21 17:00 6815最近在用openfire开发ios通讯功能,需要开发一个推送 ... -
ios 处理圆角图片拉伸
2014-06-26 09:33 2622类似9patch效果的iOS图 ... -
使用Xcode和Instruments调试解决iOS内存泄露
2014-05-21 09:00 1105虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关 ... -
ios 使用ZBar读取条形码和二维码
2014-05-19 11:37 106481.使用ZBar项目。下载地址是: http://zbar ... -
ios 中gzip与unGzip
2014-05-14 15:09 1882工程中添加libz.dylib .h文件如下: # ... -
ios socket AsyncSocket使用
2014-05-10 23:27 10740一.项目添加ASyncSocket 1.下载ASyn ... -
ios7 改变状态栏颜色
2014-01-14 15:30 4265ios7 状态栏默认为白底黑色,怎么改变为黑底白字呢,以下为 ... -
iOS企业账号发布流程
2013-12-31 14:33 28601这两天需要发布一个ipa放到网上供其他人安装,需要用到企业级 ... -
ios GDataXMLNode 操作xml
2013-11-28 15:25 1626创建XML: //创建XML GData ... -
ios NSdata 与 NSString,Byte数组相互转换
2013-11-28 14:42 91501. NSData 与 NSString NSData- ... -
Android、iPhone和Java三个平台一致的加密方法
2013-11-25 22:52 3816先前一直在做安卓,最近要开发iPhone客户端,这其中遇到的 ... -
iOS开发图像处理--绘制图片上下颠倒
2013-11-16 22:07 2039使用CGContextDrawImage绘制图片上下颠倒 ... -
iphone 静态库读取资源文件
2013-08-07 17:43 7795在制作iphone静态库中并不能包含资源文件,虽然我们将资 ... -
IOS UIWebView截获html并修改便签内容,宽度自适应
2013-04-24 20:14 25495需求:混合应用UIWebView打开html后,UIWebV ...
相关推荐
关于IOS_APNS推送消息(iphone端+服务端)。关于IOS_APNS推送消息(iphone端+服务端)。
ios消息推送源码,包括php服务端,做apns的朋友可以直接使用。xcode6.1 做的一个demo
苹果ios推送java服务端耗码demo
c#语言IOS推送服务端全程代码, windows服务全程代码, windows服务安装程序设置, 实现IOS推送服务C#语言服务端代码实现
ios消息推送java服务端实现 java push notification
java服务端推送消息给ios客户端,有兴趣的朋友可以看下
本程序为测试ios推送消息程序。 生成推送证书后,添加到本程序根目录下,并配置JdSoft.Apns.Test.exe.config文件,就可以向指定设备推送消息。 可一作为验证证书是否生成正确。 ///证书名称 ...
IOS消息推送机制 ios消息推送主要主流有两种方式,一种是基于javaapns.jar和javaPNS.jar的开源的消息推送,javaPNS.jar支持多线程。
本篇文章是对php做推送服务端实现ios消息推送的方法进行了详细的分析介绍,需要的朋友参考下
IOS 推送 mac的服务端 实现推送 mac的服务器
iOS开发中遇到推送测试时首先遇到的是服务端发送推送消息,上传的这段代码可以更简单的使用,只要在终端运行一下
Java APNS推送消息 HTTP/2协议, 基于JDK 11及以上
IOS推送JAVA服务端文档,javaPNS2.2
IOS 消息推送 java服务端和客户端源码
里面是开发ios服务端消息推送java jar包
APNS推送php推送服务器代码 iOS
推送php端代码
APNS消息推送服务端, 运行系统mac os 连结服务器,为gateway.sandbox.push.apple.com
CIM是一套基于mina或netty框架下的推送系统,或许有一些企业有着自己一套即时通讯系统的需求,那么CIM为您提供了一个解决方案,目前CIM支持websocket,android,ios,桌面应用,系统应用等多端接入支持,可应用于移动...
小米推送服务端SDK官方只提供了PHP与JAVA版本,C#、.Net小米官方是没有的,这个是通过JAVA版本转换成C#、.Net的版本,可以直接集成至现在C#、.Net的服务端项目,满足移动项目消息推送需求