iOS 高级篇 - 《SDK-framework篇》
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。