推送

本文深入解析了iOS推送通知机制,包括本地推送通知的简单使用与实现,以及如何实现远程推送通知,同时讨论了推送通知的呈现效果、配置与调试方法,提供了一个完整的开发指南。

iOS 中的推送分为两种:

本地推送通知(Local Notification)

远程推送通知 (Remote Notification)

推送的作用就是让不在前台运行的APP,告知用户APP内部发生了什么事情。

推送通知的呈现效果有5种,可以在系统通知中心中进行设置。发出推送通知的时候,如果当前程序正在运行在前台,那么那么推送通知就不会被呈现出来,点击推送通知后,默认就会自动打开发出推送通知的APP,不APP是打开还是关闭,推送通知都能如期发出。

本地推送通知:(就是不需要联网就能发出的推送通知,不需要服务器的支持),常用来提示用户完成一些任务比如清理垃圾、记账、看电影、玩游戏等。

iOS7  的本地通知的简单使用:

//1.创建一个本地的通知对象
    UILocalNotification *loc = [[UILocalNotification alloc] init];
    
    //2.设置本地推送通知属性
    //通知触发的时间(何时发出推送通知),              5秒后触发
    loc.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
    //推送通知的具体内容
    loc.alertBody = @"本地通知的测试";
    //设置声音    模拟器不行,必须只有真机才有效果,如果真机设置的是静音,会自动转换成震动
    loc.soundName = UILocalNotificationDefaultSoundName;
    //显示应用图标右上角的数字 (图标右上角会有一个红色的提示)
    loc.applicationIconBadgeNumber = 10;
    //设置点击顶部通知进入到应用的时候,显示启动图片   (需要设置启动图片的素材)
    loc.alertLaunchImage = @"UILaunchImageFile";
    //在锁屏是显示的动作标题(完整标题:“滑动来” + alertAction)
    //loc.alertAction

 #pragma mark - 不常用的属性
    //每隔多久重复发送一次推送通知(每隔一分钟发送一次通知)
    //loc.repeatInterval = NSCalendarUnitMinute;
    
    //公历   和   农历       具体的可以去文档中找(通常是不设置的,一般都是用系统默认的)
    //设置重复日历是农历
    //loc.repeatCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:@"NSCalendarIdentifierChinese"];
    //这个日历会根据用户的设置自动更新
    //loc.repeatCalendar = [NSCalendar autoupdatingCurrentCalendar];
    
    //3.让应用去调度本地推送通知(调度完毕后,推送通知会在特定的时间fireDate发出)
    //这句话只是把通知添加到本地的通知调度池中   (系统自己就会调度)
    [[UIApplication sharedApplication] scheduleLocalNotification:loc];
    
    
    //移除调度池中的通知
    //取消应用中的所有的通知
    //[[UIApplication sharedApplication] cancelAllLocalNotifications];
    //取消某一个通知
    //[[UIApplication sharedApplication] cancelLocalNotification:loc];
    
    //返回系统中的所有的本地推送通知(已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)
    //NSArray *Notifications = [[UIApplication sharedApplication]scheduledLocalNotifications];

上面的通知都是点击了通知以后直接跳转到了主界面,有时候需要点击通知跳转到指定的界面,如果要实现这样的效果,下面就是通过不同的通知模拟实现跳转到朋友圈和我的好友的效果。首先是sb中拖出来三个控制器,模拟如下:

//点击发送跳转到朋友圈的通知
- (IBAction)jumpToSession {
    
    [self postLocalNotificationWithAlertBody:@"跳转到朋友圈" addUserInfo: @{@"pageKey":@(1)}];
}
//点击发送跳转到我的好友的通知
- (IBAction) jumpToFriend {
    
    [self postLocalNotificationWithAlertBody:@"跳转到我的好友" addUserInfo:@{@"pageKey":@(2)}];
}

