美文网首页
如何优雅的提供第三方库Framewrok

如何优雅的提供第三方库Framewrok

作者: 破晓霜林 | 来源:发表于2019-05-28 20:58 被阅读0次

导语

在平时的工作和生活中,我们经常会有这么一些情境,需要将自己代码提供给第三方使用,而又不想公开源码。这个时候我们就需要,打包成Framework并且优雅地采用cocoapods的方式提供给别人。

首先学习一些基础知识

关于XcodeBuild

1. 1.基本命令

查看xcodebuild简洁用法

xcodebuild -usage

查看已安装的SDK

xcodebuild -showsdks

查看安装的版本号

xcodebuild -version
[-sdk [<sdkfullpath>|<sdkname>] [<infoitem>] ]

查看项目中的Targets、Configurations和Schemes

xcodebuild
-list
[[-project <projectname>]|[-workspace <workspacename>]] 

Archive

xcodebuild
archive -archivePath <archivePath>
-project <projectName>
-scheme <schemeName> #从-list命令中获取
-configuration < Debug|Release>
-sdk <sdkName> #sdkName可从showsdks命令中获取

导出Archive

xcodebuild
-exportArchive
-archivePath <xcarchivepath>
-exportPath <destinationpath>
-exportOptionsPlist <plistpath>#这个plist文件可以通过打一次ipa包里面去获取,然后根据需求修改

查看帮助

xcodebuild -help

等等

如何自动化完成framework输出

1、新建一个工程,在进入页面之后,选择Framework & Libray 选项中的 Cocoa Touch Framework.


image.png

2、因为要打包所需的文件,所以这里我自己创建了SLCat.h,SLCat.m文件,并且添加对应的saySomething方法。


image.png

3、然后选中Target,选中Build Phases -> Headers,可以看出有三个选项,分别是Public,Private,Project;把需要暴露给别人的.h文件拖到Public中,剩下的不要暴露的,即为隐藏的文件,放在Project中。一般新建 Cocoa Touch Framework之后就会自动出现一个FrameworkTest.h,我们一般可以考虑直接把对应的对应Framework里面用到的内容添加进去,这样就只需要暴露FrameworkTest.h,当然为了测试更加方便,那么我们这里把SLCat.h也对外暴露。


image.png

4、此时可以看下生成的Framework


image.png

如果正确的话生成的Framework如下:


image.png

5、修改一些配置信息,生成支持所有架构的版本
修改build setting 里面的build active architecture only 如图片所示的把Yes修改为NO
如果直接通过Debug生成Framework需要把这个改成NO,否者生成的Framework只会是支持当前的机型,比如笔者这里使用的是iphoneX所以生成的就仅仅是 arm64的Framework包。

image.png
将上诉的包通过lipo --info查看下可以清楚的看到
image.png
当然后续笔者会介绍通过脚本的方式,优雅的生成Framework.

在build setting 里面搜索 “mach”,设置type为 “static library” , 由于苹果默认是不支持第三方库为动态库,而且提供给别人用最好采用静态库。如下图


image.png

如果采用动态库,别人引入的时候,还需要在下面设置中添加,否者会出现: image not found之类的错误。


image.png

重新运行之后,可以看到如下信息:


image.png

6、然后分别用模拟器和真机进行CMD+B进行编译


image.png

7、把两个Framework的包合并成一个包
采用命令如下,由于要介绍更优雅的方法

lipo -create 路径a 路径b -output 路径a

脚本化的形式自动生成Framework

1、首先点击如下新建一个 Aggregate


image.png image.png

2、之后 build phases的增加运行脚本
既然使用脚本为什么不直接写shell而要在这里新建呢? 2个方向的考虑,第一、外面写shell需要配置对应的描述文件之类的,否者会找不到。第二、工程内的路径,在这里面是可以直接拿到的。


image.png

在里面增加如下代码来完成对应的脚本


image.png
文字版如下:
# Type a script or drag a script file from your workspace to insert its path.
framework_name=${PROJECT_NAME}
development_mode=Release
scheme_name=${PROJECT_NAME}
work_space=${PROJECT_NAME}.xcworkspace
install_dir=${SRCROOT}/Products/${framework_name}.framework
work_dir=build

