文章目录

  • 搭建工作区间
  • 1、创建一个本地代码库文件夹
  • 2、创建一个工作区间
  • 3、创建一个项目
  • 4、创建Framework制作的项目
  • 5、添加项目到Workspace
  • 编写和调试Framework
  • 编写SDK代码
  • 1、添加一个类
  • 2、在类里添加一个方法
  • 3、在类的头文件添加到WeSDK.h中
  • 4、添加Public头文件
  • 4.1 合并SDK库并设置SDK生成路径
  • 4.2 上线前去除模拟器的库
  • 调试和使用SDK


开发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是一个桥梁,提供了一个工作区间,在这个工作区间上,可以实现这个功能。

SDK iOS 教程 ios sdk开发_Workspace

5、添加项目到Workspace

打开Workspace,点击左侧空白区域,Add File to “MyProject”,将DemoProject和WeSDK的xxx.xcodeproj都添加到工作区间来。

SDK iOS 教程 ios sdk开发_Framework制作_02

Add File to “MyProject”->DemoProject->DemoProject.xcodeproj->Next

Add File to “MyProject”->DemoProject->WeSDK.xcodeproj->Next

SDK iOS 教程 ios sdk开发_Framework制作_03

这时候从整体上看项目

SDK iOS 教程 ios sdk开发_Workspace_04

编写和调试Framework

在WeSDK工程里编写SDK的代码,在DemoProject工程中使用和调试SDK。

编写SDK代码

1、添加一个类

WeSDK.h是创建Framework,自动生成的一个方SDK里向外提供的类的头文件的header文件。将所有需要暴露在外部的文件的头文件放在这个头文件中统一管理,外部使用SDK时,只需要引用WeSDK.h就可以了。

加入我们需要在SDK里添加一个类WeSDKService,直接在WeSDK下创建这个类即可

SDK iOS 教程 ios sdk开发_SDK iOS 教程_05

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 iOS 教程 ios sdk开发_Framework制作_06

这时候我们编译一下SDK工程就能生成SDK了,但是系统默认存放SDK的路径比较麻烦,所以我们设置一下,让SDK编译出来之后存在我们想要的位置。
而且默认编译出来是模拟器的库和真机的库分开的,我们需要将模拟器的库和真机的库合并成一个库,上线打包的时候将模拟器的库去掉就行了。

关于SDK编译后生成的库的位置可以在Products下show in finder查看,分别用真机和模拟器编译一下会生成对应的库。

SDK iOS 教程 ios sdk开发_SDK开发_07

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去查看编译出来的库。

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 iOS 教程 ios sdk开发_Framework制作_08

引入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了。