//抽取的一个发送通知的方法
- (void) postLocalNotificationWithAlertBody:(NSString *) alertBody addUserInfo:(NSDictionary *) userInfo
{
    //  1.创建一个本地通知对象
    UILocalNotification *loc = [[UILocalNotification alloc] init];
    
    //  2.设置属性
    //  通知发送时间
    loc.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
    //  通知内容
    loc.alertBody = alertBody;
    //  设置声音
    //  模拟器测试不来,只有真机才有效果
    //  如果真机设置是静音,会自动转换为震动
    loc.soundName = UILocalNotificationDefaultSoundName;
    //  显示应用图标右上角的数字
    loc.applicationIconBadgeNumber = 10;
    
    //  设置点击通知进入应用的时候,显示启动图片
    loc.alertLaunchImage =  @"UILaunchImageFile";
    
    //  给通知附加一些额外信息,可以用来进行界面的跳转
    loc.userInfo = userInfo;
    
    //  调度通知
    [[UIApplication sharedApplication] scheduleLocalNotification:loc];
}
AppDelegate 控制器:当应用程序在前台的时候发送通知也不会进行跳转,当在后台的时候或者程序已经关闭的时候,点击通知就跳转到对应的控制器中

//当app已经关闭(进程已死),再次启动app,启动完毕会调用下面的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //取出本地推送通知对象
   UILocalNotification *notifcation  = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
    
   // 如果notifcation不是nil,那么就表明,用户是点击本地通知进入界面的
    if (notifcation) {
        [self jumpToPageWithLocalNotification:notifcation];
    }
    
    return YES;
}

/*
  当收到这个本地通知对象时候,会调用该方法
 
  1.当本应用在后台时候,点击通知进入引用的时候,会调用该方法
 
 */
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    
//  如果应用在前台的时候,就不要跳转界面了
    if(application.applicationState == UIApplicationStateActive){
        return;
    }
    
    [self jumpToPageWithLocalNotification:notification];
    
}
- (void) jumpToPageWithLocalNotification:(UILocalNotification *) notification
{
    //    [NSLog(@"%@",notification.userInfo)];
    //   1.获取 tabBarController
    UITabBarController *tbC  = (UITabBarController *)self.window.rootViewController;
    
    NSUInteger index  = [notification.userInfo[@"pageKey"] unsignedIntegerValue];
    
    tbC.selectedIndex = index;
}
iOS8 的本地通知的注意点:(比ios7 的本地推送通知增加了一部分新的东西) 需要得到用户的许可才可以像用户进行推送通知,在didFinishLaunchingWithOptions中添加如下的代码:
//需要根据系统的版本号进行不同的设置(在appDelegate中增加判断)
    if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {
        [self registerUserNotificationSettings];
    }
- (void) registerUserNotificationSettings
{
    //1、请求的权限类型
    UIUserNotificationType types = UIUserNotificationTypeBadge|UIUserNotificationTypeAlert|UIUserNotificationTypeSound;

    //category 可以设置也可以不用设置,设置上的话下拉会有对应的两个按钮,点击可以进入不同的界面,一般不写
    UIMutableUserNotificationCategory  *category = [[UIMutableUserNotificationCategory alloc] init];
    //  设置一个标识符
    category.identifier = @"test";
    //  创建一个前台按钮
    UIMutableUserNotificationAction *foreground = [[UIMutableUserNotificationAction alloc] init];
    //  设置点击按钮运行程序的模式
    foreground.activationMode = UIUserNotificationActivationModeForeground;
    //  用户标记用户点击那个按钮,进入应用程序
    foreground.identifier = @"foreground";
    //  设置按钮上文字
    foreground.title = @"前台";
    //  创建一个后台按钮
    UIMutableUserNotificationAction *background = [[UIMutableUserNotificationAction alloc] init];
    //  设置点击按钮运行程序的模式
    background.activationMode = UIUserNotificationActivationModeBackground;
    //  用户标记用户点击那个按钮,进入应用程序
    background.identifier = @"background";
    //  设置按钮上文字
    background.title = @"后台";
    [category setActions:@[foreground,background] forContext:UIUserNotificationActionContextDefault];
    NSSet *categories = [NSSet setWithObjects:category,nil];

    //2、请求权限设置
    UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes: types categories:categories];
    //3、注册用户权限
    [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
}

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler
{
    if ([identifier isEqualToString:@"foreground"]) {
        NSLog(@"进入前台");
    }else if([identifier isEqualToString:@"background"]){
        NSLog(@"进入后台");
    }
//  一旦你任务完成之后,要尽快的调用completionHandler block
    completionHandler();
}

