第一种基于推送
1、推送:用户不在线可以收到消息,eg:QQ的推送
2、缺点:限定字数 --- 不超过 256 个字符(苹果服务器规定的),推送可以是语音、图片,不过字节数有限制;
3、iOS --- Jpush(极光推送)特点:块
和 百度推送的第三方服务 优点:基于LBS进行推送 --- 发送消息给百度服务器,服务器推送给苹果服务器《可以基于某个地区,社区》
4:缺点:iOS 和 安卓之间的互通有问题 --- 安卓的机制和苹果的推送机制不同。(不在线的情况下,苹果推送安卓,安卓客户端推送给苹果会出问题)
第二种:基于XMPP 协议的方案
1、xmpp协议,在socket基础上封装的
2、特点:简单方便; 将xmpp的SDK嵌套进来就行,是基于 xml 文件格式的传输;
3、需要构建xmpp 服务器(基于开源框架的构建:openFile)
4、放弃 基于 xmpp协议方案的原因 : 语音 和 视频的实时传输,实现难度大。(长链接);
eg:QQ , 需要修改服务器 openFile框架
第三种方案 : 基于socket
1、选择一种socket 框架,eg:GCDSocket 框架。
2、服务端也需要选择 socket矿建
3、特点:安卓和苹果的互通没有任何问题。可以实时的语音和视频通讯;
4、IM 集成方案就是很多就是很多公司基于 socket封装好的解决方案,需要花钱;提供集成解决方案;
5、缺点:调适难度大(未自己进行封装);基于GCDSocket框架写的IM即时通讯方案
1、不涉及语音,图片少,就可以基于推送;
2、如果用户不在线要接收消息,基于XMPP 协议的方案就不合适
3、组合方案:文字信息实现推送(不用判断当前用户是否在线);基于Socket的封装需要判断当前用户是否在线,如果用户应用在后台,就要进行推送,否则有可能收不到消息;
推送证书的申请
1、分为 测试和上线证书 ,两个 tokenDevice 不同, 对应的苹果服务器也不相同
2、测试成功之后,需要切换发布证书,才能上线
3、Certificates --- Development
4、AppId 必须是唯一的;
5、AppIDs ---- App ID Description :Name (pushDevelopmentTest) -- Bundle ID(公司域名反写 + 应用名《选择固定的AppID》) ---- Push Notifivation 选对勾:pushNotifications Enabled
6、 Profiles 文件t添加 --- Selecte App ID -- Selected Cetificates -- Device -- Profile Name:profile.test -- downLoad
7、服务器需要的文件 为 Certificates ---Development -- Apple push Notification Service SSL(sandBox) --- AppID 绑定 --- 生成p12证书请求 CSR file -- cetificate is Ready <服务器用测试或者发布的推送证书>
为什么要用推送?
1、iOS操作系统限制普通应用程序不能在长期在后台运行;《可以再后台运行的程序有三种 : voip, 获取经纬度信息类, 音频播放的app》;可以申请多运行10分钟以内
2、有IM的应用一旦退出或者切换到后台,没有办法接受到实时的消息。
3、操作系统帮我实现的推送。
5、推送的样式
6、退推送的步骤 --- Provider ---> APNs ---> Device --- >Client App 接收; 后台通知中心可以接受到,前台直接可以接受到; 消息的发送者(消息接受者《具体设备》,发送的设备的具体应用《那个App》) --- 》苹果服务器 --- 》用户设备 --- 》 App
7、发送的消息提供给苹果服务器 需要知道 发送给那个设备,那个应用程序
8、通过什么来区分应用程序 ---- AppID 来区分,唯一性
9、UUID 设备的唯一标识,可以锁定哪一个设备;
10、设备标识号:TokenDevice 传进Provider,苹果服务器,操作系统判断应用和设备是否存在;
11、第一步:Device ---- > APNs(SSL connect),询问设备是否允许推送
第二部 :APNs --- > Decece (deviceToken) 苹果服务器给设备唯一标识
第三部 : Device ---- >ClientApp (deciceToken) --- > deviceToken -- >Provider 再走前面的步骤
12: 推送证书的制作; 应用程序要获取当前设备的 tokenDevice (相当于ID); 把获取到的TokenDevice 提交给 message Server 服务器 - ; 应用可以接受消息
Demo
应用程序名跟 证书的后缀一样
1、应用 Bundle Identifier 与AppID 的BundleID一样
2、设置推送的样式,在Appdelegate里应用加载的回调方法里\
// 设置推送的样式
[[UIApplication sharedApplication ] registerForRemoteNotificationTypes: ///8.0 Desprecated(UIRemoteNotifivationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
(注册证书已有,会发送通知请求)
************8.0以上系统使用 registerUserNotificationSettings:
3、重写函数,用于接受DeviceToken
-(void)application:(UIApplication *)appdidRgisterForRemoteNotificationWithDeviceToken:(NSData *)deciceToken {
NSString *strToken = [NSString stringWithFormat:@"DeviceToken=%@",deviceToken];
[self alertNotice:@"" wihMSG:strToken cancleButtonTitle:"ok" otherButtonTitle"@""];
}
4、对照Bundle Identifier
5\pushTestPlist 文件也要更改 Surppoting Files --- pushTest.Info.plist -- Bundle Identifier
6、target 和 PROGECT--- Build Setting --- Code Signing ---Code Signing Identity -- 测试证书
7、Provisioning Profile --- 添加生成的描述文件
8、客户端允许推送之后 获得 deciceToken
9、.cer 推送证书 给服务器 / 给一个工程(服务端程序),相当于给服务器 deviceToken 和 cetificate
10\、服务器端程序获得 deviceToken 和 cetificate 之后运行,服务器就可以进行按时推送了