IOS 推送详解

一.关于推送通知

推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能。是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务器发送到应用程序上的。一般说来,当要显示消息或下载数据的时候,通知是由远程服务器(程序的提供者)发送,然后通过苹果的推送通知服务(Apple Push Notification Service,简称apns)推送到设备的程序上。

推送的新消息可能是一条信息、一项即将到期的日程或是一份远程服务器上的新数据。在系统上展现的时候,可以显示警告信息或在程序icon上显示数字,同时,也可以播放警告音。一旦用户注意到程序有新的信息、时间或是数据,他们可以运行程序并访问新的内容。也可以选择忽略通知,这时程序将不会被激活。

iPhone, iPad和iPod touch上同一时刻只有一个app在前台运行。大多数程序在后台运行的时候,可以对某些用户感兴趣的内容做出回应(定时、或数据等)。推送通知能让程序在这些事件发生的时候通知用户。

作为提供者为程序开发和部署推送通知,必须通过iOS Developer Program Portal获得SSL证书。每个证书限用于一个程序,使用程序的bundle ID作为标识。证书有两种用途的:一种是针对sandbox(用于开发和测试),另外一种针对发布产品。这两种运行环境拥有为各自指定的IP地址并且需要不同的证书。还必须为两种不同的环境获取各自的provisioning profiles。

APNS提供了两项基本的服务:消息推送和反馈服务。

消息推送:使用流式TCP套接字将推送通知作为二进制数据发送给APNs。消息推送有分别针对开发和测试用的sandbox、发布产品的两个接口,每个都有各自的地址和端口。不管用哪个接口,都需要通过TLS或SSL,使用SSL证书来建立一个安全的信道。提供者编制通知信息,然后通过这个信道将其发送给APNs。 注:sandbox:   gateway.sandbox.push.apple.com:219 产品接口:gateway.push.apple.com:2195

反馈服务:可以得到针对某个程序的发送失败记录。提供者应该使用反馈服务周期性检查哪些设备一直收不到通知,不需要重复发送通知到这些设备,降低推送服务器的负担。 注:sandbox:feedback.push.apple.com:2196 产品接口:feedback.sandbox.push.apple.com:2196

二.Apple Push Notification的工作机制

自己的客户端发送消息到自己应用软件的apns,apns发送消息到你的手机。这个是根据令牌识别的。手机在发送消息到你的应用软件。

  • 首先是应用程序注册消息推送。
  • IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
  • 应用程序将deviceToken发送给PUSH服务端程序(Provider)。
  • 服务端程序向APNS服务发送消息。
  • APNS服务将消息发送给iPhone应用程序。

1. Provider是指某个iPhone软件的Push服务器,是我们将要开发的服务器。

2. APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。

上图可以分为三个阶段:

第一阶段:推送服务器(provider)把要发送的消息、目的iPhone的标识打包,发给APNS;

第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone;

第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。

三 推送之前的配置

在任何iOS应用开发里面,开发人员总是在团队里面扮演某一角色:团队经理,团队管理员,和团队成员。iPhone开发证书和配置文件由不同角色完成。通常团队经理是团队里面唯一可以创建Development SSL证书(沙箱环境)和Distribution SSL证书(产品环境)的人。而团队经理和团队管理员都可以创建Development和Distribution的配置文件。团队成员只能下载并安装证书和配置文件(!这里要区别好证书和配置文件的概念:证书,即Certificates,它主要是使用Access Key Chain来生成的一个签名密钥。而配置文件,即Provisioning
profiles,它主要是根据不同的App来生成的针对性的代码签名文件。二者区别是一般一个开发者账户只能有一个Certificates(而Development一个,Distribtuion一个),但是可以有多个Provisioning profiles文件,且这些Provisioning profiles通常创建的时候都使用同一个Certrificates)。以下部分详细介绍该过程。

注意:iOS Provisioning Portal给所有iOS开发者。

创建SSL证书和密钥

在iOS Dev Center的iOS Provisioning Portal里面,团队经理选中相应APNs的AppID。他需要完成以下步骤来创建SSL证书:

1.

点击窗口左边侧边栏的App IDs。

