iOS - SDK制作iOS 开发继续加油

iOS 高级篇 - 《SDK-framework篇》

2018-03-29  本文已影响33人  baiwulong

1、先创建Cocoa Touch Framework工程
2、然后cd到工程目录,pod init,pod install,关闭工程,打开xcworkspace文件
3、添加Single View APP 类型的target,作为一个测试联调的demo
4、编写好demo,编译成功后,把Framework关联到Single View APP 类型的target中
5、demo中调入头文件,假如出现找不到头文件警告,就在setting配置中,添加$SRCROOT (recursive递归遍历选项)



创建framework

1、在Xcode中创建一个framework工程,如下图所示

创建Framework类型


创建Framework类型target

成功后截图:


工程截图

|
|

2、使用Pod工具,创建并依赖第三方库,如下图所示

pod 命令操作后

屏幕快照 2018-04-12 下午3.23.53.png
2.1、pod install ,关闭原来工程,打开xcworkspace后。
屏幕快照 2018-04-12 下午3.24.47.png
2.2、添加第三方依赖,只是为了再测试SDK时,不报错误
屏幕快照 2018-04-12 下午3.26.46.png
2.3、添加自定义类
屏幕快照 2018-04-12 下午3.28.20.png
屏幕快照 2018-04-12 下午3.28.31.png
另外,头文件需要这样方式<xxx/xxx.h>加载
屏幕快照 2018-04-12 下午3.58.05.png
SDK内部的依赖头,"xxx.h"导入就行了
屏幕快照 2018-03-29 下午4.32.20.png

|
|

3、代码编写好之后,接下来,就需要配置Framework

1、设置静态库类型和其他的一些设置
屏幕快照 2018-04-12 下午3.52.38.png
2、暴露头文件
:Users:lihua:Desktop:屏幕快照 2018-04-12 下午3.46.15.jpg
3、假如没有armv7s,就添加,另外设置Build Active Architecture Only 为NO
屏幕快照 2018-04-12 下午3.54.11.png

|
|

4、Framework关联Demo,联调开发

1、在工程中添加一个 Single View APP类型的TARGETS,我工程中命名为demoSample,如下图所示

操作步骤:选择TARGETS选项,点击底部+按钮,弹出选择TARGETS类型界面后,选择 Single View APP类型,创建就行.

选择target类型.png
成功后:
屏幕快照 2018-04-12 下午4.08.34.png
2、现在把demo工程创建好了,接下里就需要Framework关联Demo了

先编译Framework,然后得到Framework文件

屏幕快照 2018-04-12 下午4.12.16.png
右侧打钩进行关联工程
屏幕快照 2018-04-12 下午4.12.49.png
切换target回到DemoSample工程中
屏幕快照 2018-04-12 下午4.14.53.png
注意⚠️:假如出现了自定义Framework找不到头文件的话,
就在setting配置中,添加$SRCROOT (recursive递归遍历选项)
提示:然后,有事没事就记得clean一下工程,特别有时候弄Cocoapod制作时,不clean一下,一直出找不到头文件啥的
假如出现这个报错
报错:Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_AFNetworkReachabilityManager", referenced from:
      objc-class-ref in DemoFramework(testvc.o)
  "_AFStringFromNetworkReachabilityStatus", referenced from:
      ___14-[testvc test]_block_invoke in DemoFramework(testvc.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
屏幕快照 2018-04-12 下午5.55.02.png

处理:搞了好久,各种奇葩,😔,还好,最终还是处理好了,心酸
打开Pod文件,找到libAFNetworking.a,然后最右侧☑️工程,关联一下,没搞懂,反正就是这样处理好了,谁懂的给我提一下,万分感谢

屏幕快照 2018-04-12 下午5.55.55.png

追加制作Cocoapod库时遇到的问题
include of non-modular header inside framework module
依赖MBProgressHUD这个库,#import "MBProgressHUD.h"
将#import "**.h" 第三方库写在 .m文件中,而不是放在.h文件中即可

基本弄好Framework了,哈哈

屏幕快照 2018-04-12 下午6.00.45.png

接下来,就看看怎么打包合并模拟器和真机设备的包了(重要)

5、合并模拟器Framework包与真机Framework包

这下面部分是我之前工程的截图

⚠️⚠️注意事项:一点要先在模拟器编译成功,另外也需要在设备编译成功,确保得到两个包才可以操作合并,不然合并的出来的Framework包为空包,Header里面什么都没有。【之前参考网上的,这个大坑,好久没爬出去,😑】

5.1、生成一个类型为Aggregate类型的TARGETS

屏幕快照 2018-03-29 下午5.30.48.png
屏幕快照 2018-03-29 下午5.36.09.png

点击左上角+号,添加一个脚本,利用脚本合并Framework包

if [ "${ACTION}" = "build" ]

then

INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework

DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework

SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework

if [ -d "${INSTALL_DIR}" ]

then

rm -rf "${INSTALL_DIR}"

fi

mkdir -p "${INSTALL_DIR}"

cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"

#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"

lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"

#open "${DEVICE_DIR}"

open "${SRCROOT}/Products"

fi
脚本截图

5.2、选择上面创建的Aggregate类型的Target进行编译,成功后,就弹出一个Framework了😄。

注意:确保真机的包和模拟器的包都存在,不然得到的是空包。


有图有真相

感言:

操作过程中,特别烦,需要很细心,不然出了一点差错,能让人疯掉的感觉,额,出现最多的就是xxx no found等,反正暴力处理就是在search path中添加根目录$SRCROOT,设置为递归遍历recursive。

参考:https://www.jianshu.com/p/90b83e35e615

上一篇下一篇

猜你喜欢

热点阅读