IOS推送功能的实现(javapns)

简介: IOS的推送实现由这样几步来完成: 创建Push SSL Certification IOS客户端注册Push功能并获得DeviceToken 使用Provider向APNS发送Push消息 IOS客户端接收处理由APNS发来的消息 创建Push SSL Certification     登录developer.apple.com,创建新的App ID,要求此ID的Bundle Identifier不包含通配符,否则不能启用Push以及IAP功能。

IOS的推送实现由这样几步来完成:

  1. 创建Push SSL Certification
  2. IOS客户端注册Push功能并获得DeviceToken
  3. 使用Provider向APNS发送Push消息
  4. IOS客户端接收处理由APNS发来的消息

创建Push SSL Certification

    登录developer.apple.com,创建新的App ID,要求此ID的Bundle Identifier不包含通配符,否则不能启用Push以及IAP功能。例如 com.soso.sosoimage。

    在App IDs列表页面,点击刚创建的app id右面的Configure链接,进入Configure App ID界面,选中"Enable for App Push Notification service"。点击Development Push SSL Certificate一行的Configure按钮,弹出"Apple Push Notification service SSL Certificate Assistant"对话框,依对话框操作,类似于创建开发或发布用的Certificate。

    最终将Development Push SSL Certificate下载并安装到本地Keychain Access。导出成p12文件,备用。导出时需要设置密码,不得为空。

    在developer.apple.com,创建一个新的Provisioning Profile,使用我们刚刚创建的支持Push功能的App ID。下载并安装到本地。

 

IOS客户端注册Push功能并获得DeviceToken

    创建本地工程,info.plist中设置Bundle identifier为刚刚创建的Bundle Id。Com.soso.sosoimage。设定Code Signing Identity为刚刚创建的Provisioning Profile。

    程序第一次执行的时候,调用如下代码.

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];

三个参数分别代表消息(横幅或提醒,由用户Setting决定,程序不可更改)、数字标记、声音。

在AppDelegate.m中添加两个方法.

//iPhone 从APNs服务器获取deviceToken后回调此方法
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSString* dt = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    NSLog(@"deviceToken:%@", dt);
}

//注册push功能失败 后 返回错误信息,执行相应的处理
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err
{
    NSLog(@"Push Register Error:%@", err.description);
}

获取DeviceToken后,将其传给Provider。

使用Provider向APNS发送Push消息

Provider,将推送信息发送给APNS(苹果推送服务器)的程序。有很多开源的实现,我们使用javapns ( http://code.google.com/p/javapns/ )。
首先,Provider要有目标DeviceToken,这是发送目标,由客户端传给Provider之后存在某处。
安装javapns,需要导入的jar为bcprov-jdk15-146.jar, log4j-1.2.15.jar, JavaPNS_2.3_Alpha_5.jar。
将前面导出的P12文件放在Provider的工程目录下。
Provider向APNS发送消息可以参考javapns中NotificationTest.java。也可以参考如下例子。

(1)使客户端图标显示数字标记

Push.badge(2, keystore, password, false, "7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67");

其中,2为要显示的数字;

String keystore = "PushCertificates.p12";     //P12文件的路径;
String password = "sosoimage";                //P12文件的密码;

false,指的是使用测试环境,使用正式产品环境应传入true.
"7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67"为客户端获得并传给Provider的DeviceToken,此参数还可以传入String[]对象,以同时向多个客户端Push消息。

(2)使客户端显示横幅或提醒

Provider可以向客户端Push一条Message,但客户端有权限决定这条Message的显示方式(无、横幅、提醒)。

Push.alert("A Message", keystore, password, )false, "7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67");

(3)混合方式

可以在一个Push消息里附带多种信息,Message, 标记,声音,可以使用如下代码.

PushNotificationPayload payload = PushNotificationPayload.complex();
payload.addAlert("A Message");
payload.addBadge(2);
payload.addSound("test.aiff");
Push.payload(payload, , keystore, password, false, "7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67");

