美文网首页
极光推送

极光推送

作者: huicuihui | 来源:发表于2018-01-23 15:17 被阅读124次

极光推送的集成:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加下面代码:

JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;
[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
[JPUSHService setupWithOption:launchOptions appKey:<#JPUSHappKey#> channel:@"app store" apsForProduction:<#isDevelepDEV#>];
注册DeviceToken:
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    
    /// Required
    [JPUSHService registerDeviceToken:deviceToken];
}
注册DeviceToken失败:
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    //Optional
    NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}

收到推送的通知消息之后,点击通知跳转到app指定页面

需求:收到通知之后,在后台或者应用完全杀死的情况下,收到通知,点击通知能够直接进入特定的页面。进入特定页面之后,点击返回的话,返回到应用的首页。
实现:在JPUSHRegisterDelegate代理方法中去实现跳转。

app在前台运行的时候,接收到通知之后会走下面方法:

#pragma mark- JPUSHRegisterDelegate

// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
    NSDictionary * userInfo = notification.request.content.userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
    }
    //下面这行代码注掉之后,就不会显示通知栏弹窗了。
    completionHandler(UNNotificationPresentationOptionAlert);
}

app在前台运行的时候,接收到通知之后会走下面方法:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo ;
对上面两个方法进行解释:

上面这个是ios 7后新加入的方法,如果实现了上面那个方法,下面这个就会被覆盖掉,不再执行。
上面这个方法有几个特性:当程序在前台运行时,收到远程推送,会立刻调用此方法,但是如果程序在后台挂起,收到消息(未点击推送消息时)并不会执行方法,如果想在收到消息的时候有需求需要执行一些代码,那么可以让服务器发给APNS时在aps 字典中加入apn = {content-available = 1;}这个字段

image.png

当应用在后台挂起时接收到推送消息时就会立即执行上面这个方法,当然,当你再点击推送消息时,还会再执行一次(这两种情况可以根据applicationState这个属性区分),而下面这个方法只会在点击推送消息,或者应用在前台运行时接收到消息时才会调用。如果你有需求,当应用在前台运行时接收到推送消息也希望有类似远程推送那样,我想的方法是程序在前台运行,收到推送消息,那么给他转化成本地通知,但是本地通知并不会有横幅提示。如果你也想要这个提示可以自定义一个view来显示。

程序在后台的时候,AppDelegate中的方法都不会走的, 点击通知进入app,会走上面的方法。 跳转、进入指定的页面在这个方法中设置。

app在后台时, 通过点击通知打开进入app, 在上面方法中打断点,在控制台打印po [UIApplication sharedApplication].applicationState 输出UIApplicationStateInactive 这是从后台进入app的状态。
app在前台运行中的时候,只要不点击通知,就不会走上面的方法。点击通知才会走该方法。在前台运行的时候接收到通知,并点击通知在上面方法中打断点,打印[UIApplication sharedApplication].applicationState 输出UIApplicationStateActive
这是app在前台运行的情况的状态。

点击通知栏消息 打开app之后走的方法

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    // 极光推送获取到的消息体
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    //下面是根据收到的消息的消息体去做不同的处理。例如跳转到h5网页,或者app原生的页面。
    if ([userInfo[@"url"] isUrlString]) {
        //这是跳h5网页的情况
        [self dealWithUrl:userInfo[@"url"]];
        //        if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
        //        }
    } else {
        //这是跳app原生页面的情况
        //根据userInfo的内容,跳转不同的页面
        self.window.rootViewController = <#设置根控制器#>;
    }


    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
    }
    
    completionHandler();  // 系统要求执行这个方法
}

跳h5网页的方法:

- (void)dealWithUrl:(NSString *)urlStr {
    H5ShowPageViewController * h5 = [H5ShowPageViewController h5ShowPageViewController];
        /*
         根据url去判断跳到那种类型到h5页面, 再做导航条显隐和是否需要登录等特殊设置。
         */
    self.window.rootViewController = [[LMNavigationViewController alloc]initWithRootViewController:h5];
}