将会跳转到一个显示当前合法应用IDs的页面。每个应用的ID前面包含了它的Bundle ID,而在Bundle ID之前包含了苹果生成的十位字符串。团队管理员必须输入Bundle ID。对于每个证书,它必须匹配某一特定的Bundle ID,你不能使用“wildcart”的应用ID。即要使用推送通知的应用的Bundle ID不能使用“*”来创建。

2.

找到需要创建SSL证书的应用ID(和Development Provisioning Profile相关),并单击Configure按钮。

你必须确保该App ID下面的苹果推送通知服务栏下面显示“可用”状态才能为该应用配置APNs证书。

3.

在App ID配置页面,检查已经勾选了“Enable for Apple Push Notification service”复选框,并点击下面的“Configure”按钮。

单击该按钮将会启动APNs助理,它会通过一系列步骤来引导完成操作。

4.

第一步要求你启动Keychain Access应用并生成一个Certificate Signing Request(CSR)文件。

下面的介绍来自证书助理。当你完成生成CSR后,点击Keychain Access上面Continue来返回到APNs Assistant。

当你创建一个CSR时,Keychain Access生成一个私有和公有的加密密钥对。而私有的密钥会默认被放入你的Login keychain里面。而公有的密钥包含CSR会发送到配置服务器。当配置服务器把证书发回给你的时候,证书里面的其中一个条目将是公有密钥。

5.

在Submit Certificate Signing Request面板上,单击Choose File。导航到你之前创建的CSR文件的地方并选中它。

6.

单击Generate按钮。

在显示Generate Your Certificate面板的同时,Assistant会配置并生成你的客户端SSL证书。如果生成成功,它将会显示信息“Your APNs Certificate has been generated.”。单击Continue来进入下一步操作。

7.

在下一个面板,单击Download Now按钮来下载证书文件到本地文件夹。找到文件下载的地方并双击证书文件(该证书文件包含一个.cer的扩展名)来把它安装到你的keychain里面。当完成后,单击APNs Assistant上面的Done按钮。

双击加载启动Keychain Access。确保你已经把刚才的证书安装到了你用于开发的电脑的login keychain里面。在Keychain Access里面,确保你的证书使用的ID匹配你应用的Bundle ID。APNs的SSL证书应该安装到你的通知服务上面。

当你返回到iOS Dev Center Portal的Configure App ID页面完成这些步骤后,你的证书应该会变成绿色,并且显示“Enabled”。

为了给产品环境创建一个证书,重复上述步骤,但记住选中产品证书的应用ID。

团队经理或团队管理器接下来必须创建在服务器用于远程通知开发的配置证书(Development 或 Distribution)。配置文件就是一个集合,它囊括了和应用相关的开发者和开发团队验证过的设备并使用这些设备来测试应用程序。配置文件包含了证书、设备标示符、应用的Bundle ID、和所有权利,包括<aps-environment>。所有团队程序需要在运行并测试他们应用代码的设备上面安装该配置文件。

注意:关于创建配置文件的详细解析参考编程用户指南。

为了下载并安装配置文件,团队程序必须完成以下步骤:

1.

进入iOS Dev Center的Provisioning portal页面。

2.

创建一个新的配置文件,并包含你注册用于APNs的App ID。

3.

在你下载这个新的配置文件之前修改任何已存在的配置文件。

你必须修改配置文件的一些细微部分(比如切换选项)来生成一个新的配置文件。如果配置文件并没有“受损(dirtied)”,你不应该给以该原始配置文件任何推送的权利。

4.

找到文件的下载目录,把该配置文件(通常是一个.mobileprovision扩展文件)拖拉到Xcode或iTunes应用程序的图标上面。

可选的,你也可以把配置文件复制到~/Library/MobileDevice/Provisioning Profiles目录。如果当前目录不存在则生成一个新目录。

5.

验证该配置文件的权利是否正确。为此,使用文本编辑器打开.mobileprovision文件。该文件的内容是一个XML的文本。查看在aps-environment键的位置的字典值。对于一个开发模式的配置文件,该值应该是development;而对应发布模式的配置文件,该字符值应该是production。

6.

在Xcode的Organizer窗口,查看Provisioning Profiles部分,并确认证书已经安装到你的设备上面。

