具体使用,能够查看官网的,文档地址 https://github.com/Carthage/Carthage。若是看不懂英文,能够看一下官文的翻译:https://www.jianshu.com/p/e0c0ceee8ab2 。html
为何使用Carthage,具体对比CocoaPods有什么优点,还有安装过程,请都参照官网的操做。ios
在已有的工程上,新建一个Target。项目-> File -> New -> Target , 选择Framework ,命名为 CarthageTestgit
他会自带一个CarthageTestSDK.h的文件,这个文件的做用是告诉其余人咱们引用了哪些头文件,咱们不要它自动生成的文件,删除CarthageTestSDK.hgithub
改成和项目工程同样的支持版本,我这边是8.0。 必定要注意这里,要否则,编译会报错,当编译不报错时,低版本的系统会安装不了。报错相似:shell
ERROR: Install failed. Got error "ApplicationVerificationFailed" with code 0xe8008019: Failed to verify code signature of /private/var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.xY9xAg/extracted/Payload/Spec.app/Frameworks/MGLiveDetect.framework : 0xe8008019 (The application does not have a valid signature.)Build step 'Execute shell' marked build as failureFinished: FAILUREapp
不须要更改能够直接忽略。项目Target -> Build Setting -> Product Module Name/Produce Name ,改为 CarthageTestSDK框架
-all_load
-fembed-bitcode
以上都不须要,能够忽略这一步,跳到第5步。测试
选择 Manager Schemes,给CarthageTestSDK勾上sharedui
到这里,基本上你已经成功了,那么咱们来验证一下,咱们cd到项目文件夹,运行spa
$ carthage build --no-skip-current
命令运行完成后,你会发现你的项目文件夹里面多了一个Carthage文件夹
Carthage->Build->iOS->CarthageTestSDK.framework
这个就是咱们须要的framework了,那么接下来,咱们在本地验证一下。
target->Build Phases ->左上角+号 ->New Copy Files Phase 而后在Copy Files下 Destination选择Frameworks ->添加你本身的动态库
咱们首先编译一下,没报错,导入头文件,正常输出,编译成功。验证成功。
将代码上传到git上面,Carthage -> Build 目录是不须要上传的。
git tag 0.1.0 git push --tags
至此你的库以及支持 Carthage 了,可让其余开发者使用 Carthage 来管理你的项目依赖了。
一、先进入到项目全部的文件夹
$ cd 项目路径
二、建立一个空的Carthage文件
$ touch Cartfile
三、编辑cartfile文件,添加要依赖的框架
github "https://github.com/AFNetworking/AFNetworking"
指定版本能够这样
github "https://github.com/AFNetworking/AFNetworking" ~> 1.1.9
四、保存并关闭cartfile文件,进行安装
$ carthage update --no-use-binaries --platform ios
--platform ios :限定只有iOS平台
安装完以后根目录会出现一个叫Carthage的文件夹,里面包含Build和Checkouts两个文件夹。
Build:iOS路径下的就是framework包,须要自行引用进来。
Checkouts:是从Github上获取来的源码,因此理论上来讲你在这个文件夹里对源码进行任何的修改,再次执行 carthage build 就会根据这里的源码打包出相应的framework出来。但须要注意的是当每次执行carthage update后这里的源码又被覆盖了。因此你有特别须要修改的地方能够加例外防止覆盖!!!! 重要
五、项目Target -> Build Setting -> Search Paths -> Framework Search Paths添加。这一步,感受【carthage update】以后,默认会有了,有的话跳到第6步。
$(PROJECT_DIR)/Carthage/Build/iOS
六、项目Target -> General最底下的Linked Frameworks and Libraries里手动添加【Add Other...】须要用的framework.
七、项目Target -> Build Phases -> '+' -> New Run Script Phase, 添加脚本 。这一步能够不操做,直接操做第8步;第7步和第8步只须要操做其中一步就能够了。
/usr/local/bin/Carthage copy-frameworks
同时要注意,添加【input Files】,如:$(SRCROOT)/Carthage/Build/iOS/AFNetworking.framework 。
若是不添加【input Files】,会报 dyld: Library not loaded 出错
八、【注:第7步操做了,这一步跳过】不想经过脚本而且【input Files】的方式添加路径的话,能够经过【Copy File】的方式来添加,项目Target -> Build Phases -> '+' -> New Copy File Phase, 添加Copy文件
因为动态库不会增长ipa的包大小,于是将第三方的静态库转为动态库也是颇有必要的。下面就腾讯的人脸识别SDK作验证。官网文档:https://cloud.tencent.com/document/product/655/13825。
须要SDK的话,能够直接找腾讯的相关人员拿。我拿到sdk包(iOS_OCR_SDK_V2.2.0),是能够直接跑起来,相关代码结构以下:
如下的步骤,和上面【让你的项目支持Carthage】差很少,具体配图看上面。
在已有的工程上,新建一个Target。项目-> File -> New -> Target , 选择Framework ,命名为 WBOCRFramework ,并删除建立多出来的 WBOCRFramework.h
将 WBOCRService.framework 的头文件拉出来,放在libs文件夹里面,注意,虽然是拉了出来,但文件的路径是和原来同样的。
改成和项目工程同样的支持版本,我这边是8.0。 必定要注意这里,要否则,编译会报错,当编译不报错时,低版本的系统会安装不了。报错相似:
ERROR: Install failed. Got error "ApplicationVerificationFailed" with code 0xe8008019: Failed to verify code signature of /private/var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.xY9xAg/extracted/Payload/Spec.app/Frameworks/MGLiveDetect.framework : 0xe8008019 (The application does not have a valid signature.)Build step 'Execute shell' marked build as failureFinished: FAILURE
不须要更改能够直接忽略。项目Target -> Build Setting -> Product Module Name/Produce Name ,改为 WBOCR
-all_load
-fembed-bitcode
选择 Manager Schemes,给WBOCRFrame勾上shared
到这里,基本上你已经成功了,那么咱们来验证一下,咱们cd到项目文件夹,运行
$ carthage build --no-skip-current
可是,咱们发现,报错了。在终端上,会告诉咱们,报错的日志输出在哪里
接下来,咱们前往报错的日志,经过查看日志,是由于librecdetect.a文件须要支持Bitcode。
最简单的解决方法,就是开启BitCode,以下图:
命令运行完成后,你会发现你的项目文件夹里面多了一个Carthage文件夹,这个就是咱们须要的framework了,那么接下来,咱们在本地验证一下。参照上面【让你的项目支持Carthage】的步骤。
使用动态库跑起来以后,咱们发现,界面的图片资源不见了,咱们在打动态库的时候,明明已经加了WBOCRService.bundle。经过代码验证分析,原来是SDK加载图片,写死了是从根目录读取,写法如:
但咱们打包成动态库以后,Bundle文件已经不在根目录了,根本就找不到。
经过查资料,参照一下github上的开源库MJRefresh(https://github.com/CoderMJLee/MJRefresh)的写法,先读取存在类的Bundle路径,再找到图片的路径。这样,无论封装多少层,bundle图片资源都不会丢失。
咱们能够写在一个NSBundle的分类里,写法以下:
目前,经过和腾讯的人沟通,资源包的问题已经解决,解决方案以下:
SDK里面对资源bundle加了一个判断:
1. main bundle 下是否存在WBOCRService.bundle,存在就直接使用
2. 若是1找不到,就会到SDK可执行文件对应的目录下面去找WBOCRService.bundle
若是是动态库集成,资源就会位于第二个位置,可是要注意的是,在作动态库的时候,必定要把资源bundle加进去
dyld: Library not loaded: @rpath/CarthageTestSDK.framework/CarthageTestSDK
Referenced from: /Users/vipshop/Library/Developer/CoreSimulator/Devices/948C970C-2338-4BCB-A62D-E28A71C7A47B/data/Containers/Bundle/Application/AB8C53FC-9779-44EA-8E23-23E1E63C6E89/PodTest.app/PodTest
Reason: image not found
注意,Copy File 默认是Resources,须要改成framework
参考:
https://www.jianshu.com/p/7a0634e14332
https://www.jianshu.com/p/bf263c596538
https://www.jianshu.com/p/52dff4cef8a2
https://www.jianshu.com/p/6802eeb3efe7