在阅读本文之前,请先阅读《将IOS项目打包为Framework+打包后的测试》,因为本文是在它的基础上,在原IOS项目中添加了CocoaPods来管理项目使用到的第三方库。本文内容主要是:在原有的静态库项目MyFramework中添加CocoaPods、打包Framework、打包后的测试、PrefixHeader.pch使用。
不选择 Cocoa Touch Static Library 是因为:Cocoa Touch Static Library 也能建立静态库,但是最后得到的是一堆头文件加上一个 .a 文件,不容易部署;而 Framework 则是把头文件和编译好的二进制文件打包为一个. framwork ,容易部署。
1.在原有的静态库项目MyFramework中添加CocoaPods
进入到MyFramework所在磁盘目录
在终端中进入到上图中MyFramework项目磁盘目录位置,创建Podfile
cd /Users/zym/MyFramework
touch Podfile
在项目所在磁盘目录中,发现多了一个Podfile
编辑Podfile
在Podfile中可以根据项目的实际情况,配置需要用到的第三方库。在Xcode中打开该项目在磁盘目录中的Podfile。
在本项目中配置Podfile内容如下:
platform :ios, '9.0'
target 'MyFramework' do
pod 'AFNetworking', '~>3.1.0'
pod 'Masonry','~>1.0.2'
pod 'JPush', '3.0.5'
pod 'MBProgressHUD', '~> 0.9'
pod 'WebViewJavascriptBridge', '~> 5.0'
pod 'CocoaLumberjack'
pod 'MJExtension'
pod 'MJRefresh'
pod 'SDWebImage'
pod 'SVProgressHUD'
pod 'TPKeyboardAvoiding'
pod 'MLTransition'
pod 'FMDB'
pod 'CocoaAsyncSocket'
pod 'Shimmer'
pod 'FlatUIKit'
pod 'RESideMenu'
pod 'SWTableViewCell'
end
在终端中,进入MyFramework项目根目录,执行pod install,则CocoaPods开始进行上述配置的Podfile中第三方库相关的源码下载、依赖关系配置、引入相关的framework等工作
cd /Users/zym/MyFramework
pod install
从上图中可以看出Pod installation complete。并且其中包含一句:Please close any current Xcode sessions and use `MyFramework.xcworkspace` for this project from now on.即关闭任何当前开启的Xcode,以后使用MyFramework.xcworkspace来打开和进行项目开发。
此时,查看MyFramework项目在磁盘中的目录结构,发现多了Pods、MyFramework.xcworkspace、Podfile.lock这3项,如下图:
关闭当前打开的Xcode,并双击上图中的MyFramework.xcworkspace在Xcode中打开项目,如下图所示。
通过MyFramework.xcworkspace来在Xcode中管理MyFramework源程序和引用的第三方库。CocoaPods将第三方库以target的形式组成一个名为Pod的工程,该工程的位置在刚才生成的Pods目录下,整个第三方工程会生成一个名为libPods.a的静态库提供给MyFramework项目使用。
2.将使用了CocoaPods的IOS项目打包为Framework
将编译的Target选择为MyAggregate,设备Devices选择Generic iOS Device
执行Command+B开始编译。显示build success,并自动打开创建的framework包,显示包中的内容。
打开上图中的Headers文件夹,发现没有内容,这不正常。
查看报错信息
将运行脚本替换了一下,修改为如下内容
#!/bin/sh
UNIVERSAL_OUTPUTFOLDER=${BUILD_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 build
xcodebuild -workspace "${WORKSPACE_NAME}" -scheme "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean 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 3. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory
SIMULATOR_SWIFT_MODULES_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/."
if [ -d "${SIMULATOR_SWIFT_MODULES_DIR}" ]; then
cp -R "${SIMULATOR_SWIFT_MODULES_DIR}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"
fi
# 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}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${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}"
执行Command+B开始编译,显示build success,并自动显示MyFramework.framework
打开MyFramework.framework查看其内容,如下图
打开Headers文件夹,查看其内容包含MyLog.h
3.打包后的测试
新建一个工程iOS--Single View App,项目名为MyCocoaPodsDemo,创建完成后在Xcode中的目录结构,如下图
将刚才创建的MyFramework.framework包拖拽到MyCocoaPodsDemo项目中
展开MyFramework.framework,发现Headers中存在2个头文件
修改ViewController.m,引入MyFramework.framework包中的MyLog.h,创建MyLog对象并调用print方法
//
// ViewController.m
// MyCocoaPodsDemo
//
// Created by zym on 2019/3/13.
// Copyright © 2019 zym. All rights reserved.
//
#import "ViewController.h"
#import <MyFramework/MyLog.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
MyLog *myLog=[[MyLog alloc] init];
[myLog print];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
运行MyCocoaPodsDemo,显示build success的提示框,并在模拟器中显示空白页面,如下图
控制台输出Hello World,说明MyCocoaPodsDemo项目调用我们打成的MyFramework.framework包成功
4.PrefixHeader.pch使用+使用第三方库涉及的Link Binary With Libraries
若在MyFramework中的MyLog.m添加如下一行代码,即调用第三方库
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
MyLog.m
//
// MyLog.m
// MyFramework
//
// Created by zym on 2019/3/12.
// Copyright © 2019 zym. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "MyLog.h"
@implementation MyLog
-(void) print
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSLog(@"Hello World!");
}
@end
PrefixHeader.pch,该文件中可以放置全局引用的常量和设置,如可以将在项目中广泛使用的头文件包含在该文件下,编译器就会自动将该文件中引入的头文件添加到项目所有的源文件中去,减少import的重复操作。
在MyFramework项目中添加PrefixHeader.pch,选中项目--MyFramework--右键--New File--选择PCH File
使用默认的文件名,Targets中选择MyFramework
在PrefixHeader.pch添加#import <AFNetworking.h>,即引入MyLog.m中使用的第三方库的头文件
//
// PrefixHeader.pch
// MyFramework
//
// Created by zym on 2019/3/14.
// Copyright © 2019 zym. All rights reserved.
//
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
// Include any system framework and library headers here that should be included in all compilation units.
// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.
#import <AFNetworking.h>
#endif /* PrefixHeader_pch */
选中TARGETS中的MyFramework--Build Settings--搜索“Apple LLVM”,将Precompile Prefix Header设置为Yes,将Prefix Header设置如下:
$(SRCROOT)/MyFramework/PrefixHeader.pch
$(SRCROOT)为项目根路径
PrefixHeader.pch为全局预编译文件的名字
设置Link Binary With Libraries,将使用到的第三方库添加进来
选中TARGETS中的MyFramework--Build Phases--Link Binary With Libraries--点击“+”,添加MyLog.m中使用到的如下图箭头所指示的第三方库
如果不进行Link Binary With Libraries中第三方库的添加,则在打包.framework后,在MyCocoaPodsDemo中使用的过程中,构建项目会失败,报错信息如下图
此处,我们将项目中使用到的第三方库AFNetworking添加到了Link Binary With Libraries中。
将待编译的target选择为MyAggregate,设备device选择为Generic iOS Device
执行Command+B进行编译打包,如下图打包成功,显示build success,并自动显示MyFramework.framework
打开MyFramework.framework,查看里面内容,如下图
打开Headers,发现里面有如下内容
在Xcode中退出MyFramework项目,打开项目MyCocoaPodsDemo,引入最新打的包MyFramework.framework
执行Command+B尝试进行编译,构建成功build success。点击按钮执行项目
运行MyCocoaPodsDemo,显示build success的提示框,并在模拟器中显示空白页面,如下图
控制台输出Hello World,说明MyCocoaPodsDemo项目调用我们打成的MyFramework.framework包成功,在MyFramework.framework包内部的MyLog.m的print方法中涉及到了第三方库的调用,即MyFramework.framework包中第三库的
调用也是成功的。
参考链接:https://blog.csdn.net/BUG_delete/article/details/72901462