文章目錄
開發SDK的方法和思路有很多,這裏僅是一種。
下面我們要做的是,在一個工作區間下,一邊調試和編寫SDK,一邊在項目中調試和使用我們製作的SDK。
搭建工作區間
1、創建一個本地代碼庫文件夾
找個合適的位置,創建一個文件夾,存放接下來的所有的文件。我這裏創建了一個名爲MyProject的文件夾。
2、創建一個工作區間
創建一個Workspace,存放在MyProject中。
創建步驟:Xcode->File->New->Workspace
有了工作區間就可以在裏面創建項目,包括程序項目、製作Framework的項目等,都可以放在一個工作區間上進行處理。
3、創建一個項目
創建一個可供調試的項目DemoProject。
創建步驟:Xcode->File->New->Project->iOS->Single View App。
將DemoProject和MyProject.xcworkspace方在同一級文件夾下,即MyProject文件夾裏。
4、創建Framework製作的項目
創建一個製作Framework項目WeSDK。
創建步驟:Xcode->File->New->Project->iOS->Framework。
將創建好的WeSDK放在和將DemoProject、MyProject.xcworkspace同一級文件夾下,即MyProject文件夾裏。
到這裏,App工程、Framework工程、Workspace都已創阿完畢。接下來需要把他們關聯起來,使得我們能在Framework工程中修改,直接在App工程中使用並調試。Workspacet是一個橋樑,提供了一個工作區間,在這個工作區間上,可以實現這個功能。
5、添加項目到Workspace
打開Workspace,點擊左側空白區域,Add File to “MyProject”,將DemoProject和WeSDK的xxx.xcodeproj都添加到工作區間來。
Add File to “MyProject”->DemoProject->DemoProject.xcodeproj->Next
Add File to “MyProject”->DemoProject->WeSDK.xcodeproj->Next
這時候從整體上看項目
編寫和調試Framework
在WeSDK工程裏編寫SDK的代碼,在DemoProject工程中使用和調試SDK。
編寫SDK代碼
1、添加一個類
WeSDK.h是創建Framework,自動生成的一個方SDK裏向外提供的類的頭文件的header文件。將所有需要暴露在外部的文件的頭文件放在這個頭文件中統一管理,外部使用SDK時,只需要引用WeSDK.h就可以了。
加入我們需要在SDK裏添加一個類WeSDKService,直接在WeSDK下創建這個類即可
2、在類裏添加一個方法
向WeSDKService中添加一個註冊SDK的方法:
@interface WeSDKService : NSObject
/** Register. Registe SDK before used */
+ (void)setAppKey:(NSString *)appKey;
@end
@implementation WeSDKService
+ (void)setAppKey:(NSString *)appKey {
NSLog(@"appKey: %@",appKey);
if (!appKey || !appKey.length || ![appKey isKindOfClass:[NSString class]]) {
NSLog(@"Unvalid AppKey!");
return;
}
//...
}
@end
這裏只是簡單的調試一下而已。
3、在類的頭文件添加到WeSDK.h中
#import <Foundation/Foundation.h>
//! Project version number for WeSDK.
FOUNDATION_EXPORT double WeSDKVersionNumber;
//! Project version string for WeSDK.
FOUNDATION_EXPORT const unsigned char WeSDKVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <WeSDK/PublicHeader.h>
#import <WeSDK/WeSDKService.h>
4、添加Public頭文件
在TARGET->WeSDK->Build Phases->Hearders->Public下添加需要暴露到SDK外部的頭文件。
將Project處的頭文件移動到上面Public就行了。
這時候我們編譯一下SDK工程就能生成SDK了,但是系統默認存放SDK的路徑比較麻煩,所以我們設置一下,讓SDK編譯出來之後存在我們想要的位置。
而且默認編譯出來是模擬器的庫和真機的庫分開的,我們需要將模擬器的庫和真機的庫合併成一個庫,上線打包的時候將模擬器的庫去掉就行了。
關於SDK編譯後生成的庫的位置可以在Products下show in finder查看,分別用真機和模擬器編譯一下會生成對應的庫。
4.1 合併SDK庫並設置SDK生成路徑
在TARGET->Building Phases下,點擊左上角“+”,添加一個Run Script,將如下腳本添加到裏面
# Framework庫合併腳本
# 進入到項目主目錄的前一級目錄下,../ 表示往前返回一級目錄。
cd ${PROJECT_DIR}/../
# 創建一個Frameworks的文件夾,用來存放SDK
mkdir -p Frameworks
cd Frameworks
# 創建一個WeSDK的文件夾來存放WeSDK
mkdir -p WeSDK
cd WeSDK
# 下面是找到模擬器合真機的打包路徑,使用lipo -create命令進行合併。
cp -rf ${BUILD_DIR}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/${PRODUCT_NAME}.framework ./
iphoneosFile=${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PRODUCT_NAME}.framework/${PRODUCT_NAME}
iphonesimulatorFile=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PRODUCT_NAME}.framework/${PRODUCT_NAME}
if [ -f "$iphoneosFile" ] && [ -f "$iphonesimulatorFile" ]; then
lipo -create "$iphoneosFile" "$iphonesimulatorFile" -output ./${PRODUCT_NAME}.framework/${PRODUCT_NAME}
fi
rm -rf ./${PRODUCT_NAME}.framework/_CodeSignature
編譯完成後在show in finder去查看編譯出來的庫。具體請參考:iOSSDK開發之使用腳本合併模擬器和真機的庫
4.2 上線前去除模擬器的庫
上線前打包ipa的時候需要去除掉模擬器的庫,否則審覈不會通過,我們只需要在項目中添加一段腳本,打包ipa的時候會自動去除模擬器的庫。
在TARGET->Building Phases下點擊“+”添加一個Run Scrit,添加腳本去除。
解決辦法:TARGETS->Build Phases->點擊加號選擇New Run Script Phase->添加下面的腳本即可。
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
if [[ $APP_PATH != *ArchiveIntermediates* ]]; then
exit 0
fi
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done
調試和使用SDK
我們把SDK打包到了本地文件夾下,這時候只需要在項目中引用進來就可以使用了。
引入SDK後,我們在ViewController裏面引SDK頭文件,並調試一下:
#import "ViewController.h"
#import <WeSDK/WeSDK.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[WeSDKService setAppKey:@"My AppKey"];
}
@end
試了一下,打印了appKey: My AppKey,這時候我們可以一邊改着SDK裏的代碼,改完之後直接編譯生成新的SDK,接着直接在自己的項目中使用和調試SDK了。
至此,我們已經get到了在一個工作區間下,同時開發和調試SDK了。