基于位置的本地推送:需要在plist文件中配置一下NSLocationWhenInUseUsageDescription  这样当用户进入或者走出某个区域的时候会给用户推送相关的信息。

//需要导入这个头文件
#import  <CoreLocation/CoreLocation.h>
@interface ViewController () <CLLocationManagerDelegate>

@property (nonatomic, strong) CLLocationManager *location;
- (void)viewDidLoad {
    [super viewDidLoad];
    self.location = [[CLLocationManager alloc] init];
    
    if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {
        [self.location requestWhenInUseAuthorization];
        self.location.delegate = self;
    }
}
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    if (status == kCLAuthorizationStatusAuthorizedWhenInUse) {
        
        //只有授权了才能发送基于位置的本地通知
        //  1.创建一个本地通知对象
        UILocalNotification *loc = [[UILocalNotification alloc] init];
        
        //  2.设置属性
        CLLocationCoordinate2D center = CLLocationCoordinate2DMake(40.0, 106.0);
        //radius 半径单位是 m
        loc.region = [[CLCircularRegion alloc] initWithCenter:center radius:100 identifier:@"region"];
        //设置用户进入或离开这个区域的时候只执行一次
        //如果需要执行多次,就是设置为NO
        loc.regionTriggersOnce = YES;
        //  通知内容
        loc.alertBody = @"你已进入监视区";
        //  设置声音
        loc.soundName = UILocalNotificationDefaultSoundName;
        //  调度通知
        [[UIApplication sharedApplication] scheduleLocalNotification:loc];
    
    }
}

远程推送通知:

就是从远程服务器推送给客户端的通知(需要联网来实现),远程推送服务又叫APNs(Apple Push Notification Services),只要我们的手机联网了就会与苹果的APNs服务器建立一个长连接。远程推送的目的就是为了解决如果用户关闭了APP,就无法与app的服务器进行沟通了,无法从服务器上获取最新的数据内容的问题。

补充:长连接 && 短链接

短链接:当客户端需要数据的时候,每次都去服务器请求,当它获取完数据之后,就会断开链接,一般与服务器的链接都是短链接。

长连接:一旦用户联网了就会建立链接,这个链接除非网络断开了,否则就一直连着。

长连接的坏处:占服务资源

长连接的好处:数据传输的速度快!保持数据的实时更新,更新APP、校准时间、查找我的iPhone等都是长连接。只有长连接才可以做推送服务。

远程推送的原理:

以李四向张三发送QQ消息为例简单介绍推送的整个详细过程:

                                


调试iOS的远程推送是需要条件的,我们需要相应的证书才可以进行调试和发布:

开发调试时需要的证书:(Xcode7 开始支持真机调试,但是只支持一般的调试不支持包含特殊服务的调试如远程推送和内购的调试.)

  ios_development.cer  :开发证书,用来标识哪台电脑可以进行真机调试
  aps_development.cer  :那台电脑开发的那个App可以使用远程推送服务
  dev_push.mobileprovision  :安装在Xcode中用于证书的验证,它代表着,那个电脑,可以开发什么样的App,可以运行到那台真机上,前两个证书是安装在钥匙串中的

配置远程推送的调试证书:

要启用远程推送通知,就必须创建一个明确的APP ID ,根据这个明确的APP ID 创建远程推送通知的开发证书和发布证书。