当你编译该工程的时候,二进制文件现在使用证书的私有密钥签名。

4.2.3

安装SSL证书和密钥到你的服务器上面

你必须安装SSL发布证书和你之前获取的私有加密密钥到需要运行提供者代码的服务器上,从该服务器连接到APNs的沙箱或产品环境。为此,需要完成以下步骤:

1.

打开Keychain Access实体并单击左边面板的My Certificates类别。

2.

找到你将要安装的证书,并打开相应内容。

你将会看到证书和私有密钥。

3.

选中证书和密钥,选中File > Export Items,并把它们导出个人信息交换文件(.p12)。

4.

如果服务器采用Buby或Perl语言来实现的话,那么它们更容易处理个人信息交换格式的文件。为了把证书转换为该格式,需要完成以下步骤:

a)

在Keychain Access里面,选中相应证书并选择File > Export Items。选择个人信息交换格式选项(.p12)。选择一个保存地址,并单击Save按钮。

b)

加载终端应用,并输入如下的命令:

openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes

5.

拷贝.pem证书文件到新的电脑并安装它到合适的地方。

这次准备工作已经完成了。

下面是客户端的步骤了

一个应用程序必须在设备(iOS设备或Mac电脑)上面注册了苹果推送通知服务才能接收来自程序提供者的远程通知。

注册过程包含以下三个步骤:

一个应用程序必须在设备(iOS设备或Mac电脑)上面注册了苹果推送通知服务才能接收来自程序提供者的远程通知。

注册过程包含以下三个步骤:

1.

程序调用registerForRemoteNotificationTypes:方法。

2.

委托实现application:didRegisterForRemoteNotificationsWithDeviceToken:方法来接收设备令牌。

3.

把设备令牌作为非对象(二进制值)传递给程序提供者。

1.

程序调用registerForRemoteNotificationTypes:方法。

2.

委托实现application:didRegisterForRemoteNotificationsWithDeviceToken:方法来接收设备令牌。

3.

把设备令牌作为非对象(二进制值)传递给程序提供者。

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

  • {
  • self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
  • // Override point for customization
    after application launch.
  • self.viewController = [[[ViewController alloc] init] autorelease];
  • self.window.rootViewController = self.viewController;
  • [self.window setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"background.png"]]];
  • [self.window makeKeyAndVisible];
  • /** 注册推送通知功能, */
  • [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
  • //判断程序是不是由推送服务完成的
  • if (launchOptions)
    {
  • NSDictionary* pushNotificationKey = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
  • if (pushNotificationKey)
    {
  • UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"推送通知"
  • message:@"这是通过推送窗口启动的程序,你可以在这里处理推送内容"
  • delegate:nil
  • cancelButtonTitle:@"知道了"
  • otherButtonTitles:nil, nil];
  • [alert show];
  • [alert release];
  • }
  • }
  • return YES;
  • }

-
(void)application:(UIApplication
*)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

  • NSString* token = [NSString stringWithFormat:@"%@",deviceToken];
  • NSLog(@"apns -> 生成的devToken:%@",
    token);
  • //把deviceToken发送到我们的推送服务器
  • DeviceSender* sender = [[[DeviceSender alloc]initWithDelegate:self ]autorelease];
  • [sender sendDeviceToPushServer:token ];
  • }

