测试Xcode版本为6.1.1
实现过程简述:把想要的作为动态更新的模块,移动到我们创建的Framework工程中,然后得到我们想要的动态库文件,把此文件再通过iTunes放到“主程序”项目的document文件夹下,从而实现从主程序中去加载此动态库,从而实现功能模块的动态更新效果。理想效果为支付宝APP,而支付宝采用的是HTML5(网页)的形式实现的,这是目前最通用的实现方式,但是不适用于复杂界面效果。
第一步:创建IOS Framework工程
第二步:生成的工程中原本的类删掉不用
然后添加新的类文件来实现动态加载效果
图片和测试界面不多说,重点为PacteraFramework这个类文件中的代码部分:
添加入口方法:
/* 主程序和此动态库的关系枢纽,也就是从“主程序”到“动态库内封装的程序”的入口方法 @param mainCon “主程序”中入口按钮所在的ViewController对象 @param bundle 此动态库在document文件中的路径,用于xib的加载和图片的加载 */-(void)showView:(id)mainCon withBundle:(NSBundle *)bundle;实现此方法:-(void)showView:(id)mainCon withBundle:(NSBundle *)bundle{/**初始化第一个controllerTheFirstViewController继承于RootViewController*这里的重点是xib文件的加载 通常我们在初始化xib的时候并不是很在意bundle:这个参数,一般情况下都会赋予nil值 其实我们所用到的图片、xib等资源文件都是在程序内部中获取的,也就是我们常用的[NSBundle mainBundle]中获取,所谓的NSBundle本质上就是一个路径,mainBundle指向的是.app下。 而如果我们不指定bundle,则会默认从.app路径下去寻找资源。 不过很显然,我们的动态库是放到“主程序”的document文件下的,所以资源文件是不可能在[NSbundle mainBundle]中获取到的,所以这里我们需要指定bundle参数,这也是传递framework的路径的意义所在*/TheFirstViewController *firstCon = [[TheFirstViewController alloc]initWithNibName:@"TheFirstViewController" bundle:bundle];//保存NSBundlefirstCon.root_bundle = bundle;//加上导航栏,并隐藏。UINavigationController *navCon = [[UINavigationController alloc]initWithRootViewController:firstCon];[navCon setNavigationBarHidden:YES];//转换传递过来的mainCon参数,实现界面跳转UIViewController *viewCon = (UIViewController *)mainCon;[viewCon presentViewController:navCon animated:YES completion:^{NSLog(@"跳转到动态更新模块成功!");}];}上面描述了xib文件的加载,下面是使用图片的注意事项:(使用RootViewController基类的代码做说明)/**注意获取图片的方式,通过路径+图片名称去获取*如果直接使用[UIImage imageNamed:@"root_top_bg.png"]方式加载是会出现问题, 因为在当前程序的路径下是找不到此图片的,图片也会被封装到framwork中*如果在xib文件中直接为某个控件添加图片的话,和平常使用一样直接添加图片名称,不会出现路径的问题*/[navImageView setImage:[UIImage imageWithContentsOfFile:[self.root_bundle pathForResource:@"root_top_bg" ofType:@"png"]]];
以上为一些frameweok工程中的注意事项,现在我们运行得到动态库文件
选择Show in Finder,取出framwork文件
第三步:创建“主程序”的项目工程
第四步:设置此工程可以通过iTunes来实现文件共享
然后通过itunes把framework放到document路径中
第五步:获取framework,并调用上面提到的动态库入口方法和传递参数
你让我尝到了每时每刻想你的疼苦,