需求分析:
把自己的能力封装成静态库提供给客户使用,但是有些工作市场上已经有很好的公开的代码,或者成本很低的解决方案,我们就可以使用别人公开的、或者低成本采购的技术来为我们服务。制作静态库也是一样,有时我们需要依赖已经成熟的第三方库来为我们服务。那么如何依赖第三方库制作自己的静态库.framework尼?
目标
根据之前.framework制作基础,演示依赖第三方库YYModel 制作.framework的工程。
但是我又不想把“YYModel”打包进我的静态库,因为肯能工程中已经存在了,此时就需要通过Cocoapods进行管理。
实验步骤
iOS架构-静态库.framework之资源文件打包bundle(6) ,我们使用之前的静态库工程。
- 第一步 在终端cd 到工程目录,执行pod init 会生成 Podfile 文件
Last login: Fri Apr 26 18:22:52 on ttys003
lzz-Mac-mini:~ suning$ cd /Users/suning/Desktop/VideoPlayerFramework/MySDK
lzz-Mac-mini:MySDK suning$ pod init
fatal: Needed a single revision
lzz-Mac-mini:MySDK suning$
结果:
2. 修改Podfile文件,添加 第三方库YYModel ,终端执行:pod install ,生成MySDK.xcworkspace 管理文件,从新打开。⚠️:Podfile中的 use_frameworks! 要解注释。否则合成的.framework 不能用。
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
use_frameworks!
target 'MySDK' do
pod 'YYModel'
end
- 引用YYModel 只需要导入头文件,然后使用YYModel 中的方法即可:
⚠️:要在.m 导入。不然使用第二种脚本文件打的包,总是显示无法找到文件。
但是第一种使用Xcode Aggregate 的打包在.h导入后,打的包却是正常的。
暂时不知道什么原因。
#import "ShowInfo.h"
#import "Student.h"
#import <YYModel/YYModel.h>
@implementation ShowInfo
+ (void)show {
NSLog(@"-----ShowInfo------");
Student *hhh = [Student yy_modelWithDictionary:@{@"name":@"LiLei"}];
NSLog(@"-----hhh%@------",hhh.name);
}
+ (MyViewController *)creatMyViewController {
MyViewController * myVC =[[MyViewController alloc]init];
return myVC;
}
@end
4. 两种打包方式:使用Xcode Aggregate 打包 独立的脚本文件打包
第一种:Xcode Aggregate 的打包,脚本内容直接拷贝
#!/bin/sh
UNIVERSAL_OUTPUTFOLDER=${PROJECT_DIR}/${CONFIGURATION}-universal
WORKSPACE_NAME=${PROJECT_NAME}.xcworkspace
# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
# Step 1. Build Device and Simulator versions
xcodebuild -workspace "${WORKSPACE_NAME}" -scheme "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphoneos ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean
xcodebuild -workspace "${WORKSPACE_NAME}" -scheme "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean
xcodebuild -workspace "${WORKSPACE_NAME}" -scheme "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphoneos ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" build
xcodebuild -workspace "${WORKSPACE_NAME}" -scheme "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" build
# Step 2. Copy the framework structure (from iphoneos build) to the universal folder
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"
# Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}"
# Step 5. Convenience step to copy the framework to the project's directory
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"
# Step 6. Convenience step to open the project's directory in Finder
open "${PROJECT_DIR}"
第二种:自建脚本文件打包
#!/bin/sh
#工程名
PROJECT_NAME=MySDK
WORKSPACE_NAME=${PROJECT_NAME}.xcworkspace
#工程路径
PROJECT_DIR=$(pwd)
#build之后的文件夹路径
BUILD_DIR=$PROJECT_DIR/Build/Products
BUILD_ROOT=$PROJECT_DIR/Build/Products
#打包模式 Debug/Release 默认是Release
development_mode=Debug
UNIVERSAL_OUTPUTFOLDER=${PROJECT_DIR}/${development_mode}-universal
INSTALL_DIR_A=${PROJECT_DIR}/${PROJECT_NAME}.framework/${PROJECT_NAME}
# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
# Step 1. Build Device and Simulator versions
xcodebuild -workspace "${WORKSPACE_NAME}" -scheme "${PROJECT_NAME}" -configuration ${development_mode} -sdk iphoneos ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean
xcodebuild -workspace "${WORKSPACE_NAME}" -scheme "${PROJECT_NAME}" -configuration ${development_mode} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean
xcodebuild -workspace "${WORKSPACE_NAME}" -scheme "${PROJECT_NAME}" -configuration ${development_mode} -sdk iphoneos ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" build
xcodebuild -workspace "${WORKSPACE_NAME}" -scheme "${PROJECT_NAME}" -configuration ${development_mode} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" build
# Step 2. Copy the framework structure (from iphoneos build) to the universal folder
cp -R "${BUILD_DIR}/${development_mode}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"
# Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${development_mode}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}"
echo "======合成结束======"
# Step 5. Convenience step to copy the framework to the project's directory
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"
# -f 判断文件是否存在
if [ -f "${INSTALL_DIR_A}" ]
then
echo "======验证合成包是否成功======"
lipo -info "${INSTALL_DIR_A}"
fi
#打开目标文件夹
open "${PROJECT_DIR}"
Script2.sh 是根据之前的脚本修改的。因为使用Cocoapods 管理的,所以编译代码有所修改。注意对比。
5. 打包后的目标文件
6. demo 验证时,要将验证demo,使用Cocoapods 管理,新建Podfile 文件,依赖YYModel,否则会找不到YYModel.h
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
use_frameworks!
target 'MySDK' do
pod 'YYModel'
end
- 使用示例
- 运行结果
最终两种打包都成功。这样依赖第三方库YYModel 制作的静态库.framework 就成功了!
后续继续研究静态库.a 、.framework 之间的引用打包。
补充遇到的问题:
iOS "The sandbox is not in sync with the Podfile.lock"解决方案
diff: /../Podfile.lock: No such file or directory
diff: Manifest.lock: No such file or directory
error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.`
解决方案:
关闭现在的工作空间,删掉以前的xcworkspace,然后重新pod install,install完后,重新打开项目,clean+build项目,运行
rm -rf MyProject.xcworkspace
pod install