本文主要是基于极光推送的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推送(利用极光推送)的更多相关文章

  1. android推送,极光推送

    android中简单易用的消息推送方式之中的一个 -------> 极光推送 首先来介绍一下极光推送. 极光推送:英文简称 JPush,是一个面向普通开发人员免费.开放的第三方消息推送服务,我们 ...

  2. Android开发之第三方推送JPush极光推送知识点详解 学会集成第三方SDK推送

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 下面是一些知识点介绍,后期将会带领大家进行代码实战: 一.Android实现推送方式解决方案: 1.推 ...

  3. [iOS]iPhone利用<极光推送>实现远程推送

    准备: 1. 一个Xcode工程 2. 开发者账号 3. 真机 (重要,模拟器无法进行远程推送,因为模拟器没有UDID) 第一步:绑定工程的Bundle Identifer 首先当然要登录https: ...

  4. iOS第三方推送-极光推送

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  5. iOS开发——iOS10升级极光推送SDK、友盟分享SDK

    前不久升级了Xcode8 ,同时iOS10系统也推送久. 由于公司需要适配iOS 10系统,同时第三方sdk建议升级. 包含替换升级新的SDK和相应的代码修改. 主要分享如何升级极光推送SDK,友盟分 ...

  6. iOS推送功能极光推送的介绍与实现

    1.个人整理操作流程 2.官方使用说明流程 2018iOS极光推送完整流程 极光推送官网

  7. APP的消息推送(极光推送)

    APP的消息推送,使用的第三方平台是极光推送 简单案例(以Thinkphp为例): 1.下载下载PHPSDK 2.把PHPSDK目录下的jpush-api-php-client-3.5.1\src\J ...

  8. Android消息推送——JPush极光推送

    刚看了一篇关于Android消息推送评测总结的博客http://www.cnblogs.com/logan/p/4514635.html: 自己也对原学过的JPush极光进行一下小结,方便后续工作使用 ...

  9. xamarin.android 消息推送功能--极光推送

    最近在使用xamarin.android的消息推送功能,官方使用的例子是FCM方式,按照官方文档,使用FQ软件是可以成功的,但是在国内由于众所周知的原因,在国内服务并不能使用,于是查找国内各自推送平台 ...

随机推荐

  1. JavaScript操作Cookie

    在Web开发中,我们经常使用Cookie保存一些不是非常敏高的数据.比如“下次自动登录”,“广告显示”等功能.定义是:某些网站为了辨别用户身份而存储在用户本地终端(主要是浏览器)上的数据.定义域RFC ...

  2. iOS开发之ImageView复用实现图片无限轮播

    在上篇博客中iOS开发之多图片无缝滚动组件封装与使用给出了图片无限轮播的实现方案之一,下面在给出另一种解决方案.今天博客中要说的就是在ScrollView上贴两个ImageView, 把ImageVi ...

  3. iOS 如何自定义UISearchBar 中textField的高度

    iOS 如何自定义UISearchBar 中textField的高度 只需设置下边的方法就可以 [_searchBar setSearchFieldBackgroundImage:[UIImage i ...

  4. DotNet指定文件显示的尺寸

    在项目中开发中,有时候需要将文件的尺寸进行控制,例如需要将文件的尺寸指定为字节,TB等.现在提供一个方法,实现将指定文件的尺寸, 提供:"字节", "KB", ...

  5. js构建ui的统一异常处理方案(一)

    从早期从事基于java的服务器端开发,再到之后从事基于web和js的ui开发,总体感觉基于web页面的ui开发远不如服务器端健壮.主要是早期ie浏览器功能太弱小,很多业务被迫放到服务器端去实现,浏览器 ...

  6. Elasticsearch 全教程

    Elasticsearch 权威指南 在线阅读 国外自动指向 GITBOOK 项目 | 国内用户自动指向 阿里云 GITHUB 仓库 译者前言 译者现在的工作项目中需要用到 Elasticsearch ...

  7. iOS学习笔记——使用ChildViewController

    之前在使用TableView的时候遇到过问题,需要使用另外的TableViewController来先存放TableView,原有的View则使用ViewContainer来引用TableViewCo ...

  8. [修正] Firemonkey TSelection 控件等比缩放时,左下角拉动问题

    说明:TSelection 控件,当在属性 Proportional = True 为等比缩放时,拉动左下角,右上角会跟着移动. 适用:Berlin 10.1.1 (或之前版本) Firemonkey ...

  9. Windows 10 下mysql 安装后无法启动问题

    安装过程: 1. 官网下载5.15.7, http://dev.mysql.com/downloads/, 选择开源社区版:MySQL Community Server (GPL) 2. 我解压后放在 ...

  10. 【转】php pdo连接数据库 解决中文乱码问题(wordpress mysql 问号?? ??)

    原文链接:http://blog.csdn.net/ysydao/article/details/11002295 PHP 用pdo连接数据库时出现中文乱码问题解决办法 1.array(PDO::MY ...