在控制器基类中添加一个属性记录是否是从点击通知进入的该页面,并且实现导航条返回按钮的方法,返回的方法中判断 如果该页面是从点击通知进入的,则返回的时候直接返回到首页。否则的话就正常的使用导航控制器pop方法退出。

设置app的角标[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; 这句如果在AppDelegate中实现的话,那么打开app就会清空通知栏中的通知消息。

前台运行时收到推送消息 需要实现下面方法:

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler;

下面是引用的 对两个方法对说明:

#pragma mark iOS 10 前台收到通知(远程推送和本地通知)

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {

    NSDictionary * userInfo = notification.request.content.userInfo;

    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {

        /// iOS10处理远程推送

        [JPUSHService handleRemoteNotification:userInfo];

        /// 应用处于前台收到推送的时候转成本地通知 ===========================

        UILocalNotification *notification = [[UILocalNotificationalloc] init];

        notification.alertTitle =@"哈哈哈哈哈";

        notification.alertBody =@"aaaaaa";

        notification.userInfo = userInfo;

        [[UIApplication sharedApplication] presentLocalNotificationNow:notification];

    }else{

        /// 应用处于前台收到本地通知不会出现在通知中心 借用极光推送的方法将本地通知添加到通知栏 ==============================

        completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);

    }

    // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置

}

###点击通知栏消息
/// 程序运行于前台,后台 或杀死 点击推送通知 都会走这个方法
 - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {

    /*
     在这里执行点击之后,进行的处理,例如跳转到不同页面。
     */

    // Required

    NSDictionary * userInfo = response.notification.request.content.userInfo;

    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {

       [JPUSHService handleRemoteNotification:userInfo];

/// 杀死,后台点击通知栏 处理远程推送的跳转

        [selfreciveNotification:userInfo];

    }else{

         /// 前台运行时 转的本地通知 直接通知栏弹窗进行跳转处理

        [selfreciveNotification:userInfo];

    }

    completionHandler();  // 系统要求执行这个方法

}

点击推送消息进入详情然后返回

分为两种情况:
1、 app在已经打开在前台运行

[UIApplication sharedApplication].keyWindow.rootViewController = ((AppDelegate *)[UIApplication sharedApplication].delegate).<#首页的根控制器#>;

获取推送过来的消息,根据消息内容去做操作。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
点进去该方法,进入该方法的说明:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo NS_DEPRECATED_IOS(3_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] or -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:] for user visible notifications and -[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] for silent remote notifications");

相关文章

  • 极光推送

    极光推送视频地址,非常详细的极光推送视频 极光推送

  • 极光推送

    极光推送 tagprivate void initJpush() {//TODO 极光推送// JPushInte...

  • 极光推送进行远程推送

    借阅:极光推送进行远程推送 怎么使用极光推送进行远程推送 在极光官网注册极光推送创建一个应用在应用配置中导入两个证...

  • ios极光推送

    第一次使用极光推送,在这里把极光推送的步骤说一下,省的以后再次用到极光推送的时候,给忘了,其实,极光推送不难...

  • 【知识总结】(2)远程推送

    推送SDK:极光推送 后台点击推送: iOS 10 以下收到推送点击触发 iOS 10 以上触发: 极光推送中使用...

  • 2018年功能模块沉淀

    一、推送模块 1.极光推送 文档:https://www.jiguang.cn/push备注:极光推送包括普通推送...

  • 极光推送(二)——推送的使用

    前言 在极光推送(一)——配置中讲过了极光推送的配置,这节讲讲极光推送的使用参考文档极光官网 下面以我写的demo...

  • 极光推送集成开发

    1.极光推送集成与设置 极光推送地址①注册极光推送账号。②在应用管理内按照步骤创建APP。③找到“文档——iOS—...

  • Flutter开发 集成极光推送

    Flutter推送 极光推送Flutter版本 最近研究Flutter推送,在网上找了很多资料,发现极光推送竟然有...

  • 极光征文 | 我与极光的缘分

    极光征文 | 我与极光的缘分 首先简单介绍下极光推送;极光推送(JPush)是独立的第三方云推送平台,致力于为全球...

网友评论

      本文标题:极光推送

      本文链接:https://www.haomeiwen.com/subject/flhsaxtx.html