iOS推送AppDelegate跳转任意VC

在开发项目中,会有这样变态的需求:

推送:根据服务端推送过来的数据规则,跳转到对应的控制器

feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦,可能是这个又可能是那个,能给我做灵活吗?根据后台返回规则任意跳转?)

思考:wocao!这变态的需求,要拒绝他吗?

switch判断呗,考虑所有跳转的因素?这不得写死我...

switch () {

case :

break;

default:

break;

}

我是这么个实现的(runtime是个好东西)

利用runtime动态生成对象、属性、方法这特性,我们可以先跟服务端商量好,定义跳转规则,比如要跳转到A控制器,需要传属性id、type,那么服务端返回字典给我,里面有控制器名,两个属性名跟属性值,客户端就可以根据控制器名生成对象,再用kvc给对象赋值,这样就搞定了 ---O(∩_∩)O哈哈哈

比如:根据推送规则跳转对应界面FirstViewController

FirstViewController.h:

进入该界面需要传的属性

@interface FirstViewController : UIViewController

// 注:根据下面的两个属性,可以从服务器获取对应的频道列表数据

/** 频道ID */

@property (nonatomic, copy) NSString *ID;

/** 频道type */

@property (nonatomic, copy) NSString *type;

@end

AppDelegate.m:

推送过来的消息规则

// 这个规则肯定事先跟服务端沟通好,跳转对应的界面需要对应的参数

NSDictionary *userInfo = @{

@"class": @"FirstViewController",

@"property": @{

@"ID": @"123",

@"type": @"12"

}

};

接收推送消息

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

{

[self push:userInfo];

}

跳转界面

- (void)push:(NSDictionary *)params

{

// 类名

NSString *class =[NSString stringWithFormat:@"%@", params[@"class"]];

const char *className = [class cStringUsingEncoding:NSASCIIStringEncoding];

// 从一个字串返回一个类

Class newClass = objc_getClass(className);

if (!newClass)

{

// 创建一个类

Class superClass = [NSObject class];

newClass = objc_allocateClassPair(superClass, className, 0);

// 注册你创建的这个类

objc_registerClassPair(newClass);

}

// 创建对象

id instance = [[newClass alloc] init];

// 对该对象赋值属性

NSDictionary * propertys = params[@"property"];

[propertys enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

// 检测这个对象是否存在该属性

if ([self checkIsExistPropertyWithInstance:instance verifyPropertyName:key]) {

// 利用kvc赋值

[instance setValue:obj forKey:key];

}

}];

// 获取导航控制器

UITabBarController *tabVC = (UITabBarController *)self.window.rootViewController;

UINavigationController *pushClassStance = (UINavigationController *)tabVC.viewControllers[tabVC.selectedIndex];

// 跳转到对应的控制器

[pushClassStance pushViewController:instance animated:YES];

}

检测对象是否存在该属性

- (BOOL)checkIsExistPropertyWithInstance:(id)instance verifyPropertyName:(NSString *)verifyPropertyName

{

unsigned int outCount, i;

// 获取对象里的属性列表

objc_property_t * properties = class_copyPropertyList([instance

class], &outCount);

for (i = 0; i < outCount; i++) {

objc_property_t property =properties[i];

// 属性名转成字符串

NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];

// 判断该属性是否存在

if ([propertyName isEqualToString:verifyPropertyName]) {

free(properties);

return YES;

}

}

free(properties);

return NO;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 16:08:56

iOS推送AppDelegate跳转任意VC的相关文章

phonegap + 极光推送 + 页面跳转 (ios)

安卓的解决办法请参见这里:安卓解决办法 ios如果没有页面跳转的需求的话就使用极光推送,如果有页面跳转如果用了极光推送就只有用oc去写,但是我不会oc,所以智能放弃极光选用ios自己的apns来实现 新建项目跟安卓创建项目差不多,新建完成后就是初始话phonegap,注意在phonegap.local.properties文件中phonegap.platform设置为ios cmd移动到新建的项目的phonegap的文件夹下面安装插件: phonegap local plugin add htt

教你做IOS推送 包会!

最近在研究iOS的推送问题,遇到了一些问题,最终整理了一下,放在这里和大家分享. APNS的推送机制 首先我们看一下苹果官方给出的对iOS推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器. 上图可以分为三个阶段: 第一阶段:应用程序的服务器端把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相

手把手教你做iOS推送

最近在研究iOS的推送问题,遇到了一些问题,最终整理了一下,放在这里和大家分享. APNS的推送机制 首先我们看一下苹果官方给出的对iOS推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器. 上图可以分为三个阶段: 第一阶段:应用程序的服务器端把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相

iOS推送之远程推送

最近公司项目升级重构(重写),除了本来我所负责的模块,最后临危受命接了推送(远程和本地)相关的模块,顺便把推送的相关知识复习了一遍.后期连续工作十几天加上最后一天的通(瞎)宵(熬)达(一)旦(夜),也算是不辱使命.此文除了讲解远程推送相关的基本知识外,也会涉及一些推送相关的奇淫技巧.另外本文主要讲解远程推送,后续会出一篇iOS推送之本地推送(iOS Notification Of Local Notification)的姊妹篇. 此篇文章的逻辑如下图所示: 图0-0 此篇文章的逻辑图 远程推送原

一步一步教你做ios推送

最近在研究ios的推送问题,遇到了一些问题,最终整理了一下.放在这里和大家分享 APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器. 上图可以分为三个阶段: 第一阶段:应用程序的服务器端把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应

[转]手把手教你做iOS推送

最近在研究iOS的推送问题,遇到了一些问题,最终整理了一下,放在这里和大家分享. APNS的推送机制 首先我们看一下苹果官方给出的对iOS推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器. 上图可以分为三个阶段: 第一阶段:应用程序的服务器端把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相

iOS推送小结

iOS推送小结 (吐槽,md的代码编辑功能不知道是不会用还是确实不好用) 1.推送配置 1.1证书配置 请自行谷百. 1.2注册推送 //代码来源:环信Demo //In method application:(UIApplication *)application didFinishLaunchingWithOptions: UIApplication *application = [UIApplication sharedApplication]; //注册APNS if([applicat

iOS 推送通知流程

别的不说,现在AppDelegate.m中添加以下代码块 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     // 将这行代码插入     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationT

phonegap+极光推送+页面跳转

最近公司使用sencha touch开发app需要实现推送的功能,本渣花了一周的时间才把安卓和ios都实现了推送已经跳转页面的功能.晚上关于推送的资料很少,关于推送后页面跳转的资料就更少了,所以这里记录一下怕以后忘了. 首先是安卓的实现方式(首先需要在极光推送上面去注册一个账号): 1:用sencha CMD创建st应用: sencha -sdk D:\java\sencha-touch\touch-2.3.1 generate app FirstApp ../FirstApp 这样就生成了一个