下面我們用系統(tǒng)自帶的來新建.framework.然后再添加一個依賴庫 AFNetworking
- xcode的菜單欄 File -> New Project 建立一個名為 YohunlUtilsLib 的Cocoa Touch Framework的工程. 將Target 改為 7.0(由于現(xiàn)在大多數(shù)應用都還要支持7.0sdk,故此處我們修改為支持7.0)
這時候,編譯一下,你可能會遇到警告
我們要修改 Mach-O Type.從默認的Dynamic Library 改為 Static Library,再編譯,警告消失
Static Library 支持IOS8.0 sdk以下的,從目前來看,大多數(shù)工程都還要支持7.0 sdk,所以我們最常用的就是Static Library
命令行,進入目錄下 pod init 建立一個podfile文件,因為我們制作的.framework需要用到AFNetworking網(wǎng)絡庫 PS:你也可以用任意的方式建立這個podfile文件
打開它,因為我采用 pod init命令建立的,打開后你會發(fā)現(xiàn)它已經有內容了
再執(zhí)行 pod install 建立依賴
platform :ios, ‘8.0’
inhibit_all_warnings!
target 'OSUtilsFirstLib' do
pod 'AFNetworking'
end
打開工程,添加一個類TestMode,在其中添加方法(同理添加類AdvModel)
//TestMode.m
#import <Foundation/Foundation.h>
@interface TestMode : NSObject
+ (NSString *)testName:(NSString *)name;
@end
//TestMode.m
#import "TestMode.h"
@implementation TestMode
+ (NSString *)testName:(NSString *)name {
return [NSString stringWithFormat:@"test:----%@",name];
}
@end
//創(chuàng)建一個帶網(wǎng)絡請求的 類
#import <Foundation/Foundation.h>
@interface YONetwork : NSObject
// 需要 pod AFNetworking
- (void)getGithubReposForUser:(NSString*)user withSuccess:(void(^)(id responseObject))success failure:(void(^)(NSError*error))failure;
- (void)test;
@end
// YONetwork.m
#import "YONetwork.h"
#import "AFNetworking.h"
@implementation YONetwork
- (void)getGithubReposForUser:(NSString*)user withSuccess:(void(^)(id responseObject))success failure:(void(^)(NSError*error))failure
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:@"https://www.baidu.com" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
}
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"這里打印請求成功要做的事");
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error); //這里打印錯誤信息
}];
}
- (void) test {
[self getGithubReposForUser:@"occ"withSuccess:^(id responseObject) {
NSLog(@"getGithubReposForUser response = %@",responseObject);
} failure:^(NSError*error) {
NSLog(@"getGithubReposForUser error = %@",error);
}];
}
@end
私有庫里的文件頭設置
// OSUtilsFirstLib.h
#import <UIKit/UIKit.h>
FOUNDATION_EXPORT double OSUtilsFirstLibVersionNumber;
FOUNDATION_EXPORT const unsigned char OSUtilsFirstLibVersionString[];
// 設置開放的頭文件
#import <OSUtilsFirstLib/YONetwork.h>
編譯運行 (command + B),生成相應的.framework文件(先選擇模擬器,編譯企锌,在選擇真機讥裤,編譯)
~/資源庫/Developer/Xcode/DerivedData/ 找到 OSUtilsFirstLib 或 在庫上右鍵Show in Finder
可以看到目錄結構如下:
查看靜態(tài)庫支持的CPU架構
? Release-iphoneos git:(master) ? lipo -info OSUtilsFirstLib.framework/OSUtilsFirstLib
Architectures in the fat file: OSUtilsFirstLib.framework/OSUtilsFirstLib are: armv7 arm64
說明我們生成的真機framework: OSUtilsFirstLib.framework 包含了兩種架構 armv7 arm64
我們使用命令來合并我們生成的真機和模擬器的framework
1捶惜、建立一個新的target(Aggregate)
2搬卒、選擇Target ——> 【+】號———>【New Run Script Phase]
添加如下的合并模擬器和真機的腳本(【Run Script 】添加腳本)
私有庫.framework合并(coocaPods項目)
if [ "${ACTION}" = "build" ]
then
####### PROJECT_NAME = OSUtilsFirstLib
#要build的target名
target_Name=${PROJECT_NAME}
echo "target_Name=${target_Name}"
######## SRCROOT = /Users/occ/Desktop/組件化/私有庫2/OSUtilsFirstLib2
#build之后的文件夾路徑
build_DIR=${SRCROOT}/build
echo "build_DIR=${build_DIR}"
#真機build生成的.framework文件路徑
BUILD_DEVICE_DIR_F=${build_DIR}/Build/Products/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
echo "BUILD_DEVICE_DIR_F=${BUILD_DEVICE_DIR_F}"
#模擬器build生成的.framework文件路徑
BUILD_SIMULATOR_DIR_F=${build_DIR}/Build/Products/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
echo "BUILD_SIMULATOR_DIR_F=${BUILD_SIMULATOR_DIR_F}"
#合并目標文件夾路徑
RESULT_DIR_F=${SRCROOT}/Products/${PROJECT_NAME}
echo "RESULT_DIR_F=${RESULT_DIR_F}"
#合并目標路徑(合并的包替換目標文件.framework中對應的包)
#└── OSUtilsFirstLib.framework
# ├── Headers
# ├── Info.plist
# ├── Modules
# ├── OSUtilsFirstLib (替換這個)
# └── PrivateHeaders
RESULT_DIR_F_A=${SRCROOT}/Products/${PROJECT_NAME}/${PROJECT_NAME}.framework/${PROJECT_NAME}
echo "RESULT_DIR_F_A=${RESULT_DIR_F_A}"
#判斷build文件夾是否存在棕兼,存在則刪除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi
#判斷合并目標文件夾是否存在梅掠,存在則刪除該文件夾
if [ -d "${RESULT_DIR_F}" ]
then
rm -rf "${RESULT_DIR_F}"
fi
#創(chuàng)建目標文件夾
mkdir -p “${RESULT_DIR_F}"
#build之前clean一下
# ============================== build之前clean一下 =============================#
xcodebuild -target ${target_Name} clean
####PROJECT_FILE_PATH = /Users/occ/Desktop/組件化/私有庫2/OSUtilsFirstLib2/OSUtilsFirstLib.xcodeproj
#### CONFIGURATION = Debug
# ============================== build(帶有Pods的) =============================#
#模擬器build
xcodebuild -workspace "${target_Name}.xcworkspace" -scheme "${target_Name}" -configuration "${CONFIGURATION}" -sdk iphonesimulator -derivedDataPath "${build_DIR}"
#真機build
xcodebuild -workspace "${target_Name}.xcworkspace" -scheme "${target_Name}" -configuration "${CONFIGURATION}" -sdk iphoneos -derivedDataPath "${build_DIR}"
# 直接換成模擬與真機的
#xcodebuild -workspace "${target_Name}.xcworkspace" -scheme "${target_Name}" -configuration "${CONFIGURATION}" -derivedDataPath "${build_DIR}" ONLY_ACTIVE_ARCH=NO || exit
#復制真機build的framework文件到目標文件夾
cp -R "${BUILD_DEVICE_DIR_F}" “${RESULT_DIR_F}"
# ======================= 合成模擬器和真機.framework包=========================== #
echo "真機build生成的.framework文件路徑=${BUILD_DEVICE_DIR_F}/${PROJECT_NAME}"
echo "模擬器build生成的.framework文件路徑=${BUILD_SIMULATOR_DIR_F}/${PROJECT_NAME}"
#/Users/occ/Desktop/組件化/私有庫2/OSUtilsFirstLib2/build/Build/Products/Release-iphoneos/OSUtilsFirstLib.framework/OSUtilsFirstLib
#/Users/occ/Desktop/組件化/私有庫2/OSUtilsFirstLib2/build/Build/Products/Release-iphonesimulator/OSUtilsFirstLib.framework/OSUtilsFirstLib
#(合并的包替換目標文件.framework中對應的包)
#└── OSUtilsFirstLib.framework
# ├── Headers
# ├── Info.plist
# ├── Modules
# ├── OSUtilsFirstLib (替換這個)
# └── PrivateHeaders
lipo -create "${BUILD_DEVICE_DIR_F}/${PROJECT_NAME}" "${BUILD_SIMULATOR_DIR_F}/${PROJECT_NAME}" -output "${RESULT_DIR_F_A}"
#打開目標文件夾
open "${RESULT_DIR_F}"
fi
靜態(tài)庫.a文件合成(非coocaPods項目)
if [ "${ACTION}" = "build" ]
then
#要build的target名
target_Name=${PROJECT_NAME}
echo "target_Name=${target_Name}"
#build之后的文件夾路徑
build_DIR=${SRCROOT}/build
echo "build_DIR=${build_DIR}"
#真機build生成的頭文件的文件夾路徑
DEVICE_DIR_INCLUDE=${build_DIR}/Release-iphoneos/include/${PROJECT_NAME}
echo "DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}"
#真機build生成的.a文件路徑
DEVICE_DIR_A=${build_DIR}/Release-iphoneos/lib${PROJECT_NAME}.a
echo "DEVICE_DIR_A=${DEVICE_DIR_A}"
#模擬器build生成的.a文件路徑
SIMULATOR_DIR_A=${build_DIR}/Release-iphonesimulator/lib${PROJECT_NAME}.a
echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"
#目標文件夾路徑
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}
echo "INSTALL_DIR=${INSTALL_DIR}"
#目標頭文件文件夾路徑
INSTALL_DIR_Headers=${SRCROOT}/Products/${PROJECT_NAME}/Headers
echo "INSTALL_DIR_Headers=${INSTALL_DIR_Headers}"
#目標.a路徑
INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/lib${PROJECT_NAME}.a
echo "INSTALL_DIR_A=${INSTALL_DIR_A}"
#判斷build文件夾是否存在枢析,存在則刪除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi
#判斷目標文件夾是否存在玉掸,存在則刪除該文件夾
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
#創(chuàng)建目標文件夾
mkdir -p "${INSTALL_DIR}"
#build之前clean一下
xcodebuild -target ${target_Name} clean
#模擬器build
xcodebuild -target ${target_Name} -configuration Release -sdk iphonesimulator
#真機build
xcodebuild -target ${target_Name} -configuration Release -sdk iphoneos
#復制頭文件到目標文件夾
cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}"
#合成模擬器和真機.a包
lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"
#打開目標文件夾
open "${INSTALL_DIR}"
fi
靜態(tài)庫.a文件合成(coocaPods項目)
if [ "${ACTION}" = "build" ]
then
#要build的target名
target_Name=${PROJECT_NAME}
echo "target_Name=${target_Name}"
#build之后的文件夾路徑
build_DIR=${SRCROOT}/build
echo "build_DIR=${build_DIR}"
#真機build生成的頭文件的文件夾路徑
DEVICE_DIR_INCLUDE=${build_DIR}/Build/Products/Release-iphoneos/include/${PROJECT_NAME}
echo "DEVICE_DIR_INCLUDE=${DEVICE_DIR_INCLUDE}"
#真機build生成的.a文件路徑
DEVICE_DIR_A=${build_DIR}/Build/Products/Release-iphoneos/lib${PROJECT_NAME}.a
echo "DEVICE_DIR_A=${DEVICE_DIR_A}"
#模擬器build生成的.a文件路徑
SIMULATOR_DIR_A=${build_DIR}/Build/Products/Release-iphonesimulator/lib${PROJECT_NAME}.a
echo "SIMULATOR_DIR_A=${SIMULATOR_DIR_A}"
#目標文件夾路徑
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}
echo "INSTALL_DIR=${INSTALL_DIR}"
#目標頭文件文件夾路徑
INSTALL_DIR_Headers=${SRCROOT}/Products/${PROJECT_NAME}/Headers
echo "INSTALL_DIR_Headers=${INSTALL_DIR_Headers}"
#目標.a路徑
INSTALL_DIR_A=${SRCROOT}/Products/${PROJECT_NAME}/lib${PROJECT_NAME}.a
echo "INSTALL_DIR_A=${INSTALL_DIR_A}"
#判斷build文件夾是否存在,存在則刪除
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi
#判斷目標文件夾是否存在醒叁,存在則刪除該文件夾
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
#創(chuàng)建目標文件夾
mkdir -p "${INSTALL_DIR}"
#build之前clean一下
xcodebuild -target ${target_Name} clean
#模擬器build
xcodebuild -workspace "${target_Name}.xcworkspace" -scheme "${target_Name}" -configuration Release -sdk iphonesimulator -derivedDataPath "${build_DIR}"
#真機build
xcodebuild -workspace "${target_Name}.xcworkspace" -scheme "${target_Name}" -configuration Release -sdk iphoneos -derivedDataPath “${build_DIR}"
#復制頭文件到目標文件夾
cp -R "${DEVICE_DIR_INCLUDE}" "${INSTALL_DIR_Headers}"
#合成模擬器和真機.a包
lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"
#打開目標文件夾
open "${INSTALL_DIR}"
fi
對于添加的腳本,其中用到了很多的 xcode預定義的變量,這些變量怎么來的呢?你可以在命令行下, 輸入
? OSUtilsFirstLib git:(master) ? xcodebuild -workspace OSUtilsFirstLib.xcworkspace -scheme OSUtilsFirstLib -sdk iphonesimulator -configuration Debug -showBuildSettings > xcodebuild_showBuildSettings.txt
來將所有的xcode預定義變量都導入到文本xcodebuild_showBuildSettings.txt 中,然后你就可以選用你需要的啦
一般都應該合并release模式的,而不是debug模式的framework司浪,設置好后: ccmmand+B 編譯
測試:新建一個項目,將合并的OSUtilsFirstLib.framework拖入到項目中把沼,測試
當我們使用 Dynamic Library模式(只有iOS8.0及以上才支持)的時候.如同普通文件一樣添加到示例工程中去的話,
直接運行,會出現(xiàn)提示:啊易,可能會報錯:Reason: image not found
選擇 TARGETS [SOTestDemo] ——> Build Phases ——> 【+】號 ——> 【New Copy..】——>【Copy Filses】 添加庫
終端命令
打包Framework,測試時:
1饮睬、用模擬器打包租谈,測試時只能跑在模擬器
2、用真機打包,測試時只能跑在真機
解決如下:
1割去、打開終端
2窟却、輸入 lipo -create 【模擬器打包path】 【真機打包path】 -output 【導出兼容版本path】
實現(xiàn)步驟:
1、右擊打開包呻逆,在finder顯示
2夸赫、正常我們會看到這些,(一般習慣設置成Release環(huán)境下)咖城,重點是第三個紅框茬腿,這就是我們要合并的東西。
3宜雀、創(chuàng)建合并文件夾combine
4切平、合并
lipo -create /Users/occ/Library/Developer/Xcode/DerivedData/OSUtilsFirstLib-absygfecsqswxbfursvwqzmxpzpo/Build/Products/Release-iphoneos/OSUtilsFirstLib.framework/OSUtilsFirstLib /Users/occ/Library/Developer/Xcode/DerivedData/OSUtilsFirstLib-absygfecsqswxbfursvwqzmxpzpo/Build/Products/Release-iphonesimulator/OSUtilsFirstLib.framework/OSUtilsFirstLib -output /Users/occ/Library/Developer/Xcode/DerivedData/OSUtilsFirstLib-absygfecsqswxbfursvwqzmxpzpo/Build/Products/combine/OSUtilsFirstLib
5、合并文件夾下會出現(xiàn)一個文件