上面的代码都有可能会有相应的Exception抛出来,需要处理。更多的使用方式可以参考 http://code.google.com/p/javapns/ 

IOS客户端接收处理由APNS发来的消息

(1)当程序未启动,用户接收到消息。需要在AppDelegate中的didFinishLaunchingWithOptions得到消息内容。代码如下,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
    
    NSDictionary* payload = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    if (payload) 
    {
    ...
    }

    ...
}

(2)当程序在前台运行,接收到消息不会有消息提示(提示框或横幅)。当程序运行在后台,接收到消息会有消息提示,点击消息后进入程序,AppDelegate的didReceiveRemoteNotification函数会被调用(需要自己重写),消息做为此函数的参数传入,代码如下

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)payload
{ 
    ...
}

(3)无论在哪个函数传入,消息总是一个NSDictionary对象,处理方式可以参考如下代码

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)payload 
{
    NSLog(@"remote notification: %@",[payload description]);
    NSString* alertStr = nil;        
    NSDictionary *apsInfo = [payload objectForKey:@"aps"];    
    NSObject *alert = [apsInfo objectForKey:@"alert"];    
    if ([alert isKindOfClass:[NSString class]])    
    {       
        alertStr = (NSString*)alert;    
    }    
    else if ([alert isKindOfClass:[NSDictionary class]])    
    {        
        NSDictionary* alertDict = (NSDictionary*)alert;        
        alertStr = [alertDict objectForKey:@"body"];    
    }        
    application.applicationIconBadgeNumber = [[apsInfo objectForKey:@"badge"] integerValue];        
    if ([application applicationState] == UIApplicationStateActive && alertStr != nil)    
    {
        UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Pushed Message" message:alertStr delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];    
    }
}

 

来自:http://blog.csdn.net/worldmatrix/article/details/7634596

 

相关文章
|
Java iOS开发
java ,apns, javapns ios消息推送 吐槽
  apple server 检测的token 有问题 (如下图)   如图显示, 我在每1000 个消息的时候 发送一个错误的token,而实际出现了75923处 有个错误的token ,很疑惑,这是apple的问题吗?                                               捐助开发者 在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。
888 0
|
Java iOS开发
javapns IOS推送
javapns IOS推送 package javapns.test; import java.util.*; import javapns.*; import javapns.
888 0
|
1月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
85 3
|
3月前
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
122 2
|
3月前
|
存储 数据建模 数据库
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
IOS开发数据存储:什么是 UserDefaults?有哪些替代方案?
39 0
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
91 2
|
3月前
|
API 开发工具 iOS开发
iOS 开发高效率工具包:10 大必备工具
iOS 开发高效率工具包:10 大必备工具
48 1
|
3月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
54 1
|
7天前
|
API 定位技术 iOS开发
IOS开发基础知识:什么是 Cocoa Touch?它在 iOS 开发中的作用是什么?
【4月更文挑战第18天】**Cocoa Touch** 是iOS和Mac OS X应用的核心框架,包含面向对象库、运行时系统和触摸优化工具。它提供Mac验证的开发模式,强调触控接口和性能,涵盖3D图形、音频、网络及设备访问API,如相机和GPS。是构建高效iOS应用的基础,对开发者至关重要。
11 0
|
22天前
|
开发工具 Swift iOS开发
利用SwiftUI构建动态用户界面:iOS开发新范式
【4月更文挑战第3天】 随着苹果不断推进其软件开发工具的边界,SwiftUI作为一种新兴的编程框架,已经逐渐成为iOS开发者的新宠。不同于传统的UIKit,SwiftUI通过声明式语法和强大的功能组合,为创建动态且响应式的用户界面提供了一种更加简洁高效的方式。本文将深入探讨如何利用SwiftUI技术构建具有高度自定义能力和响应性的用户界面,并展示其在现代iOS应用开发中的优势和潜力。