1.进入开发者中心(https://developer.apple.com)

2.进入证书管理(Certificates, Identifiers & Profiles -> Certificates -> Development)

3.点击右上角的加号先创建一个开发者证书(可能没法选择开发者证书,原因可能是前面已经有了开发证书,最多只能有两个开发证书,需要删除(Revoke)前面的没用证书)

4.选择 iOS APP Development -> continue ->会提示生成 About Creating a Certificate Signing Request (CSR)文件  -> 这时候需要打开mac的钥匙串 -> 钥匙串访问 ->证书助理 -> 从证书颁发机构请求证书  ->选择存储到磁盘,邮件地址随便写 ->点击存储完成(我们无论是在开发还是发布都是用请求的这个同一个证书,创建一个文件夹专门用来保存我们的证书)-> 回到CSR 网页界面选择Choose File 找到请求的证书  -> Generate  ->  Download (以后安装上就可以让我们电脑具备开发的能力)

5.创建一个明确的App ID :  identifiers  -> App IDS  -> 点击加号   ->APP ID Description (指定APP ID的描述名称,只是为了便于识别,随便写)  ->  往下拉,Explicit App ID(使用明确的Bunld ID ,要和自己的项目的bundle Id 保持一致) - > 往下 勾选 Push Notifcations  -> Continue ->会看到 Push Notifications 是 Configurable 点击 submit  -> 进入下一个界面点击“Done”,到此为止,明确的 APP ID 配置完成。然后查看配置情况找到刚才的APP ID 点击进入后发现Push Notifications 面的开发和发布都是Configurable(可配置的)

6.配置APNs 开发证书 : 有两种方式

方式一: 接着步骤5 选择 Edit  -> 拖到最后有 push Notifications  (Development SSL Certificate  创建开发的SSL 证书  &&  Production SSL Certificate  创建发布 SSL 证书)

-> 先选择第一个创建 开发SSL 证书 和刚才 申请开发证书类似根据请求文件 导入请求文件点击 Generate -> Download(下载下来放到开发证书文件夹中,这样我们就有两个证书了)

方式二:Certificates -> Development ->点击加号 Apple Push Notification service SSL (Sandbox) ->continue 选择刚才创建好的明确APP ID  ->创建证书签名请求  -> 下面基本上和上面就类似了。最终得到一个 aps_development.cer 的SSL证书

7.添加设备 : Devices  -> all  ->点击加号 ->Register Devices 输入手机的名字和 UUID -> continue ->Register 设备注册完成。

8.创建 Profile 文件: Provisioning Profiles  - >  all  ->  点击加号 ->  Development  ios App Development -> continue -> 选择刚才创建的对应的明确APP ID  - > continue  Select all (不清楚自己是哪个开发者证书的话可以全部勾选)  -> 下一步设备的话也选所有的(公司内部可能很多台设备需要使用)  - > Profile Name (可以随便写的 dev_push) ->生成并下载。到此三个证书都有了。

9.安装证书: 注意安装的顺序  ios_development.cer 双击安装  -->   aps_development.cer   -->  dev_push.mobileprovision  到此就可以进行开发了。

开发步骤:

    1.注册远程通知
    2.获取deviceToken
    3.deviceToken发送给远程服务器
    4.处理接收到通知的界面跳转
      iOS7之前和之后进行判断处理

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {
       
        // 1、请求用户权限   (注册用户通知设置信息),这个方法与本地通知相同
       // 1.1请求通知类型
        UIUserNotificationType types = UIUserNotificationTypeAlert|UIUserNotificationTypeSound|UIUserNotificationTypeBadge;
        // 1.2创建用户通知设置信息,categories是用来定制通知的时候的按钮的与本地通知相同
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
         // 1.3注册用户通知设置信息
         [application registerUserNotificationSettings:settings];
    }else{
        UIRemoteNotificationType types = UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound;
        //注册远程通知
        [application registerForRemoteNotificationTypes:types];
    }
    //如果是点击远程通知,启动的应用程序,那个这个key对应的内容就是,用户userInfo
    NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
    if (userInfo) {
        [self jumpToPageWithUserInfo:userInfo];
    }
    
    return YES;
}

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    //2、注册远程通知
    [application registerForRemoteNotifications];
}

