用户工具

消息推送详解

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

消息推送详解 [2016/04/11 08:42]
liuxia 创建
消息推送详解 [2017/08/23 08:44]
行 1: 行 1:
-====== 消息推送详解 ====== 
-本文主要介绍了使用云之讯 IM 时,如何使用远程推送、何时会收到远程推送、如何获取远程推送的内容。\\ 
-=====一、何时会收到远程推送 ===== 
-==== 1、iOS APP应用状态 ==== 
-在讲解云之讯IM离线推送的机制之前,我们先来了解iOS APP的生命周期和状态。 iOS应用程序的生命周期,应用程序各个状态的变换,这些对于开发者来说都是很重要的。 iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的。在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验。\\ 
-iOS应用的各个状态如下:​\\ 
- 
-  *1、**Not running ​ 未运行** ​ 程序没启动\\ 
-  *2、**Inactive ​    ​未激活** ​ 程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态\\ 
-  *3、**Active ​      ​激活** ​   程序在前台运行而且接收到了事件。这也是前台的一个正常的模式\\ 
-  *4、**Backgroud ​   后台** ​   程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态\\ 
-  *5、**Suspended ​   挂起** ​   程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存\\ 
- 
- 
-下图是程序状态的变化图:​\\ 
-{{  :​iosapp状态.png?​nolink& ​ }}\\ 
-<code java> 
-当应用程序处于挂起和未运行状态时,​程序和云之讯服务器的交互是断开的。 
-在这段时间内,如果您已经设置好了离线推送,云之讯服务器将使用离线推送功能将消息推送到您的用户设备上。 
-如果您还未设置离线推送,下面的教程将手把手教您实现离线推送功能。 
-</​code>​ 
- 
-====2、云之讯SDK运行状态 ==== 
-云之讯SDK 根据 iOS App 运行的运行状态特性,主要有以下三种运行状态:\\ 
-   ​*1、**前台状态** 如字面意思,App 前台可见时 SDK 处于前台状态。此时 App 使用云之讯的 socket 来收发消息.\\ 
-   ​*2、**后台活动状态** 当 App 进入后台三分钟之内,SDK 处于后台活跃状态。此时 App 使用云之讯的 socket 接收消息。在后台活动状态下收到消息,​ SDK 不会弹出本地通知,如果您需要可以自己弹出本地通知提示。\\ 
-   *3、 **后台挂起状态** 当 App 进入后台三分钟之后或被杀进程或被冻结(取决于系统的内存情况),SDK 将处于后台挂起状态。此时云之讯的 socket 会断开,云之讯后台服务会通过 APNs 将消息以远程推送的形式下发到客户端。 此状态下如果有人给该用户发送消息,云之讯的服务器会根据 DeviceToken 和推送证书将消息发送到苹果推送服务器,苹果服务器会将该消息推送到客户端。\\ 
-<code java> 
-由于本地通知和远程推送表现形式类似,不易区分,您在调试时可以通过杀进程来测试远程推送,App 刚进入后台测试本地通知。 
-当 SDK 处于后台挂起状态或未启动状态时,App 会收到远程推送。 ​ 
-</​code>​ 
-====3、离线推送流程 ==== 
-当 SDK 处于后台挂起状态或未启动状态时,并且已经上传了<​html><​font color = red> DeviceToken</​font></​html>​ ,这时候如果有人给该用户发送消息,融云的服务器会根据<​html><​font color = red> DeviceToken</​font></​html>​ 和<​html><​font color = red>​推送证书</​font></​html>​将消息发送到<​html><​font color = red>​苹果推送服务器(APNs)</​font></​html>​。 苹果推送服务器会根据 <​html><​font color = red>​DeviceToken </​font></​html>​查找相应的设备,并根据推送证书中的 <​html><​font color = red>​BundleID</​font></​html>​ 和 App 打包时使用的 <​html><​font color = red>​Provisioning Profile</​font></​html>​ 查找 App,从而确定唯一的设备上的唯一 App,并进行远程推送。\\ 
-====4、开发环境和生产环境 ==== 
-苹果推送服务器区分<​html><​font color = red>​开发环境(Development)</​font></​html>​和<​html><​font color = red>​生产环境(Production)</​font></​html>​,两个环境的服务器不同,使用的 <​html><​font color = red>P12 证书</​font></​html>​不同,完全隔离。 
- 
-有几点需要注意的。 
-    DeviceToken 是唯一标识客户端的凭证,所以必须上传云之讯服务器才能使用远程推送。 
-    模拟器收不到远程推送。 
-    越狱的设备 APNs 服务不能保证,所以不一定能收到远程推送。 
-    APNs 使用 BundleID 区分 App,使用通配符 BundleID 的 App 将无法使用远程推送。 
- 
- 
- 
-=====二、如何设置远程推送 ===== 
-====1、为您的App开启远程推送服务 ==== 
-您需要为您的APP制作一个包含Push Notification服务的APP ID。\\ 
-登陆[[https://​developer.apple.com/​|Apple Developer]] ,​进入Identifiers,​选择App IDs。 
- 
-{{  :​appid0.png?​nolink& ​ }} 
-{{  :​appid2.png?​nolink& ​ }} 
- 
-您可以重新创建一个APP ID,​也可以在之前的APP ID的基础上增加push服务。需要注意的是,您 App 的 BundleID 不能使用通配符,否则将无法使用远程推送服务。 
-{{  :​appid3.png?​nolink& ​ }} 
- 
-打开离线推送服务 
-{{  :​appid4.png?​nolink& ​ }} 
- 
-{{  :​appid5.png?​nolink& ​ }} 
- 
- 
-====2、制作推送证书 ==== 
-选中您的AppID,​选中Edit 
-{{  :​appid6.png?​nolink& ​ }} 
- 
-您可以看见,在Push Notification下方有两个SSL Certificate,​分别是开发环境和生成环境的远程推送证书 
-{{  :​appid7.png?​nolink& ​ }} 
- 
-点击 Create Certificate ,这时候会提示您需要一个 Certificate Signing Request(CSR)。 
-{{  :​appid8.png?​nolink& ​ }} 
- 
-根据提示,在您的Mac上打开钥匙串访问,选择【证书助理】【从证书颁发机构请求证书】 
-{{  :​appid9.png?​nolink& ​ }} 
- 
-输入您的邮箱、姓名或者公司名,选择保存到磁盘,​点击继续,就会生成*.certSigningRequest的文件 
-{{  :​appid10.png?​nolink& ​ }} 
-{{  :​appid11.png?​nolink& ​ }} 
- 
-然后返回 Apple Developer 网站,点击 Continue,上传生成的 *.certSigningRequest 文件,点击 Generate ,即可生成推送证书。 
-{{  :​appid12.png?​nolink& ​ }} 
-{{  :​appid13.png?​nolink& ​ }} 
- 
-按照同样的步骤,生成生产环境的推送证书 
-{{  :​appid14.png?​nolink& ​ }} 
- 
-此时,您可以在 Push Notification 下方看见目前每个环境对应的推送证书。 
-{{  :​appid15.png?​nolink& ​ }} 
- 
-将上面的 SSL Certificate 都下载到 Mac 本地,双击打开,系统会将其导入钥匙串中。 打开钥匙串应用,选中对应的证书,右键选择导出。保存 P12 文件时,可以为其设置密码,也可以不设置密码。 
-{{  :​appid17.png?​nolink& ​ }} 
- 
-{{  :​appid18.png?​nolink& ​ }} 
- 
-{{  :​appid19.png?​nolink& ​ }} 
- 
-{{  :​appid20.png?​nolink& ​ }} 
- 
-{{  :​appid21.png?​nolink& ​ }} 
- 
-====3、上传证书到云之讯平台 ==== 
-进入云之讯开发者控制台,创建应用。如果您不了解这一步,请前往[[http://​docs.ucpaas.com/​doku.php?​id=%E6%96%B0%E6%89%8B%E6%8C%87%E5%BC%95|云之讯开发者账户指南]]。\\ 
-创建完成后,进入【应用管理】->​【应用列表】->​【对应的应用】->​【IM iOS推送证书设置】,​上传刚才到处的推送证书。 
-{{  :​appid22.png?​nolink& ​ }} 
- 
-您上传的 P12 证书必须与环境相匹配。开发环境必须上传 Development 的 Push 证书,生产环境必须上传 Production 的 Push 证书。 
-{{  :​appid23.png?​nolink& ​ }} 
- 
- 
-====4、生成 provisioning profile 文件 ==== 
-Xcode 编译打包的时候,需要使用使用 provisioning profile 来指明 AppID 、证书和设备。\\ 
-而远程推送与证书、设备相关,所以必须正确设置相应环境的 provisioning profile,否则将无法收到远程推送。\\ 
-在 Apple Developer 中,选择 Provisioning Profile,选择生成开发环境或者生产环境的 provisioning profile。\\ 
-{{  :​appid24.png?​nolink& ​ }} 
- 
-选择对应的App ID 
-{{  :​appid25.png?​nolink& ​ }} 
- 
-选择允许使用的开发者证书 
-{{  :​appid26.png?​nolink& ​ }} 
- 
-选择允许使用的设备 
-{{  :​appid27.png?​nolink& ​ }} 
- 
-输入名称就可以生成 
-{{  :​appid28.png?​nolink& ​ }} 
- 
-{{  :​appid29.png?​nolink& ​ }} 
- 
-如果您的 App 是 App-Store 类型的,但是还没有在 App Store 上架,在上架之前如果您想使用生产环境测试远程推送,您需要生成一个 Ad-Hoc 的 Provisioning Profile ,并在 Xcode 中使用其进行打包,导出为 Ad Hoc Deployment。 
-{{  :​appid30.png?​nolink& ​ }} 
- 
-====5、在代码中请求远程推送权限 ==== 
-向用户请求允许推送 
-<code java> 
-/** 
- ​* ​ 注册推送 
- */ 
-UIApplication *application = [UIApplication sharedApplication];​ 
-if ([application respondsToSelector:​@selector(registerUserNotificationSettings:​)]) { 
-    //​注册推送,​ 用于iOS8以及iOS8之后的系统 
-    UIUserNotificationSettings *settings = [UIUserNotificationSettings 
-                                            settingsForTypes:​(UIUserNotificationTypeBadge | 
-                                                              UIUserNotificationTypeSound | 
-                                                              UIUserNotificationTypeAlert) 
-                                            categories:​nil];​ 
-    [application registerUserNotificationSettings:​settings];​ 
-} else { 
-    //​注册推送,用于iOS8之前的系统 
-    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | 
-    UIRemoteNotificationTypeAlert | 
-    UIRemoteNotificationTypeSound;​ 
-    [application registerForRemoteNotificationTypes:​myTypes];​ 
-} 
-    ​ 
-/** 
- ​* ​ 注册用户通知设置 
- */ 
-- (void)application:​(UIApplication *)application didRegisterUserNotificationSettings:​(UIUserNotificationSettings *)notificationSettings{ 
-    [application registerForRemoteNotifications];​ 
-} 
-</​code>​ 
- 
-您需要通过TCPSDK中UCSTcpClient的单例,调用<​html><​font color = red>​-setPushEnvironment:​deviceToken:</​font></​html>​方法设置推送环境和设备号DeviceToken。 
-<code java> 
-/** 
- ​* ​ 设置离线推送的环境和设备号DeviceToke。如果需要使用推送离线推送,则必须调用此方法。 
- ​* ​ @param environment 离线推送的环境.具体见UCSPushEnvironment,不设置的话,​默认是开发环境。 
- ​* ​ @param deviceToken 从系统获取到的设备号DeviceToken。 
- */ 
-- (void)setPushEnvironment:​(UCSPushEnvironment)environment 
-               ​deviceToken:​(NSData *)deviceToken;​ 
-</​code>​ 
-<code java> 
-- (void)application:​(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:​(NSData *)deviceToken{ 
-    // 设置推送环境和token 
-    [[UCSTcpClient sharedTcpClientManager] setPushEnvironment:​UCSPushEnvironment_Production deviceToken:​deviceToken];​ 
-} 
-</​code>​ 
-<code java> 
-DeviceToken 是系统提供的,从苹果服务器获取的,用于 APNs 远程推送必须使用的设备唯一值。 
-您需要将-didRegisterForRemoteNotificationsWithDeviceToken:​ 获取到的 DeviceToken,​传给 SDK。 
-SDK 会将此DeviceToken保存,在 Connect 时会自动上传到云之讯服务器,并与用户ID绑定,用于远程推送。 
-</​code>​ 
-==== 6、用户允许推送 ==== 
-以上步骤都已经实现后,还需要使用您App的用户允许通知,才能收到远程推送。您可以在设备的设置应用中,查看当前App是否允许通知。 
  

页面工具