-
(void)application:(UIApplication
*)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {

  • NSLog(@"apns -> 注册推送功能时发生错误, 错误信息:\n
    %@", err);
  • }

-
(void)application:(UIApplication
*)application didReceiveRemoteNotification:(NSDictionary *)userInfo

  • {
  • NSLog(@"\napns -> didReceiveRemoteNotification,Receive
    Data:\n%@", userInfo);
  • //把icon上的标记数字设置为0,
  • application.applicationIconBadgeNumber = 0;
  • if ([[userInfo
    objectForKey:@"aps"] objectForKey:@"alert"]!=NULL)
    {
  • UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"**推送消息**"
  • message:[[userInfo objectForKey:@"aps"]
    objectForKey:@"alert"]
  • delegate:self
  • cancelButtonTitle:@"关闭"
  • otherButtonTitles:@"处理推送内容",nil];
  • alert.tag = alert_tag_push;
  • [alert show];
  • }
  • }
时间: 2024-10-11 02:08:32

IOS 推送详解的相关文章

spring websocket 和socketjs实现单聊群聊,广播的消息推送详解

spring websocket 和socketjs实现单聊群聊,广播的消息推送详解 WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端发送数据. 我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而

IOS----友盟推送详解

这两天好好的研究了下推送这功能,关于它我将分成两部分来讲,一.IOS手机端,二.Servlet服务端,今天先讲下IOS端 一.感受 下面讲下我对推送这个功能在IOS下的感受,这个算是我做了服务端的功能和手机端的功能后的一个体会吧, 这功能在IOS上是多少给我带来了点鸡肋的感觉,首先很多时候收到推送有延时现象,还有如果连续推送两条消息给一个Iphone手机,如果遇到延时这个问题,那么第一条推送就会被覆盖.(这里我用的是友盟的推送,这个推送暂时感觉还不错,大多数推送能及时收到,至少我暂时测试是如此,

iOS最新极光推送详解(2016转)

1.配置开发证书(得有开发者账号,个人,企业的都可以) 开发环境测试 在对 JPush iOS 开发环境进行测试前,请确保 3 个统一: App 是开发环境打包(开发证书 Development) 上传了开发证书并验证通过 Portal 上的应用设置为开发环境 发布环境测试 在对 JPush iOS 生产环境进行测试前,请确保 3 个统一: App 是 ad-hoc 打包或者App Store 版本(发布证书 Production) 上传了发布证书并验证通过 Portal 上的应用设置为生产环境

iOS本地推送与远程推送详解

一.简介 分为本地推送和远程推送2种.可以在应用没有打开甚至手机锁屏情况下给用户以提示.它们都需要注册,注册后系统会弹出提示框(如下图)提示用户是否同意,如果同意则正常使用:如果用户不同意则下次打开程序也不会弹出该提示框,需要用户到设置里面设置.一共有三种提示类型: UIUserNotificationTypeBadge:应用图标右上角的信息提示 UIUserNotificationTypeSound:播放提示音 UIUserNotificationTypeAlert:提示框 二.本地推送 1

转:iOS中socket详解

一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要解决数据如何在网络

iOS 的UINavigationController详解与使用添加UIBarButtonItem

转发自:http://blog.csdn.net/totogo2010/article/details/7681879 分类: iOS开发入门2012-06-21 11:10 53077人阅读 评论(29) 收藏 举报 uinavigationcontrolleriosapplicationactioninterfacebutton 1.UINavigationController导航控制器如何使用 UINavigationController可以翻译为导航控制器,在iOS里经常用到. 我们看看

iOS 推送证书

push 服务器证书 钥匙串:登入-->证书,选项里面导出证书命名为cert.p12,跟密钥命名为key.p12 需要将上面的2个.p12文件转成.pem格式: openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12 openssl pkcs12 -nocerts -out key.pem -in key.p12 如果需要对 key不进行加密: openssl rsa -in key.pem -out key.unencrypted.

申请iOS推送证书.p12

iOS APP需要推送通知,要用到iOS推送证书,分为测试调试用的iOS推送证书(开发环境)和上架到App Store的ios 推送证书(生产环境)! 一.iOS发布推送证书(开发环境)测试APP iOS证书申请这里用到一个工具Appuploader,可以在win系统中辅助快速申请iOS证书,如果没有Mac也无所谓. 可以很快速的创建iOS推送证书 先安装好Appuploader安装教程 1.打开Appuploader,选择Certification. 2.点击+ADD\选择Push Notif

iOS开发者证书-详解

iOS开发者证书-详解/生成/使用 本文假设你已经有一些基本的Xcode开发经验, 并注册了iOS开发者账号. 相关基础 加密算法 现代密码学中, 主要有两种加密算法: 对称密钥加密 和 公开密钥加密. 对称密钥加密 对称密钥加密(Symmetric-key algorithm)又称为对称加密, 私钥加密, 共享密钥加密. 这类算法在加密和解密时使用相同的密钥. 例如: 最常见的应用场景 - 系统登陆. 要成功登陆系统, 你必须输入正确的密码, 这密码是唯一的, 是与创建时一样的. 同样 的,