/// APNs服务器返回deviceToken的回调方法
/// deviceToken  哪个应用哪个手机   所以远程推送只能在真机上测试
//deviceToken,注意"<>" 不是deviceToken的一部分,所以使用deviceToken需要把两端"<>"去掉
//<2d734532 5fc58437 9909bc60 0300f674 d422ee14 95a7c85b 1e115085 9dc2b05d>
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    //通过这种方式获得devieToken
    NSString *dtStr = deviceToken.description;
    //NSLog(@"%@",deviceToken);
}

/// 当收到远程推送通知时候,会调用该方法
/// 当应用程序在后台时候,点击远程推送通知会调用该方法
//  当应用程序在前台的时候,一收到远程通知就会调用该方法
//  如果应用程序已退出,就不会调用该方法了
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"%s",__func__);
    if (application.applicationState == UIApplicationStateActive) {
        return;
    }
//    NSLog(@"%@",userInfo);
    [self jumpToPageWithUserInfo:userInfo];
}

/// 无论应用在后台还是已经退出,点击远程推送通知时候,都会调用该方法
/// 如果在前台,一旦收到远程通知就会调用该方法
//  在iOS7以后 如果实现这个这个方法,那么- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 就不会调用了.
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"%s",__func__);
    if (application.applicationState == UIApplicationStateActive) {
        return;
    }
    [self jumpToPageWithUserInfo:userInfo];
    
    //一旦完成任务后一定要要调用这个block,让iOS系统能够计算这个后台任务花费 时间,数据
    completionHandler(UIBackgroundFetchResultNewData);
}

//点击通知后进行跳转
- (void) jumpToPageWithUserInfo:(NSDictionary *) userInfo
{
    //根据返回的信息(userInfo)进行判断
    if ([userInfo[@"PageKey"] isEqualToString:@"1"]) {
        
        UIView *view = [[UIView alloc] init];
        view.frame = CGRectMake(10, 20, 200, 200);
        view.backgroundColor = [UIColor blueColor];
        [self.window.rootViewController.view  addSubview:view];
    }
}

Provider集成是服务端的事情,不用我们搞

配置远程推送的发布证书:

1>ios_distribution.cer : 让电脑具备发布程序的能力

2> aps_production.cer:如果发布的程序中包含了推送服务,就必须安装这个证书

3>dis_weipush.mobileprovision : 某台电脑就能发布某个程序

1.进入证书管理中心

2.添加证书 Certificates Production  -> 点击加号  —>选择 App Store and  Ad Hoc (可以发布到AppStore Ad Hoc 意思是也可以测试)  ->continue  - > 提示我们创建一个Certificate Signing Request (CSR)文件,我们已经创建了一个不用创建了,另外我最好保证所有地方使用到这个文件都是同一个,否则可能会导致证书不匹配的问题,这里直接点击"Continue"就可以了   -->上传 证书请求文件"CSR" 文件. 点击 "Generate" 生成发布证书,下载发布证书,得到 "ios_distribution.cer" 下载下来放到一个发布证书的文件夹中

3.在APP IDs 中 找到刚才的明确的APP ID 中点击Edite 配置拖到最后有 push Notifications,Production SSL Certificate  创建发布 SSL 证书,进行生成 APNs的发布证书:最终生成一个APNs发布证书,下载APNs发布证书,得到aps_production.cer证书。

4.生成发布Profile :  Provisioning    Profiles Development -->  点击右边的加号  ->选择AppStore是发布到AppStore的,选择 Ad Hoc 是进行测试的。-> 下一步选择对应的明确的APP  ID  -> Select certificates 选择最新的一个即可 ->勾选所有的设备  -->  填写profile的名称,一般为了和开发证书区分开,这里以dis 作为前缀(dis_weipush)。下载描述文件点击Done 完成即可。

5.安装发布证书 ,注意安装顺序  ios_distribution.cer —>aps_production.cer  --> dis_weipush.mobileprovision  这样就完成了。

