惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
V
Visual Studio Blog
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
B
Blog
I
InfoQ
博客园 - 三生石上(FineUI控件)
阮一峰的网络日志
阮一峰的网络日志
F
Fortinet All Blogs
H
Help Net Security
博客园 - Franky
宝玉的分享
宝玉的分享
博客园 - 司徒正美
C
Check Point Blog
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Jina AI
Jina AI
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
A
About on SuperTechFans
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家

博客园 - xiaohu

谈谈Memcached与Redis jquery ui dialog弹出窗 清空缓存Cache或强制刷新 Android中,在onAnimationEnd方法中调用 viewgroup.removeview,报 nullpointerexception异常的解决方法 .NET 应用内存泄漏的诊断 discuz NT 在IIS7上部署后,应用程序池停止 大型网站性能及安全 简述 .Net导出Excel的两种方法,导出Word亦类似 SqlServer2005 重建索引 SQL Server 2008下日志清理方法(非dump语句) JS document.writeln 输出中文乱码问题的解决方法 JS javascript实现url编码和url解码(urlEncode urlDecode) IIS6配置GZIP压缩网页来提升网页浏览速度 ASP.NET 递归算法 生成N级(级联)树TreeView MOSS视频教程 - Office SharePoint Server 2007开发与应用 IE8兼容IE7模式代码:X-UA-Compatible详解 利用ajax.dll进行asp.net ajax开发 Quartz的时间配置 网络负载均衡(NLB)及Session 同步相关 如何彻底卸载oracle
iPhone消息推送机制(Push)实现及通过.net应用程序发送消息...
xiaohu · 2012-01-31 · via 博客园 - xiaohu

如果图片看不到,请参考: http://blog.csdn.net/zhuqilin0/article/details/6527113

Push的原理:
Push 的工作机制可以简单的概括为下图

图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider。 
APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。
上图可以分为三个阶段。
第一阶段:.net应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。 
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。 
第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。
 
    从上图我们可以看到。
   1、首先是应用程序注册消息推送。
   2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
   3、应用程序将deviceToken发送给PUSH服务端程序。
   4、 服务端程序向APNS服务发送消息。
   5、APNS服务将消息发送给iPhone应用程序。
    无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的。下面我介绍一下几种用到的证书。
几种证书:
一、*.certSigningRequest文件
   1、生成Certificate Signing Request (CSR):

2、填写你的邮箱和Common Name,这里填写为PushChat。选择保存到硬盘。

这样就在本地生成了一个PushChat.certSigningRequest文件。
二、生成*.p12文件
1、导出密钥,并输入你的密码。

输入你的密码:

这样就生成了一个PushChatKey.p12文件。
三、新建一个App ID 和SSL certificate文件
1、用你的付过费的apple帐号登录到
iOS Provisioning Portal。新建一个App ID。
     Description:中输入PushChat
     Bundle Seed ID:默认选择Generate New
     Bundle Identifier:输入com.mysoft.PushChat
    点击提交

这样就会生成下面这条记录:

点击配置:

出现下面界面,点击继续:

这里我们选择前面生成好的PushChat.certSigningRequest文件,点击生成。

正在生成

生成完毕,我们把它下载下来。命名为aps_developer_identity.cer

点击完成,你会发现状态变成Enabled。

到现在为止,我们已经生成了3个文件。
1、PushChat.certSigningRequest
2、PushChatKey.p12
3、aps_developer_identity.cer
现在我们创建一个简单的iPhone应用程序。
1、打开Xcode,选择创建一个View-based Application。命名如下图:

2、在PushChatAppDelegate中的didFinishLaunchingWithOptions方法中加入下面代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *

)launchOptions
{
self.window.rootViewController
 = 
self.viewController;
[self.window makeKeyAndVisible];
// Let the device know we want to receive push notifications
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge
 | UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)];return YES;
}

通过registerForRemoteNotificationTypes方法,告诉应用程序,能接受push来的通知。
3、在xcode中运行,会弹出下面的提示框:

选择OK。表示此应用程序开启消息通知服务。
在 PushChatAppDelegate.m代码中添加下面方法获取deviceToken:

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*

)deviceToken
{
NSLog(
@"My token is: %@"
, deviceToken);
}
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*
)error
{
NSLog(
@"Failed to get token, error: %@"
, error);
}

获取到的deviceToken,我们可以通过webservice服务提交给.net应用程序,这里我简单处理,直接打印出来,拷贝到.net应用环境中使用。
发送通知的.net应用程序出来需要知道deviceToken之外,还需要一个与APNS连接的证书。
这个证书可以通过我们前面生成的两个文件中得到。
使用OpenSSL生成.net和APNS通信的证书文件。
1、将aps_developer_identity.cer转换成 aps_developer_identity.pem格式。
openssl x509 -in aps_developer_identity.cer -inform DER -out aps_developer_identity.pem -outform PEM
2、将p12格式的私钥转换成pem,需要设置4次密码,这里密码都设置为:abc123。
openssl pkcs12 -nocerts -out PushChat_Noenc.pem -in PushChat.p12
3、用certificate和the key 创建PKCS#12格式的文件。
openssl pkcs12 -export -in aps_developer_identity.pem -inkey PushChat_Noenc.pem -certfile PushChat.certSigningRequest -name "aps_developer_identity" -out aps_developer_identity.p12
这样我们就得到了在.net应用程序中使用的证书文件:aps_developer_identity.p12
在.net应用程序中发送通知。
有个开源的类库:apns-sharp。
地址是:

http://code.google.com/p/apns-sharp/
我们下载源代码,对里面的JdSoft.Apple.Apns.Notifications做相应的调整就能用了。
我们根据DeviceToken和p12File对JdSoft.Apple.Apns.Notifications.Test代码做相应的调整,如下图。

这样就OK了。
效果:
通知的代码:

for (int i = 1; i <= count; i++

)
{
//Create a new notification to sendNotification alertNotification = new 
Notification(testDeviceToken);

alertNotification.Payload.Alert.Body

 = string.Format("Testing {0}..."
, i);
alertNotification.Payload.Sound
 = "default"
;
alertNotification.Payload.Badge
 = 
i;//Queue the notification to be sentif (service.QueueNotification(alertNotification))
Console.WriteLine(
"Notification Queued!"
);
elseConsole.WriteLine("Notification Failed to be Queued!"
);//Sleep in between each messageif (i < count)
{
Console.WriteLine(
"Sleeping " + sleepBetweenNotifications + " milliseconds before next Notification..."
);
System.Threading.Thread.Sleep(sleepBetweenNotifications);
}
}

总结:首先要了解原理,原理了解了,什么都好说,具体的一些操作,并不是什么难题,希望对大家有所帮助!