必威-必威-欢迎您

必威,必威官网企业自成立以来,以策略先行,经营致胜,管理为本的商,业推广理念,一步一个脚印发展成为同类企业中经营范围最广,在行业内颇具影响力的企业。

现在我们大多数都适配到必威:,现有工程

2019-09-12 19:42 来源:未知

如果本地通知改变了icon角标,可以在接收通知的方法或者在applicationDidBecomeActive里执行以下方法:

当APP已经处于前台并接收到推送,或者APP不在前台时,接收到推送会有通知栏提示,这时点击通知栏唤醒APP,都会调用以下方法:

自定义界面

除了上述功能外,苹果还新增了自定义界面,这个绝对是大招。
必威 1

其中上面的黄色区域可以理解成一个 ViewController 操作,下面绿色部分就是 Title 之类的显示内容。这部分是可以隐藏的。在扩展的目录下的 info.plist 编辑一些界面相关的东西。
必威 2

说明:

  • UNNotificationExtensionCategory 触发 Extension 的 category 这里需要在注册才能有效的触发 字符串类型
  • UNNotificationExtensionInitialContentSizeRatio 上图黄色区域的长宽比,float 类型
  • UNNotificationExtensionDefaultContentHidden 默认内容是否隐藏,Bool 类型

ios 10之前

在ios之前,iOS推送分为Local Notifications(本地推送) 和 Remote Notifications(远程推送)。

1.用户点击横幅进入 APP,且 APP 进程没有开启(APP 是死掉的)。

在这种情况下,方法一、方法二、方法五都可以获取到推送内容。特别注意,方法五也会执行的!此外,方法五只在 iOS9以后有效。因此,当在 iOS8的情况下,在方法二中处理推送。iOS9以后就在方法五中处理推送。执行代码的时候加一个判断就可以了。

如果是新手想测试推送的内容格式,可以在显示主窗口后添加以下代码:

 [self.window makeKeyAndVisible];
 if (launchOptions) {
        NSLog(@"%@",launchOptions);
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 300, 500)];
        label.numberOfLines = 0;
        label.lineBreakMode = NSLineBreakByCharWrapping;
        label.text = [NSString stringWithFormat:@"%@", launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]];
        label.backgroundColor = [[UIColor grayColor] colorWithAlphaComponent:0.5];
        [self.window addSubview:label];        
    }

当你收到推送后点击横幅进入 app 会给程序主窗口上加一个 label,显示出推送的内容,这个在调试的时候是很方便的。
当你获取到推送内容后,你就可以进行相应的处理,比如跳转到相应的界面。处理的时候需要注意一下(曾经遇到过坑),如下:

 if (launchOptions) {
           // 在launchOptions有值的情况下,必须得判断 app 是通过什么方式进入的,有可能是经过其他 app 打开的,也有可能是点击推送打开的,如果不做判断就会出错。
        if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
           // 这里是有推送内容的处理             

        } else if (launchOptions[UIApplicationLaunchOptionsSourceApplicationKey]) {
           // 这里是通过其他 app 进入

        }
    }

接收本地通知需要实现,这里需要注意的是,只有当APP在前台或者APP通过点击通知栏消息被唤醒时,才会执行这个方法:

必威 3图1 红色部分是 APNs 推送,蓝色部分是 JPush 应用内推送首先呢,需要一个配置好的工程,详见极光推送官方文档,或者直接下载现有工程。

基本配置

条件:新建一个对应你bundle的push 证书,打开Push Notifications 开关(XCode7不打开也可以正常使用,XCode8以后必须打开)。
必威 4

必威 5

代码实现:
注册接受APNs通知。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
        // 1.注册UserNotification,以获取推送通知的权限
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
        [application registerUserNotificationSettings:settings];

        // 2.注册远程推送
        [application registerForRemoteNotifications];
    } else {
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    }
    return YES;
}

调用AppDelegate方法,获取到用户的deviceToken。

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // <32e7cf5f 8af9a8d4 2a3aaa76 7f3e9f8e 1f7ea8ff 39f50a2a e383528d 7ee9a4ea>
    // <32e7cf5f 8af9a8d4 2a3aaa76 7f3e9f8e 1f7ea8ff 39f50a2a e383528d 7ee9a4ea>
    NSLog(@"%@", deviceToken.description);
}

推送通知,和本地通知一样有两种状况。

// 当接受到远程退职时会执行该方法(当进入前台或者应用程序在前台)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"%@", userInfo);

    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(100, 100, 100, 100);
    [self.window.rootViewController.view addSubview:redView];
}

苹果建议使用方法