使用Xcode 发布应用:

product -> Archive ->export -> Save for ios AppStore Deployment -> 选择账号 ->export(导出)

极光推送:

1.注册JPush 账号 https://www.jpush.cn

2.下载 SDK  http://docs.jpush.io/resources/

3.根据文档进行集成  http://docs.jpush.io/guideline/ios_guide/

具体流程:

1、登录完账号密码后创建应用输入应用名称和图标(图标可选)

2、导入证书 :(需要一个iOS 开发证书 还需要一个 iOS 生产证书 )

但是不能把我们生成的开发aps_development.cer证书直接上传,因为此证书已经与我们的电脑绑定,所以需要生成一个p12格式的个人信息交换证书,找到钥匙串中的APNs开发证书apple Development iOS push services.cn 右键导出文件 导出XXX.p12文件(最好是也导出到开发证书的文件夹中方便查找),然后上传此文件即可。会让设置一个密码,进行设置即可。上传成功就可以进行开发了,这样就可以进行推送了。

发布证书的导出方式和上面是一样的,导出后放到发布证书的文件夹中上传即可。

可能会出现上传失败的问题:会有相应的提示:“开发证书没有通过验证,是否重新上传证书”

          解决的办法是:

1. 首先产生从证书管理中心从新下载一个新的aps_deleveper.cer替换这个,安装新下载的aps_deleveper.cer,需要把原来的那个删除,才能保证这个新的能够安装上去,然后 重新导出一个.p12,在上传JPush(一般这样搞下就可以了)
2. 有时候是证书安装时候,有问题把证重新删除重新安装一下
3. 如果上面方法,搞了一遍还不行,终极解决方案,把所有的证书都删除了重新搞

直到显示开发环境和生产环境都是已验证就证明上传完成。然后根据文档开始在代码中集成JPush:

        详细集成步骤:http://docs.jpush.io/guideline/ios_guide/#sdk(可以参考官方)

1.下载sdk https://www.jpush.cn/common/products  (内部包含demo,解压后把lib文件夹拖进工程即可)

2.添加一些框架:

CFNetwork.framework
CoreFoundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
Security.framework
Xcode7需要的是libz.tbd;Xcode7以下版本是libz.dylib
3.配置plist文件(可以从demo中把plist文件拖出来也行,需要修改appkey)

在你的工程中创建一个新的Property List文件,并将其命名为PushConfig.plist,填入Portal为你的应用提供的APP_KEY等参数。
{
 "APS_FOR_PRODUCTION" = "0";
 "CHANNEL" = "Publish channel";
 "APP_KEY" = "AppKey copied from JPush Portal application";
}
CHANNEL
指明应用程序包的下载渠道,为方便分渠道统计。根据你的需求自行定义即可。
APP_KEY
在管理Portal上创建应用时自动生成的(AppKey)用以标识该应用。请确保应用内配置的 AppKey 与第1步在 Portal 上创建应用时生成的 AppKey 一致,AppKey 可以在应用详情中查询。

4.拷贝代码到appDelegate即可

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    // Required
   if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
    //可以添加自定义categories
    [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound |UIUserNotificationTypeAlert)
categories:nil];
  } else {
    //categories 必须为nil
    [APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert)
    categories:nil];
  }

    // Required
    [APService setupWithOption:launchOptions];

    return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    // Required
    [APService registerDeviceToken:deviceToken];
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

//在这里处理界面的跳转
//  1. iOS7 之前,应用在后台,点击远程通知处理界面跳转
//  2. 注意:当应用程序在前台时候不要跳转

 // Required
    [APService handleRemoteNotification:userInfo];
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

//  iOS7之后的界面跳转实现代码写在这 -- 处理界面跳转

  // IOS 7 Support Required
  [APService handleRemoteNotification:userInfo];
  completionHandler(UIBackgroundFetchResultNewData);
}

到此极光推送就集成完了,编译后打印JPushLog: upload device token success就证明成功了。我们就可以开始推送了。
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值