iOS推送(利用极光推送)
本文主要是基于极光推送的SDK封装的一个快速集成极光推送的类的封装(不喜勿喷)
(1)首先说一下推送的一些原理:
Push的原理:
Push 的工作机制可以简单的概括为下图
图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider。
APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。
上图可以分为三个阶段。
第一阶段:.net应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。

从上图我们可以看到。
1、首先是应用程序注册消息推送。
2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
3、应用程序将deviceToken发送给PUSH服务端程序。
4、 服务端程序向APNS服务发送消息。
5、APNS服务将消息发送给iPhone应用程序。
无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的。下面我介绍一下几种用到的证书。
(2)关于基于极光推送SDK类的封装
2.1 创建一个继承于NSObject的类 ,暂时命名为 MyJPush吧
在.h文件中先添加几个方法:
/** 注册JPush */
+(void)registerJPush:(NSDictionary *)launchOptions;
/** 添加监听者 */
+(void)addJPushListener:(id<CoreJPushProtocol>)listener;
/** 移除监听者 */
+(void)removeJPushListener:(id<CoreJPushProtocol>)listener;
/** 注册alias、tags */
+(void)setTags:(NSSet *)tags alias:(NSString *)alias resBlock:(void(^)(BOOL res, NSSet *tags,NSString *alias))resBlock;
.m文件的实现:
需要宏定义一些变量:
#define JPushAppKey @"***********" //极光推送的APPKey
#define JPushChannel @"AppStore" //指明应用程序包的下载渠道
#define JPushIsProduction NO //是否是生产环境
/** 注册JPush */
+(void)registerJPush:(NSDictionary *)launchOptions{
// Required
//可以添加自定义categories
[JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
UIUserNotificationTypeSound |
UIUserNotificationTypeAlert)
categories:nil];
// Required
//如需兼容旧版本的方式,请依旧使用[JPUSHService setupWithOption:launchOptions]方式初始化和同时使用pushConfig.plist文件声明appKey等配 置内容。
[JPUSHService setupWithOption:launchOptions appKey:JPushAppKey channel:JPushChannel apsForProduction:JPushIsProduction];
}
/** 添加监听者 */
+(void)addJPushListener:(id<CoreJPushProtocol>)listener{
MyJPush *jpush = [MyJPush sharedCoreJPush];
if([jpush.listenerM containsObject:listener]) return;
[jpush.listenerM addObject:listener];
}
/** 移除监听者 */
+(void)removeJPushListener:(id<CoreJPushProtocol>)listener{
MyJPush *jpush = [MyJPush sharedCoreJPush];
if(![jpush.listenerM containsObject:listener]) return;
[jpush.listenerM removeObject:listener];
}
-(NSMutableArray *)listenerM{
if(_listenerM==nil){
_listenerM = [NSMutableArray array];
}
return _listenerM;
}
-(void)didReceiveRemoteNotification:(NSDictionary *)userInfo{
[self handleBadge:[userInfo[@"aps"][@"badge"] integerValue]];
if(self.listenerM.count==0) return;
[self.listenerM enumerateObjectsUsingBlock:^(id<CoreJPushProtocol> listener, NSUInteger idx, BOOL *stop) {
if([listener respondsToSelector:@selector(didReceiveRemoteNotification:)]) [listener didReceiveRemoteNotification:userInfo];
}];
}
/** 处理badge */
-(void)handleBadge:(NSInteger)badge{
NSInteger now = badge-1;
[[UIApplication sharedApplication] cancelAllLocalNotifications];
[UIApplication sharedApplication].applicationIconBadgeNumber=0;
[UIApplication sharedApplication].applicationIconBadgeNumber=now;
[JPUSHService setBadge:now];
}
+(void)setTags:(NSSet *)tags alias:(NSString *)alias resBlock:(void(^)(BOOL res, NSSet *tags,NSString *alias))resBlock{
MyJPush *jpush = [MyJPush sharedCoreJPush];
[JPUSHService setTags:tags alias:alias callbackSelector:@selector(tagsAliasCallback:tags:alias:) object:jpush];
jpush.ResBlock=resBlock;
}
-(void)tagsAliasCallback:(int)iResCode tags:(NSSet *)tags alias:(NSString *)alias{
if(self.ResBlock != nil) self.ResBlock(iResCode==0,tags,alias);
}
2.2 其次创建一个基于APPDelegate的类别文件 暂时命名为 AppDelegate+JPush
实现下列几个方法:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// Required
[JPUSHService registerDeviceToken:deviceToken];
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
// Required,For systems with less than or equal to iOS6
[JPUSHService handleRemoteNotification:userInfo];
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// IOS 7 Support Required
[JPUSHService handleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
CoreJPush *jpush = [CoreJPush sharedCoreJPush];
[jpush didReceiveRemoteNotification:userInfo];
}
这两个文件可以直接拿到自己的项目中使用,然后在项目中添加以下需要依赖的库
.CFNetwork.framework
.CoreFoundation.framework
.CoreTelephony.framework
.SystemConfiguration.framework
.Security.framework
. libz.tbd
第二步进行项目配置:
. (1) Search Paths 下的 User Header Search Paths 和 Library Search Paths为`$(PROJECT_DIR)/CoreJPush/CoreJPush/Lib`。
. (2) 选中Project-Target-Capabilities-Background Modes,勾选Remote Notifications。
. (3) 请修改CoreJPush框架内Common文件夹下PushConfig.plist的Appkey为您的Appkey。
. (4) 如果你的工程需要支持小于7.0的iOS系统,请到Build Settings 关闭 bitCode 选项,否则将无法正常编译通过。
. (5)允许XCode7支持Http传输方法
如果用的是Xcode7时,需要在App项目的plist手动加入以下key和值以支持http传输:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
最重要的一步:
1.注册JPush
请删除您的AppDelgate中所有有关推送的方法,因为CoreJPush内部已经封装。
#import "MyJPush.h"
//注册JPush
[MyJPush registerJPush:launchOptions];
2.在您任意想得到推送数据的地方,三句代码搞定:
//1.添加一个监听者:此监听者是遵循了CoreJPushProtocol协议
[MyJPush addJPushListener:self];
//2.你需要在合适的地方(比如dealloc),移除监听者
[MyJPush removeJPushListener:self];
//3.您已经遵循了MyJPushProtocol协议,直接在.m文件里面敲did ,Xcode会提示你如下方法:
-(void)didReceiveRemoteNotification:(NSDictionary *)userInfo{
NSLog(@"ViewController: %@",userInfo);
}
#pragma mark - 在极光推送网站发送消息,带参数,手机接收到消息后进行一系列操作
//获取推送的信息(包括推送时添加的key和value,通过key获取value的值)
-(void)didReceiveRemoteNotification:(NSDictionary *)userInfo{
NSLog(@"controller: %@",userInfo);
if ([userInfo.allKeys containsObject :@"key"]) { //这里的key是自己在极光推送的平台上发送通知时自己创建的key和value
NSLog(@"发送通知成功,开始跳转");
WebViewController *webVc = [[WebViewController alloc]init];
webVc.UrlString = userInfo[@"key"];
[self.navigationController pushViewController:webVc animated:YES];
}
}
别的一些操作查看极光推送的文档就可以了,封装两个文件是为了以后配置和使用的时候更加方便,还有比较简单的证书的配置啊什么的就不再多说了,网上以及极光推送官网的文档中有很明确的说明,此处需要使用的是极光推送 jpush-ios-2.1.5以后的版本
有需要或者指正的小伙伴可以给我留言哦!
如需源码,可留言单独赠送
iOS推送(利用极光推送)的更多相关文章
- android推送,极光推送
android中简单易用的消息推送方式之中的一个 -------> 极光推送 首先来介绍一下极光推送. 极光推送:英文简称 JPush,是一个面向普通开发人员免费.开放的第三方消息推送服务,我们 ...
- Android开发之第三方推送JPush极光推送知识点详解 学会集成第三方SDK推送
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 下面是一些知识点介绍,后期将会带领大家进行代码实战: 一.Android实现推送方式解决方案: 1.推 ...
- [iOS]iPhone利用<极光推送>实现远程推送
准备: 1. 一个Xcode工程 2. 开发者账号 3. 真机 (重要,模拟器无法进行远程推送,因为模拟器没有UDID) 第一步:绑定工程的Bundle Identifer 首先当然要登录https: ...
- iOS第三方推送-极光推送
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- iOS开发——iOS10升级极光推送SDK、友盟分享SDK
前不久升级了Xcode8 ,同时iOS10系统也推送久. 由于公司需要适配iOS 10系统,同时第三方sdk建议升级. 包含替换升级新的SDK和相应的代码修改. 主要分享如何升级极光推送SDK,友盟分 ...
- iOS推送功能极光推送的介绍与实现
1.个人整理操作流程 2.官方使用说明流程 2018iOS极光推送完整流程 极光推送官网
- APP的消息推送(极光推送)
APP的消息推送,使用的第三方平台是极光推送 简单案例(以Thinkphp为例): 1.下载下载PHPSDK 2.把PHPSDK目录下的jpush-api-php-client-3.5.1\src\J ...
- Android消息推送——JPush极光推送
刚看了一篇关于Android消息推送评测总结的博客http://www.cnblogs.com/logan/p/4514635.html: 自己也对原学过的JPush极光进行一下小结,方便后续工作使用 ...
- xamarin.android 消息推送功能--极光推送
最近在使用xamarin.android的消息推送功能,官方使用的例子是FCM方式,按照官方文档,使用FQ软件是可以成功的,但是在国内由于众所周知的原因,在国内服务并不能使用,于是查找国内各自推送平台 ...
随机推荐
- 解决Select2控件不能在jQuery UI Dialog中不能搜索的bug
本文使用博客园Markdown编辑器进行编辑 1.问题呈现 项目中使用了jQuery UI的Dialog控件,一般用来处理需要提示用户输入或操作的简单页面.逻辑是修改一个广告的图片和标题. 效果截图如 ...
- Markdown编辑器入门
欢迎使用博客园的Markdown编辑器 前言 今天早上起来在Ubuntu下操作,所以不能使用Windows Live Writer.所以就直接使用博客园的后台编辑器,开始以为博客园出错了,怎么编辑都没 ...
- scikit-learn 线性回归算法库小结
scikit-learn对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析,本文就对这些类库的使用做一个总结,重点讲述这些线性回归算法库的不同和各自的使用场景. 线性回归的目的是要得到输 ...
- 读《linux内核完全注释》的FAQ
以下只是个人看了<linux内核完全注释>的一点理解,如果有错误,欢迎指正! 1 eip中保存的地址是逻辑地址.线性地址还是物理地址? 这个应该要分情况.eip保存的是下一条要执行的指令地 ...
- 结婚虽易,终老不易:EntityFramework和AutoMapper的婚后生活
写在前面 我到底是什么? 越界的可怕 做好自己 后记 上一篇<恋爱虽易,相处不易:当EntityFramework爱上AutoMapper>文章的最后提到,虽然AutoMapper为了En ...
- ios UIWebView 在开发中加载文件
UIWebView 在实际应用中加载文件的时候,有两种情况, 1. 实行在线预览 , 2. 下载到本地,再查看 如果是第一种情况: NSURL *url = [NSURL URLWithString: ...
- Tomcat服务器本地的搭建,以及在 IDEA软件下的配置,以及项目的测试运行(基于supermvc框架下的web)
一.声明 使用了基于springmvc的supermvc的web框架.实习公司的框架. 二.tomact的下载与安装 1选择适合自己电脑配置的jdk和jre版本(截图来自tomcat的官方网站http ...
- Cesium原理篇:3最长的一帧之地形(4:重采样)
地形部分的原理介绍的差不多了,但之前还有一个刻意忽略的地方,就是地形的重采样.通俗的讲,如果当前Tile没有地形数据的话,则会从他父类的地形数据中取它所对应的四分之一的地形数据.打个比方 ...
- JavaScriptSerializer 序列化json 时间格式
利用JavaScriptSerializer 序列化json 时间格式,得到的DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,显然要进行转换 1.利用字符串直 ...
- activity结束之后刷新之前的activity的内容
点击添加按钮之后-----弹出一个新的activity--------在新的activity将数据输入保存之后,关闭当前的activity回到之前的activity刷新内容 实现:使用onActivi ...