博客> Xcode8/iOS 10 Frameworke开发及注意事项
Xcode8/iOS 10 Frameworke开发及注意事项
2019-12-12 10:00 评论:0 阅读:1152 老白爱学习
ios Frameworke

1.创建Frameworke工程以后,在工程里只会生成一个对应的.h文件.接下来我们就会在这个工程中添加我们自己的代码.比如:我创建了一个DemoTool的工具类.分别在DemoTool.h中添加一个类方法: +(NSInteger)resultWithNumber1:(NSInteger)number1 number2:(NSInteger)number2 然后在DemoTool.m中实现该方法: +(NSInteger)resultWithNumber1:(NSInteger)number1 number2:(NSInteger)number2 { return number1 + number2; } 这样一个简单的工具类就实现了.然后就把DemoTool.h添加到对应的Frameworke.h中.

  1. 添加新的头文件不会默认导入的公开的头文件中,这时需要我们选择蓝色工程→TARGETS→ Build Phases → Header → 将Project中的头文件拖到Public中.  Snip20170209_3.png

3.因为我们创建的Frameworke默认的是动态库,如果第三方程序直接使用就会造成崩溃.所以我们要将动态库设置为静态库.同样我们点击蓝色工程 →TARGETS→ Build Settings → 搜索Mach → 查看Mach-O Type(编译类型) → 将Dynamcic改成Static 重新编译就会生成静态库.  Snip20170209_6.png

4.切换release模式.在工程的product中选中scheme,在选择Edit scheme 中将Build Configuration中将Debug改成release模式.原因是Debug状态,系统本身会有一些调试代码,或者自己添加的调试代码.Release会省去一些代码,包会变小,速度更快.当然对于用户来说没有明显的感受.

 Snip20170209_7.png

5.接下来使用模拟器和真机各编译一次,就会生成对应的模拟器的和真机的Frameworke.  Snip20170209_9.png 可以再工程中Products中找到直接show in Finder.  Snip20170209_10.png

此时在终端中可以输入 lipo –info (路径)/文件名 查看静态库架构.比如可以直接在终端输入lipo –info 然后直接在DemoFrameworke.frameok中找到文件DemoFrameworke拖到终端即可.

模拟器此时会出现2个架构:i386 / x86_64.真机此时也会出现2个架构:armv7 / arm64. 如果要输出armmv7s架构,那么需要点击蓝色工程 → Build Settings → Architecture(设置输出的架构类型) → 手动添加”armv7s”.在执行编译,就会出现真机3各架构. (架构分类: 模拟器: i386 iPhon5 及以下 | x86_64 iPhone 5S及以后 真机: arvm7 iPhone4S及以下 | armv7s iPhone5/5C | arm64 iPhone 5S及以后 armv7s: 只出现了一代, 是一个失败的架构. 已经被废弃. 2014年10月份. Xcode版本更新中, 取消了默认输出7s架构.) 6.当然我们写出的Frameworke既能支持真机也能支付模拟器的全部类型.所以我们要将模拟器和真机的架构进行合并.同样我们会用到终端指令: lipo -create 静态库1名称 静态库2名称 -output 新静态库名称(和前面的名字要保持一致).

首先,进入路径(请使用你的项目路径). 列如:  Snip20170209_13.png

接下来是合并生成新的架构. 例如 :lipo -create Release-iphoneos/DemoFramework.framework/DemoFramework Release-iphonesimulator/DemoFramework.framework/DemoFramework -output DemoFramework  Snip20170209_14.png

这时就会生成一个合并后的静态库无后缀文件: DemoFrameworke,将这个文件直接拖到真机的Frameworke中替换以前这个文件中的DemoFrameworke.  Snip20170209_16.png

到这一步我们的这个Frameworke就可以在其他的程序中使用了.

我们可以新建一个项目然后可以直接把上面创建好的Frameworke拖到项目中,然后在需要使用到的文件中添加头文件: import<静态库名/头文件名>. 如: #import

然后在我们想要添加代码的地方引用到我们Frameworke中的方法.列如:我们上边那个非常牛逼的算法,可以在对应的地方这么写 list text here -(void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event{

NSLog(@"sum = %zd",[DemoTool sumNum1:200 num2:300]); //标红的这段代码就是我们Frameworke中的方法.

} 启动程序,点击屏幕就能得到我们想要的结果.

7.关于资源包的问题.我们编写Frameworke避免不了需要使用到本地的image.这是我们就涉及到资源包的问题.因为在Frameworke引用到别的项目中,文件路径就会发生变化,放在Bundle路径中更明确. 资源打包之后, 默认都会出现在主Bundle下. --> 如果文件重名了, 会被覆盖 如果有资源, 一定要放到.bundle目录下. 静态库在编写代码的时候, 也需要注意, 资源在写名字的时候, 要拼上bundle名.  Snip20170209_8.png Bundle是一个实体文件夹. 因此. 图片如果不在mainBundle里. 则一定要拼接路径" DemoBundle.bundle/1.jpeg" 当然Bundle包是一个单独的包,所以在使用Frameworke时将Bundel包和Frameworke包一同拖到项目中使用. 比如在DemoTool.h中添加一个方法:

  • (UIImage )imageWithBundle; 然后在.m中实现 +(UIImage )imageWithBundle{ return [UIImage imageNamed:@"DemoBundle.bundle/1.jpeg"]; } 打包同上,然后在新的项目中直接使用该方法就可以获取到资源包中的图片: -(void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event{ self.imagesView.image = [DemoTool imageWithBundle]; }
收藏
1
sina weixin mail 回到顶部