IOS推送功能的实现(javapns)

简介:

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


本文转自天天_byconan博客园博客,原文链接:http://www.cnblogs.com/tiantianbyconan/archive/2013/06/06/3121724.html,如需转载请自行联系原作者

 

分类:  java, ios
相关文章
|
存储 数据建模 iOS开发
iOS设备功能和框架: 什么是 Core Data,它在 iOS 中的作用是什么?
iOS设备功能和框架: 什么是 Core Data,它在 iOS 中的作用是什么?
470 1
|
定位技术 iOS开发
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
577 0
|
移动开发 安全 前端开发
提升iOS应用安全性:全面代码混淆功能介绍,使用Ipa Guard保护你的应用
iOS加固保护是直接针对ios ipa二进制文件的保护技术,可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进行完整性保护,防止应用程序中的代码及资源文件被恶意篡改。Ipa Guard通过修改 ipa 文件中的 macho 文件中二进制数据(代码模块配置)进行操作,无需源码。不限定开发技术平台。支持oc,swift,cocos2d-x、unity3d、quick-cocos,html5 ,react native等等各种开发技术。Ipa Guard主要包含代码混淆全面、资源文件处理、不需要源代码更安全、调试信息清理、即时测试运行。
|
监控 搜索推荐 数据安全/隐私保护
深入探索iOS 14的隐私保护功能
本文将深入探讨iOS 14操作系统中的隐私保护功能,包括新的隐私指示器、应用程序跟踪透明度以及增强的隐私设置。我们将分析这些功能如何提高用户对个人数据的控制权,并讨论它们对应用开发者和广告行业的影响。
542 28
|
存储 安全 数据安全/隐私保护
深入解析iOS 14隐私保护功能:用户数据安全的新里程碑
随着数字时代的到来,个人隐私保护成为全球关注的焦点。苹果公司在最新的iOS 14系统中引入了一系列创新的隐私保护功能,旨在为用户提供更透明的数据使用信息和更强的控制权。本文将深入探讨iOS 14中的几项关键隐私功能,包括App跟踪透明性、简化的隐私设置以及增强的系统安全性,分析它们如何共同作用以提升用户的隐私保护水平。
934 3
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
686 3
|
人工智能 搜索推荐 iOS开发
苹果发布iOS 18 Beta 4,新增CarPlay 壁纸等多项功能改进
本文首发于公众号“AntDream”,探索iOS 18 Beta 4新功能与改进: CarPlay壁纸、iCloud设置访问优化、相机控制记忆、隐藏文件夹设计变更、深色/浅色模式图标同步、股票应用图标调整、iPhone镜像功能增强、控制中心蓝牙切换键、AssistiveTouch新增Type to Siri等,以及Apple Intelligence暗示。开发者可通过苹果计划提前体验。
406 12
|
Android开发 数据安全/隐私保护 iOS开发
ios和安卓测试包发布网站http://fir.im的注册与常用功能
ios和安卓测试包发布网站http://fir.im的注册与常用功能
1487 0
ios和安卓测试包发布网站http://fir.im的注册与常用功能
|
机器学习/深度学习 PyTorch TensorFlow
iOS设备功能和框架: 什么是 Core ML?如何在应用中集成机器学习模型?
iOS设备功能和框架: 什么是 Core ML?如何在应用中集成机器学习模型?
735 0
|
iOS开发
iOS设备功能和框架: 如何使用 Core Animation 创建动画效果?
iOS设备功能和框架: 如何使用 Core Animation 创建动画效果?
374 0

热门文章

最新文章