原文出自【听云技术博客】:http://blog.tingyun.com/web/article/detail/571
推送通知,是现在的应用必不可少的功能。那么在 iOS 中,我们是如何实现远程推送的呢?iOS 的远程推送原理又是什么呢?在做 iOS 远程推送时,我们会遇到各种各样的问题。那么首先让我们准备一些做推送需要的东西。我们需要一个付费的苹果开发者账号(免费的不可以做远程推送),有了开发者账号,我们可以去苹果开发者网站,配置自己所需要的推送的相关证书。然后下载证书,供我们后面使用,详细的证书配置过程,我们下面再说。
首先我们要说说iOS推送通知的基本原理:
苹果的推送服务通知是由自己专门的推送服务器APNs (Apple Push Notification service)来完成的,其过程是 APNs 接收到我们自己的应用服务器发出的被推送的消息,将这条消息推送到指定的 iOS 的设备上,然后再由 iOS设备通知到我们的应用程序,我们将会以通知或者声音的形式收到推送回来的消息。 iOS 远程推送的前提是,装有我们应用程序的 iOS 设备,需要向 APNs 服务器注册,注册成功后,APNs 服务器将会给我们返回一个 devicetoken,我们获取到这个 token 后会将这个 token 发送给我们自己的应用服务器。当我们需要推送消息时,我们的应用服务器将消息按照指定的格式进行打包,然后结合 iOS 设备的 devicetoken 一起发给 APNs 服务器。我们的应用会和 APNs 服务器维持一个基于 TCP 的长连接,APNs 服务器将新消息推送到iOS 设备上,然后在设备屏幕上显示出推送的消息。
设备注册APNs的流程图:
上图完成了如下步骤:
1.Device(设备)连接APNs服务器并携带设备序列号(UUID)
2.连接成功,APNs经过打包和处理产生devicetoken并返回给注册的Device(设备)
3.Device(设备)携带获取的devicetoken发送到我们自己的应用服务器
4.完成需要被推送的Device(设备)在APNs服务器和我们自己的应用服务器的注册
推送过程图:
推送的过程经过如下步骤:
1.首先,我们的设备安装了具有推送功能的应用(应用程序要用代码注册消息推动),我们的 iOS设备在有网络的情况下会连接APNs推送服务器,连接过程中,APNS 服务器会验证devicetoken,连接成功后维持一个基于TCP 的长连接;
2.Provider(我们自己的应用服务器)收到需要被推送的消息并结合被推送的 iOS设备的devicetoken一起打包发送给APNS服务器;
3.APNS服务器将推送信息推送给指定devicetoken的iOS设备;
4.iOS设备收到推送消息后通知我们的应用程序并显示和提示用户(声音、弹出框)
比较直观的流程图:
信息包结构图:
上图显示的这个消息体就是我们的应用服务器(Provider)发送给APNs服务器的消息结构,APNs验证这个结构正确并提取其中的信息后,再将消息推送到指定的iOS设备。这个结构体包括五个部分,第一个部分是命令标示符,第二个部分是我们的devicetoken的长度,第三部分是我们的devicetoken字符串,第四部分是推送消 息体(Payload)的长度,最后一部分也就是真正的消息内容了,里面包含了推送消息的基本信息,比如消息内容,应用Icon右上角显示多少数字以及推送消息到达时所播放的声音等
Payload(消息体)的结构:
{ “aps”:{ “alert”:“听云给您发送了新消息”, “badge”:1, “sound”:“default” }, }
这其实就是个JSON结构体,alert标签的内容就是会显示在用户手机上的推送信息,badge显示的数量(注意是整型)是会在应用Icon右上角显示的数量,提示有多少条未读消息等,sound就是当推送信息送达是手机播放的声音,传defalut就标明使用系统默认声音。
下面就是我们推送通知所需要的证书的推送过程:
1.首先我们要新建一个Certificate Signing Request(也就是CSR)的请求文件
在应用程序里的使用工具中找到钥匙串访问,选择从证书颁发机构请求证书
注意:邮箱地址,填自己的开发者账号,常用名,随便填一个记住就行。然后选择存储到磁盘。继续就行。
保存位置在 tingyun(指定自己的文件夹,这里我选择的是我的文件夹),点击存储
然后点击完成后我们会在 tingyun 里看到一个CertificateSigningRequest.certSigningRequest的请求文件,也就是我们说的CSR文件。在我们生成CSR文件的同时,会在钥匙串访问中生成一对秘钥,名称为刚才我们填写的常用名
2.配置AppID
到苹果开发者网站https://developer.apple.com
点击Account
选择 Certificates,identifiers&Profiles
选择 Identifiers ->App IDs 点击上方的+号创建一个 App ID.
Name: 填写 App 的名字就行
App ID Suffix 选择不用通配符的及 Explicit App ID
Bundle ID:填写自己应用的 Bundle ID 一定要和自己应用的一致.
在下面的 App Services 中选择自己需要的服务
我们需要推送服务,所以在Push Notifications上打勾
然后点击continue
3.创建证书
证书需要创建两种,一种是开发的、一种是发布的,开发的是做测试用的。
选择Development 点击右上角的+号,创建证书,我们首先创建开发证书
选择Apple Push Notification service SSL (Sandbox),创建推送服务证书点击下一步
这儿的 App ID 选择我们刚才创建的 App ID
然后点击下一步,下一步
这儿点击 Choose File,选择我们刚才创建的 CSR 文件.
然后点击生成(Generate)
最后点击下载,下载证书。将下载的证书,放到指定位置。
发布证书的创建和开发证书一样,选择Production->Apple Push Notification service SSL (Production)后面和开发证书一样
4.添加 Devices:
首先选中你要添加哪种设备,然后在左上角点击“+”号。
Name 填写一个设备名字。
UDID 填写自己需要加入测试的设备的 UDID。
然后点击下一步
然后点击 Register 即可
点击Done。
5.查找设备的 UDID:
用自己的 iOS 设备连接到电脑上,打开 iTunes。
在设备摘要处可以看见一个序列号,点击序列号就会变成 UDID。
6.生成配置文件
配置文件也有两种,一种是开发的,一种是发布的,开发的使我们做测试需要的,发布的是我们在 Appstore 上发布时需要的,我们都需要生成。
我们先生成开发配置文件,选择Provisioning Profiles->Development点击右上角的+号。
选择iOS App Development 点击下一步
这儿的 App ID 仍然选择我们刚才创建的 App ID
这儿选择我们开发者的证书,如果不知道是哪个选择全部即可
这儿选择我们的测试设备,如果没有则在前面的Devices里面添加即可
随便取个名字即可,然后下载下来
发布配置文件和开发配置文件一样创建,选择Distribution->Ad Hoc即可,后面与发布配置文件一样。
证书配置完成,打开我们创建的应用项目
打开AppDelegate.m 文件,在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中添加下面代码,注册消息推送
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. /** 消息推送注册 */ if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) { UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil]; [application registerUserNotificationSettings:settings]; [application registerForRemoteNotifications]; }else { [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; } return YES; } 下面方法是返回 ANPs 苹果推送服务器生成的唯一标识 /** 接收服务器传回的设备唯一标识 token */ -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{ // 第一次运行获取到DeviceToken时间会比较长! // 将deviceToken转换成字符串,以便后续使用 NSString *token = [deviceToken description]; NSLog(@"description %@", token); } 下面方法是当有消息推送回来时,接收推送消息 /** 设备接收到来自苹果推送服务器的消息时触发的,用来显示推送消息 */ -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ NSLog(@"userInfo == %@",userInfo); } 上面方法是当注册推送服务失败时,接收错误信息 /** 注册推送服务失败 */ -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{ NSLog(@"注册失败 %@",error); }
服务器端(Java服务器)
服务器端我们需要,一个后缀为. p12的证书,以及需要的 jar 包
服务器端的证书生成方式:
打开我们前面下载的证书,在钥匙串中找到它
点击鼠标右键选择导出
导出后缀为.p12的文件保存到自己的电脑上,需要输入一个密码,在 Java 服务器端要用到
Java服务器端需要的 Jar 包
Java 服务器端代码:
import javapns.back.PushNotificationManager; import javapns.back.SSLConnectionHelper; import javapns.data.Device; import javapns.data.PayLoad; public class pushService { public static void main(String[] args) { try { String deviceToken = "eab6df47eb4f81e0aaa93bb208cffd7dc3884fd346ea0743fcf93288018cfcb6"; //被推送的iphone应用程序标示符 PayLoad payLoad = new PayLoad(); payLoad.addAlert("测试我的push消息"); payLoad.addBadge(1); payLoad.addSound("default"); PushNotificationManager pushManager = PushNotificationManager.getInstance(); pushManager.addDevice("iphone", deviceToken); //测试推送服务器地址:gateway.sandbox.push.apple.com /2195 //产品推送服务器地址:gateway.push.apple.com / 2195 String host="gateway.sandbox.push.apple.com"; //测试用的苹果推送服务器 int port = 2195; String certificatePath = "/Users/hsw/Desktop/PushTest/PushTest.p12"; //刚才在mac系统下导出的证书 String certificatePassword= "123456"; pushManager.initializeConnection(host, port, certificatePath,certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12); //Send Push Device client = pushManager.getDevice("iphone"); pushManager.sendNotification(client, payLoad); //推送消息 pushManager.stopConnection(); pushManager.removeDevice("iphone"); } catch (Exception e) { e.printStackTrace(); System.out.println("push faild!"); return; } System.out.println("push succeed!"); } }
相关推荐
《iOS远程推送开发手册》是一本详尽指导iOS开发者实现远程推送功能的资源集合,旨在帮助开发者们在项目中成功集成这一关键特性。远程推送(Remote Notification)是iOS设备与服务器间通信的重要手段,用于在应用程序...
总之,iOS远程推送发送器是一个强大的辅助工具,它可以帮助开发者快速测试和优化推送通知功能,确保在实际环境中能够正常工作。理解APNs的工作原理以及如何配置和使用这样的工具,对于提高用户体验和保持应用活跃度...
1 IOS 2 PUSH 3 第三方推送 4 推送原理
iOS远程推送技术是苹果公司为开发者提供的一种服务,允许...通过理解以上内容,开发者可以掌握iOS远程推送的基本原理和实现步骤。实践中,结合提供的Demo,可以快速实现远程推送功能,使应用能够实时地与用户进行互动。
本教程将深入探讨iOS客户端远程推送的相关知识点,包括其工作原理、设置流程、实现机制以及测试方法。 一、远程推送的工作原理 远程推送是通过Apple Push Notification Service (APNs) 实现的。当应用注册了远程推...
下面将详细介绍iOS消息推送的原理、Java后端实现以及压缩包中可能包含的内容。 一、iOS消息推送服务(APNs) Apple Push Notification service (APNs) 是苹果公司提供的一个服务,它允许开发者向用户的iOS设备发送...
通过这个资源,你可以学习到如何在PHP后端实现iOS远程推送,这对于开发需要实时通信的应用至关重要。此外,它还能帮助你了解APNs的工作原理和PHP与之交互的方式,对于提升iOS开发技能非常有帮助。记住,安全地存储和...
在本文中,我们将深入探讨如何在C#环境下实现iOS的消息推送功能,主要基于提供的资源"PushSharp-master"。首先,我们需要了解iOS的消息推送服务(Apple Push Notification service, 简称APNs)以及C#中如何与之交互...
首先,iOS远程推送依赖于苹果的Push Notification Service (APNs)。APNs是一个提供设备到应用的双向通信服务,它可以将消息推送到用户的设备上,即使应用没有运行也能收到通知。要启用远程推送,开发者需要在Apple ...
PushMeBaby是一款针对iOS平台的推送通知测试工具,它专为开发者设计,旨在简化和加速iOS应用中的远程推送通知功能的测试过程。在iOS应用程序开发中,推送通知是一项至关重要的功能,它允许应用在后台向用户的设备...
总之,iOS远程推送通知通过APNs服务实现了应用与用户的实时互动,无论应用是否在前台运行,都能及时传递信息,提升了用户体验。理解并掌握这一技术对于iOS开发者来说至关重要。通过不断学习和实践,开发者可以创建出...
### iOS本地和远程推送通知编程指南 #### 一、概览与基础知识 ##### 1.1 本地推送通知概述 本地推送通知(Local Notification)是iOS应用开发中的一个关键功能,它允许应用程序在没有服务器介入的情况下,向用户...
本篇文章将深入探讨如何在Java服务端实现与APNs的集成,为iOS应用提供推送功能。 首先,我们需要理解APNs的工作原理。APNs是苹果提供的一个基于TCP/IP协议的推送服务,它允许服务器将消息推送到已注册的iOS设备。...
下面我们将详细探讨iOS推送服务器的工作原理、实现流程及注意事项。 一、APNs工作原理 1. 注册设备:当用户安装并首次启动应用程序时,iOS系统会与APNs交互,获取一个唯一的设备令牌(Device Token)。这个令牌将...
友盟推送配置教程是针对iOS开发者的一份详细指南,旨在帮助开发者学会如何在iOS平台上实现友盟推送服务的配置。友盟推送(UMENG Push)是友盟网提供的一个免费推送服务,它可以为移动应用提供稳定的推送通知功能。 ...
在iOS系统中,远程推送通知是通过苹果的APNs(Apple Push Notification service)服务实现的。当应用服务器想要发送一个通知时,它会将消息发送到APNs,APNs再将消息推送到目标设备。这个过程中,应用需要拥有一个由...
在iOS设备上,为了实现实时的消息推送服务,Apple提供了名为Apple Push Notification Service (APNS) 的服务。本文将深入探讨如何使用ASP.NET技术来构建iOS推送服务器端代码。 首先,理解APNS的工作原理至关重要。...