测试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
- {
- /*
- *初始化第一个controller
- TheFirstViewController继承于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];
- //保存NSBundle
- firstCon.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,并调用上面提到的动态库入口方法和传递参数
(此项目在界面上添加了一个简单的按钮,点击按钮来进入动态库)
- -(void)testFramework
- {
- NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
- NSString *documentDirectory = nil;
- if ([paths count] != 0)
- documentDirectory = [paths objectAtIndex:0];
- //拼接我们放到document中的framework路径
- NSString *libName = @"PacteraFramework.framework";
- NSString *destLibPath = [documentDirectory stringByAppendingPathComponent:libName];
- //判断一下有没有这个文件的存在 如果没有直接跳出
- NSFileManager *manager = [NSFileManager defaultManager];
- if (![manager fileExistsAtPath:destLibPath]) {
- NSLog(@"There isn't have the file");
- return;
- }
- //复制到程序中
- NSError *error = nil;
- //加载方式一:使用dlopen加载动态库的形式 使用此种方法的时候注意头文件的引入
- // void* lib_handle = dlopen([destLibPath cStringUsingEncoding:NSUTF8StringEncoding], RTLD_LOCAL);
- // if (!lib_handle) {
- // NSLog(@"Unable to open library: %s\n", dlerror());
- // return;
- // }
- //加载方式一 关闭的方法
- // Close the library.
- // if (dlclose(lib_handle) != 0) {
- // NSLog(@"Unable to close library: %s\n",dlerror());
- // }
- //加载方式二:使用NSBundle加载动态库
- NSBundle *frameworkBundle = [NSBundle bundleWithPath:destLibPath];
- if (frameworkBundle && [frameworkBundle load]) {
- NSLog(@"bundle load framework success.");
- }else {
- NSLog(@"bundle load framework err:%@",error);
- return;
- }
- /*
- *通过NSClassFromString方式读取类
- *PacteraFramework 为动态库中入口类
- */
- Class pacteraClass = NSClassFromString(@"PacteraFramework");
- if (!pacteraClass) {
- NSLog(@"Unable to get TestDylib class");
- return;
- }
- /*
- *初始化方式采用下面的形式
- alloc init的形式是行不通的
- 同样,直接使用PacteraFramework类初始化也是不正确的
- *通过- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
- 方法调用入口方法(showView:withBundle:),并传递参数(withObject:self withObject:frameworkBundle)
- */
- NSObject *pacteraObject = [pacteraClass new];
- [pacteraObject performSelector:@selector(showView:withBundle:) withObject:self withObject:frameworkBundle];
- }
第六步:运行“主程序”项目到设备上,然后点击按钮进入动态库模块吧。
注意:有时候我们运行framework工程获取framework文件,内部并没有我们想要的xib文件(这个时候内部展示的为nib格式的),所以在我们每次运行此工程的时候,都需要clean
demo下载地址:点击跳转到下载页面
感谢:http://blog.csdn.net/like7xiaoben/article/details/44081257
相关推荐
适用于Connect SDK(iOS)的Amazon Fire TV模块Amazon Fire TV模块扩展了Connect SDK,以使用Fling SDK添加Amazon Fire TV和Fire TV Stick设备。 该存储库作为子模块包含在主项目中,并且需要手动设置才能编译主项目...
想使⽤Robotframework实现不同的功能,那么就要先安装与其功能对应的类库并导⼊使⽤类库。扩展库的安装⽅法与安装 python模块⼀样,使⽤pip命令即可。例如安装selenium扩展库的命令如下:pip install robotframework...
利用frameWork 动态加载项目中所需要的模块,比如Tabbar中对应的4个Item,每一个item对用一个带有视图的FrameWork
个人学习使用 - 允许用于学习、毕设等 - 允许进行商业使用,请自觉遵守使用协议 请遵守 Apache License2.0 协议 使用uniapp重构小程序端所有页面 后台使用SpringBoot重构 适配H5、IOS、Android端 接入支付宝支付 ...
Framework7-Vue-Webpack Cordova模板 您可以使用此模板完美地启动新的cordova项目。 该模板使用: 最低要求 科尔多瓦: 6.0.0 Node.js: 6.5.0 (支持ES6) 警告(对于Linux和Mac OS用户): 对于实时重载,我...
iOS手影 此代码使您可以快速,轻松地实时集成跟随应用手势的手部阴影,从而可以录制更具描述性和直观性的演示视频。... 子模块取决于并使用Real Framework选项构建。 包括在您的项目中 链接到已构建的框架。
毕设&课设&项目&实训-基于Zend Framework 1.11 研发的多模块管理系统,适合大项目,每个模块独立开发、测试、上线,低耦合 【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、...
#Samsung MultiScreen 模块用于 Connect SDK (iOS) Samsung MultiScreen 模块扩展 Connect SDK 以添加 Samsung MultiScreen SDK 支持。 此存储库作为主项目中的子模块包含在内,并且在主项目编译之前进行了一些手动...
适用于iOS SDK 3.0的AerisWeather SDK 的使开发人员可以快速,轻松地向其iOS应用程序快速添加天气内容... AerisMapKit.framework-使用Aeris Maps(AMP)API的完整的交互式天气地图解决方案。 需要AerisWeatherKit.fram
这个就是在线更新framework功能案例,源码XBServerFramework,在线更新framework,可以更新功能模块不用在AppStore更新,大家可以参考一下吧,ios源码频道。
框架中展示一个不同的模块(或模块组合)。 SwiftUI 项目 :man_technologist: 从最新、最激动人心的到最古老的。 LeetTracker - 应该对在 LeetCode 上练习算法问题的人有所帮助的应用程序。 它还没有准备好,但一般...
关于Open eCard和MOBILE-X ... 该项目的工件由模块化(在某种程度上可扩展)的库以及客户端实现(例如,桌面应用程序(richclient)和适用于Android和iOS的智能手机应用程序)组成。制作说明可以在与此源软件包捆绑在一
.zip,TinyPart is an iOS modularization framework implemented by Ojective-C. It also supports URL-routing and inter-module communication. TinyPart是一个由Objective-C编写的面向协议的iOS模块化框架,同时...
在计算机编程中,单元测试(又称为模块测试,UnitTesting)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等...
也就是说,想要使用 AllYourMemoriesAreBelong2iOS,只需要将其以动态框架的方式连接到你的应用中,构建并运行 Debug scheme。无需任何配置,无需在项目中引入任何头文件,并且库中的代码不会随你的应用的 Release ...
f selenium-herokuapp-test/pom.xml来运行特定的子模块如果您想覆盖默认运行设置,则可以使用 #This will run your test on iPhone 6 simulator mvn clean install -Dspring.profiles.active="ios" -Ddevice
magic-bottle是一套匿名社交系统,采用DDD+CQRS+Event Sourcing架构,采用了Spring Boot、Mybatis Plus、Axon Framework等核心技术,同时提供ios、andriod、web后台的开源项目。 项目特色 使用极光推送实现IM聊天; ...
作者LiuYulei001,源码BasicFramework,BasicFramework项目是一个以MVC模式搭建的开源功能集合,基于Objective-C上面进行编写,意在解决新项目对于常见功能模块 的重复开发,MobileProject对于项目的搭建也进行很...
#Connect SDK iOS ... 子模块需要AmazonFling.framework ##在您的应用程序中包含Connect SDK ###使用CocoaPods 将pod "ConnectSDK"添加到您的Podfile 运行pod install 打开工作区文件并运行您的项目 重要
Spotify for React Native 适用于Spotify SDK的react native模块注意:此存储库使用已弃用的Spotify流SDK。 我只是在此存储库上进行错误修复,实际上我没有太多时间来更新它。 其他人正在使用来使用较新的“远程” ...