iOS架构-静态库.framework之依赖第三方库(7)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shifang07/article/details/89638110

需求分析:

    把自己的能力封装成静态库提供给客户使用,但是有些工作市场上已经有很好的公开的代码,或者成本很低的解决方案,我们就可以使用别人公开的、或者低成本采购的技术来为我们服务。制作静态库也是一样,有时我们需要依赖已经成熟的第三方库来为我们服务。那么如何依赖第三方库制作自己的静态库.framework尼?

目标

根据之前.framework制作基础,演示依赖第三方库YYModel 制作.framework的工程。
但是我又不想把“YYModel”打包进我的静态库,因为肯能工程中已经存在了,此时就需要通过Cocoapods进行管理。

实验步骤

iOS架构-静态库.framework之资源文件打包bundle(6) ,我们使用之前的静态库工程。
在这里插入图片描述

  1. 第一步 在终端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
  1. 引用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
  1. 使用示例
    在这里插入图片描述
  2. 运行结果
    在这里插入图片描述
    最终两种打包都成功。这样依赖第三方库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

猜你喜欢

转载自blog.csdn.net/shifang07/article/details/89638110