iOS 友盟推送点击跳转到指定控制器(type)

今天恰好有个需求当点击推送需要跳转到指定控制器,找了很多资料,自己也想了很久没有一个极佳的办法,再经过多番试炼之后,终于找到一个不错的方法,接下来先从集成友盟推送开始:

此文章分为两部分:

1.集成友盟推送

2.点击推送跳转到指定控制器

1.1 开始:如果你没有创建应用,那么首先去创建应用吧

获得 AppKey 和 AppSecret (后面用)

1.2 接着: 到iOS集成友盟推送SDK文档中心:http://dev.umeng.com/push/ios/integration下载UMessage_Sdk_All_x.x.x.zip压缩包并解压缩

下载的压缩包中将包括以下内容:

文件名称介绍

UMessage_Sdk_Introductions.html该文件介绍如何使用【友盟+】消息推送SDK

UMessage_Sdk_ReleaseNotes.html该文件记录了【友盟+】消息推送SDK的更新日志

UMessage_Sdk_Api_Reference/该文件夹中包含了【友盟+】消息推送的API文档

UMessage_Sdk_x.x.x/该文件夹中包含了SDK的库文件

UMessage_Sdk_Demo/该文件夹中包含了示例工程

NotificatonService/iOS10的Notificaton Service

1.3 将SDK 文件拖入或者拷贝到你项目中

拖入会弹出这个窗:

拷贝:

右键添加到指定的文件夹中

3.1  引入库文件

增加UserNotifications.framework到项目中。

具体操作如下:点击项目---->TARGET---->Build Phases---->Link Binary with Libraries---->左侧+号---->搜索UserNotifications---->选中UserNotifications.framework---->点击Add

3.2  打开推送开关

点击项目---->TARGET---->Capabilities,将这里的Push Notification的开关打开


1.4 集成推送

4.1 好,前面都是准备工作,现在上代码:

进入 AppDelegate.m

引入 UMessage.h,UserNotifications.h

在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中:

UMConfigInstance.appKey = @"AppKey";

UMConfigInstance.channelId = @"App Store";

[MobClick startWithConfigure:UMConfigInstance];

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

[MobClick setAppVersion:version];

//打开日志,方便测试

[MobClick setLogEnabled:NO];

// 适配Https

[UMessage startWithAppkey:@"AppKey" launchOptions:launchOptions httpsEnable:YES];

//注册通知

[UMessage registerForRemoteNotifications];

//ios10针对

UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

center.delegate = self;

UNAuthorizationOptions types10 = UNAuthorizationOptionBadge | UNAuthorizationOptionAlert|UNAuthorizationOptionSound;

[center requestAuthorizationWithOptions:types10 completionHandler:^(BOOL granted, NSError * _Nullable error) {

if (granted){  //点击允许

NSLog(@"点击允许了");

}else{ //点击不允许

NSLog(@"点击不允许");

}

}];

//测试日志

[UMessage setLogEnabled:NO];

4.2 接收通知

//iOS10以下使用这个方法接收通知

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

// 关闭自动推送

[UMessage setAutoAlert:NO];

//统计点击数

[UMessage didReceiveRemoteNotification:userInfo];

if ([userInfo[@"type"] isEqualToString:@"workflow"]){

[[NSNotificationCenter defaultCenter] postNotificationName:@"notifyPresnetWeb" object:userInfo];

}

}

//iOS10新增:处理前台收到通知的代理方法

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {

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

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

//应用处于前台的远程推送接受

//关闭友盟自带的alert

[UMessage setAutoAlert:NO];

//必须加这句代码

[UMessage didReceiveRemoteNotification:userInfo];

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"%@",userInfo[@"aps"][@"alert"]] message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"查看", nil];

_notification = userInfo;

alert.delegate = self;

[alert show];

}else {

//应用处于前台时的本地推送接受

NSLog(@"大帅处于前台的本地的消息来了%@",[NSString stringWithFormat:@"%@",userInfo]);

}

//当应用处于前台时提示设置,需要哪个可以设置哪一个

completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionAlert);

}

这句代码不写,会报一个  completionHandler never called 错误信息

completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionAlert); 

//iOS10新增:处理后台点击通知的代理方法

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {

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

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

//应用处于后台时的远程推送接受

[UMessage didReceiveRemoteNotification:userInfo];

NSLog(@"大帅的远程推送的消息来了%@",userInfo);

if ([userInfo[@"type"] isEqualToString:@"workflow"]){

[[NSNotificationCenter defaultCenter] postNotificationName:@"notifyPresnetNotice" object:userInfo];

}

}else{

//应用处于后台时的本地推送接受

NSLog(@"小帅的本地后台推送的消息来了%@",userInfo);

}

}



2.跳转指定控制器部分

2.1 还是在 delegate.m中

// 弹窗监听方法

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

if (buttonIndex == 0) {

NSLog(@"点击取消");

}else{

if ([_notification[@"type"] isEqualToString:@"workflow"]) {

[[NSNotificationCenter defaultCenter] postNotificationName:@"notifyPresnetNotice" object:_notification];

}

[alertView dismissWithClickedButtonIndex:buttonIndex animated:YES];

NSLog(@"点击确定按钮");

}

}

2.2 在 tabBarVC.m 中接收通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(presentNotice:) name:@"notifyPresnetNotice" object:nil];

2.3 这里要借用到一个工具类

得益于http://www.jianshu.com/p/bc3c80fa5166 的作者写的工具类, 里面写的挺详细,但我根据自己实际情况汲取了一些代码

工具类在作者的GitHub: https://github.com/liu521227/PushDemo 中,可自己下载

下载后只需将工具拖入或拷贝到项目中就可以

在 tabBarVC.m 中导入头文件 #import "NSObject+Tool.h"

这时候实现你的通知方法:

// MARK: - 跳转到公告页面

- (void)presentNotice:(NSNotification *)info {

IAAnnouncementVC *announceVC = [[IAAnnouncementVC alloc]init]; // 创建你的目标控制器

announceVC.hidesBottomBarWhenPushed = YES; // 隐藏你的 tabBar

// [self currentViewController] 调用工具类的  - currentViewController 方法 获取当前控制器

会打印两次,第一次是当前控制器, 第二次是目标控制器

if (![[self currentViewController] isKindOfClass:[IAAnnouncementVC class]]) { // 这个判断防止两次执行里面代码

// 如果不想隐藏导航栏返回按钮文字就去掉这个判断

if (![[self currentViewController] isKindOfClass:[IAMessageVC class]]) {// 如果不是父控制器就进入,应领导要求,不是从父控制器(指的是正常进入目标控制器的父控制器) 就隐藏导航栏返回按钮的文字

// 隐藏导航栏返回按钮的文字

[self currentViewController].navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:self action:nil];

}else { // 这个判断是走完上面方法之后,所有返回按钮文字都隐藏了, 下面这方法可以解决这个问题

[self currentViewController].navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:[self currentViewController].title style:UIBarButtonItemStylePlain target:self action:nil];

}

// 正角来了,这个方法可以让你在任何页面都可以跳转到目标控制器, 当然返回也是进入之前的页面(爱奇艺也是这效果)

[[self currentViewController].navigationController pushViewController:announceVC animated:YES];

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容