/*
 1.开启后台模式
 2.调用completionHandler,告诉系统你现在是否有新的数据更新
 3.userInfo添加一个字段:"content-available" : "1" : 只要添加了该字段,接受到通知都会在后台运行
 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"%@", userInfo);
    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(100, 100, 100, 100);
    [self.window.rootViewController.view addSubview:redView];

    completionHandler(UIBackgroundFetchResultNewData);
}

必威 6

因为现在几乎没有适配 iOS7的情况了(即使有也不考虑了),现在我们大多数都适配到 iOS8,所以当你看到方法六后,直接忽略掉,从你的代码里果断删除。

[UIApplication sharedApplication].applicationIconBadgeNumber = 1;[UIApplication sharedApplication].applicationIconBadgeNumber = 0;

通知:简单场景下的通知,用户可以不写一行代码,而完全由 SDK 来负责默认的效果展示,以及默认用户点击时打开应用的主界面。自定义消息:SDK 不会把自定义消息展示到通知栏。所以调试时,需要到日志里才可以看到服务器端推送的自定义消息。自定义消息一定要由开发者写 接收推送消息Receiver 来处理收到的消息。

前言

在去年的苹果大会上,苹果带来的iOS 10 系统中将之前繁杂的推送通知统一成UserNotifications.framework 来集中管理和使用通知功能,还增加一些实用的功能——撤回单条通知、更新已展示通知、中途修改通知内容、在通知中显示多媒体资源、自定义UI等功能。
那么在ios10之前,ios的消息推送是怎么分类的呢?

通知界面

必威 7

现在网上关于推送的文章不计其数,大多数很陈旧,用起来不知所措,本文就集成了极光推送的情况捋一遍常用的几个方法。
首先列举出我们经常在网上看到的几个方法:

如果需要移除通知栏消息,则将上面的方法替换为以下方法:

- application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(UIBackgroundFetchResult))completionHandler { // 取得 APNs 标准信息内容 NSDictionary *aps = [userInfo valueForKey:@"aps"]; NSString *content = [aps valueForKey:@"alert"]; // 推送显示的内容 NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; // badge数量 NSString *sound = [aps valueForKey:@"sound"]; // 播放的声音 // 取得Extras字段内容 NSString *customizeField1 = [userInfo valueForKey:@"customizeExtras"]; // 服务端中Extras字段,key是自己定义的 NSLog(@"nAppDelegate:ncontent =[%@], badge=[%ld], sound=[%@], customize field =[%@]",content,badge,sound,customizeField1); // Required [JPUSHService handleRemoteNotification:userInfo]; completionHandler(UIBackgroundFetchResultNewData);}

图2 注:Badge参数为icon的角标

图2 注:Badge参数为icon的角标

下面我们来分析收到推送后的几种情况:

参考Demo实现本地通知只需要三步:

自定义消息只有APP在前台时才能接收到,如果APP在后台或者关闭状态,我猜测极光是将消息作为离线消息存储了起来,当APP被唤醒时,再进行推送。在接收到自定义消息需要进行操作的页面注册通知:

app后台运行

必威 8
这时候我们只需要调用下AppDelegate方法即可。代码实现

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    // 跳转逻辑
    if (application.applicationState == UIApplicationStateActive) return;

    if (application.applicationState == UIApplicationStateInactive) {
        // 当应用在后台收到本地通知时执行的跳转代码
        [self jumpToSession];
    }

    NSLog(@"local notifacation %@", notification);
}

- (void)jumpToSession
{
    UILabel *redView = [[UILabel alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.frame = CGRectMake(0, 100, 300, 400);
    redView.numberOfLines = 0;
    // redView.text = [NSString stringWithFormat:@"%@", launchOptions];
    [self.window.rootViewController.view addSubview:redView];
}

方式二:

这种方式默认在通过点击icon使app进入前台时不做操作。
当通过点击通知栏来启动或唤醒APP时,会调用didReceiveRemoteNotification:方法,接收到的推送内容包含在userInfo参数里,可以在此方法里对推送消息进行操作:

/** APP已经接收到“远程”通知(推送) - 透传推送消息  */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {

    // 当APP处于后台或者关闭状态,点击通知栏就会先走这个方法,再使得个推SDK收到透传消息回调
    // 处理APNs代码,通过userInfo可以取到推送的信息(包括内容,角标,自定义参数等)。如果需要弹窗等其他操作,则需要自行编码。
    NSLog(@"n>>>APP已经接收到“远程”通知(推送)[Receive RemoteNotification - Background Fetch]:%@nn",userInfo);
    completionHandler(UIBackgroundFetchResultNewData);

    // app是通过点击通知栏进入前台
    [[NSNotificationCenter defaultCenter] postNotificationName:kNOTIFICATION_PUSH object:nil userInfo:@{kNOTIFICATION_PUSH : payloadMsg}];
}

同时,由于系统方法调用完成后,个推仍会调用一次GeTuiSdkDidReceivePayloadData:方法,需要在GeTuiSdkDidReceivePayloadData:方法里判断当前消息是否为offLine离线消息,如果是离线消息则不做任何处理:

/** SDK收到透传消息回调 */
- (void)GeTuiSdkDidReceivePayloadData:(NSData *)payloadData andTaskId:(NSString *)taskId andMsgId:(NSString *)msgId andOffLine:(BOOL)offLine fromGtAppId:(NSString *)appId {

    // 收到个推消息
    NSString *payloadMsg = nil;
    if (payloadData) {

        payloadMsg = [[NSString alloc] initWithBytes:payloadData.bytes
                                              length:payloadData.length
                                            encoding:NSUTF8StringEncoding];
    }

    // 当app在前台时,接收到的推送消息offLine值均为NO
    // 对于离线消息,这里不做操作
    if (!offLine) {

        // app已经处于前台,提示框提示
        [[NSNotificationCenter defaultCenter] postNotificationName:kNOTIFICATION_ALERT object:nil userInfo:@{kNOTIFICATION_ALERT : payloadMsg}];
    }
}

对于角标的处理可以参考方式一中的处理方法。

 

 前言 在去年的苹果大会上,苹果带来的iOS 10 系统中将之前繁杂的推送通知统一成UserNotifications.framework 来集中管理和使用通知功能,还增加一些实用的功能——撤回单条通知、更新已展示通知、中途修改通知内容、在通知中显示多媒体资源、自定义UI等功能。

4.App处于前台

这种情况下会触发方法四。可以在方法四中处理。

以上就是在集成极光推送的情况下对各种方法执行情况的梳理。

TAG标签:
版权声明:本文由必威发布于必威-编程,转载请注明出处:现在我们大多数都适配到必威:,现有工程