device_dir=${work_dir}/Release-iphoneos/${framework_name}.framework
simulator_dir=${work_dir}/Release-iphonesimulator/${framework_name}.framework

framwork_temp=Framework
if [ ! -d "${framwork_temp}" ]
then
mkdir -p "${framwork_temp}"
fi
device_temp_dir=${framwork_temp}/${framework_name}.framework

if [ -d "${install_dir}" ]
then
rm -rf "${install_dir}"
fi

xcodebuild -configuration "Release" -target "${framework_name}" -sdk iphoneos clean build
# 注意重新编译会先清空对应的目录,所以这里需要先缓存下第一个结果
cp -R "${device_dir}/" "${device_temp_dir}"

lipo -create "${device_temp_dir}/${framework_name}" "${simulator_dir}/${framework_name}" -output "${install_dir}/${framework_name}"


xcodebuild -configuration "Release" -target "${framework_name}" -sdk iphonesimulator  clean build

mkdir -p "${install_dir}"
cp -R "${device_temp_dir}/" "${install_dir}"

lipo -create "${device_temp_dir}/${framework_name}" "${simulator_dir}/${framework_name}" -output "${install_dir}/${framework_name}"

rm -r "${work_dir}"
rm -r "${framwork_temp}"
open "${install_dir}"

当然网上会有很多类似的写法。笔者发现新版的Xcode在第二次xcodebuild的时候会把build文件清空,所以这里用了Framework来临时缓存第一个结果。

3、运行FrameworkAuto等到如下
如果需要输出两个包,请注意连接一个真机,运行如下:


image.png

4、经历了一番辛苦可以看到如下


image.png

5、 再用lipo验证下如下, 大功告成


image.png

FAQ

如果我代码中依赖于第三方库怎么办

采用pod新建workspace,然后通过类似的方法完成打包

提供了framewrok如何更优雅的提供给别人使用

才用pod的方式,也方便自己进行版本维护

参考的文档和链接

关于xcode8的建立依赖其他第三方库(cocoapods管理)的静态库framework
iOS开发:自定义framework并打包
xcodebuild命令介绍
iOS 比较详细的自定义framework编译方法

相关文章

  • 如何优雅的提供第三方库Framewrok

    导语 在平时的工作和生活中,我们经常会有这么一些情境,需要将自己代码提供给第三方使用,而又不想公开源码。这个时候我...

  • Spring Boot Mongo (一)

    前言 Spring Data Spring MongoDB 与Spring Framewrok 提供的 JDBC ...

  • Retrofit+RxBus事件流顶层封装Core库

    一、如何优雅的使用Retrofit网络请求库? 众所周知,Retrofit+OkHttp给我们开发者的网络请求提供...

  • Python 第三方库安装技巧

    Python 是一门优雅的语言,简洁的语法,强大的功能。当然丰富的第三方库,更能加速开发。那么问题来了,如何安装这...

  • 安卓四大组件之ContentProvider

    ContentProvider 是如何实现数据共享 把自己数据库的数据提供给第三方应用,我们就通过ContentP...

  • VS2012 使用QCustomPlot等三方库如何配置

    前言 Qt提供了显式和隐式导入第三方库方法,本文只介绍显示导入方法。 一般的第三方提供的库文件包括ControlC...

  • Typescript面试题(一)

    一、缺点: 需要长时间来编译代码。 在使用第三方库时,需要有第三方库的定义文件,并不是所有第三方库都提供了定义文件...

  • locust性能

    一、安装Locust 安装Locust之前先安装的库: gevent库:第三方库,gevent为python提供了...

  • Android NDK开发-问题汇总

    第三方动态库32位、64位不兼容 如果第三方库只提供了armeabi-v7a的库,则运行在64位机器上会找不到库。...

  • cocoapods相关

    使用cocoapods管理第三方库时,如何查看本地项目使用第三方库的版本。这里查看的是目前使用的第三方库的版本,而...

网友评论

      本文标题:如何优雅的提供第三方库Framewrok

      本文链接:https://www.haomeiwen.com/subject/nfgwzqtx.html