iOS SDK開發流程

開發SDK的方法和思路有很多,這裏僅是一種。
下面我們要做的是,在一個工作區間下,一邊調試和編寫SDK,一邊在項目中調試和使用我們製作的SDK。

Demo地址

搭建工作區間

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

具體見:iOSSDK開發之使用腳本合併模擬器和真機的庫

調試和使用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了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章