iOS SDK開發彙總

之前也作過靜態庫的開發,不過都是一些簡單的調用,最近在作項目的時候,發現其中還有不少問題,因此建個小項目簡單記錄遇到的問題以及正確的解決辦法。

在項目中遇到的問題以下:xib文件獲取不到,
            storyboard提示not loadead yet ,
            xib和storyboard中的圖片獲取不到。
 
一般咱們進行靜態庫開發的過程包括下面幾個方面:(能夠實如今開發靜態庫的同時在主工程中查看代碼結果是否和預期一致)
一、主工程:能夠實現直接測試靜態庫內的各類模塊功能;
二、靜態庫:封裝本身的靜態庫,方便使用,使功能模塊化;
三、bundle資源包:把靜態庫中的資源文件封裝到bundle包中。資源文件包括圖片、storyboard,xib文件、plist文件以及mp3等。
四、aggregate:實現腳本合併靜態庫支持的設備,生成通用靜態庫。
下面開始逐步實現:
 

1、新建名稱爲JFSDKDemo的單控制器工程,設置最低系統版本號,設置目標設備。

 

2、新建名稱爲JFSDKFramework的靜態庫,具體爲file—new—target—cocoatouch framework。設置最低系統版本號,設置目標設備

 
        一、設置JFSDKFramework爲靜態庫:Build Settings —>Mach-O Type 設置爲Static Library
   
        二、新建控制器:SDKVCtest01(勾選xib,同時建立xib文件)。添加一張圖片備用。而後這個xib中添加兩個UIImageView,其中一個在xib中直接設置圖片,另外一個在代碼中設置。xib以下:
           三、新建控制器SDKVCtest02,同時建立SDKVCtest02.storyboard,關聯控制器和故事板。SDKVCtest02.storyboard中和上面的xib同樣佈局。
           四、此時JFSDKFramework的Build Phases以下所示:(能夠根據具體狀況調整暴露的頭文件),在JFSDKFramework.h文件中添加公開的頭文件,如#import <JFSDKFramework/SDKVCtest01.h>,用於解決引用公開頭文件時‘Missing submodule ’的提示。
 
 
 
 
                五、此時在ViewController.m中添加兩個控制器的頭文件。而後分別展現兩個控制器(xib和storyboard),部分代碼以下:
 
- (IBAction)pushXib:(UIButton *)sender {
   
    SDKVCtest01 *vc = [[SDKVCtest01 alloc]init];
 
    [self presentViewController:vc animated:YES completion:nil];
}
 
- (IBAction)pushStoryboard:(UIButton *)sender {
    SDKVCtest02 *vc = [[SDKVCtest02 alloc]init];
   
    [self presentViewController:vc animated:YES completion:nil];
}

 

 
                發現,啥也沒有,這就對了,由於默認的加載xib,storyboard,圖片等資源是在程序的主bundle中加載的,此時主工程中雖然添加了咱們的SDK可是查找不到相應的資源,於是下面咱們對資源文件進行打包,即便用bundle文件打包資源文件。
 

3、bundle資源包:把靜態庫中的資源文件封裝到bundle包中。資源文件包括圖片、storyboard,xib文件、plist文件以及mp3等。

          生成bundle有兩種方式,
                    第一種就是直接在桌面新建文件夾,修更名稱添加「.bundle」後綴,而後把資源文件添加進去便可。
                    第二種:在Xcode中file—>new —>target —>mac os —>bundle。而後把資源添加到編譯文件中。
       
     咱們採用第二種,
       一、由於咱們的靜態庫中有xib和storyboard,咱們的bundle中須要的是編譯以後的nib和storyboardc文件,若是採用第一種方式須要每次編譯以後找到編譯的文件添加到bundle文件中,這樣很麻煩;
       二、此外若xib或者storyboard中直接引用圖片,默認是主bundle,採用第二種方式時,若要修改成自定義bundle只能代碼解決,而第一種方式圖片和xib以及storyboard一塊兒編譯,不用任何其餘修改便可完美運行,於是第二種不予採納。
 
        採用第二種的方式只須要添加xib和storyboard文件到bundle target中,會直接編譯文件到bundle文件中。
 
        具體步驟以下:
            一、file—>new —>target —>mac os —>bundle 新建bundle命名爲「JFSDKSources」。Build Settings中設置Base SDK 爲 Latest IOS;Build Settings中設置COMBINE_HIDPI_IMAGES 爲NO,防止圖片被編譯爲tiff格式;設置最低系統版本號,設置目標設備。
            二、把第二步中的xib,storyboard以及圖片資源添加到JFSDKSources中,查看Build Phases確保資源文件被添加到Copy Bundle Resources中(由於Xcode9拖拽的文件都不會被添加,這個真的很坑,每次都要手動添加),最後以下圖:
 
 
 
 
            三、修改兩個控制器中的代碼引用,把默認的主bundle修改成咱們自定義的bundle包:
            
//SDKVCtest01
 
- (instancetype)init{
    SDKVCtest01 *testVC =  [[SDKVCtest01 alloc]initWithNibName:@"SDKVCtest01" bundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]]];
    return testVC;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.view.backgroundColor = [UIColor whiteColor];
    self.imageView1.image = [UIImage imageNamed:@"iconjf.png" inBundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]] compatibleWithTraitCollection:nil];
}

 

//SDKVCtest02
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    // Do any additional setup after loading the view.
    self.imageView1.image = [UIImage imageNamed:@"iconjf.png" inBundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]] compatibleWithTraitCollection:nil];
 
}
- (instancetype)init{
    SDKVCtest02 *testVC =  [[UIStoryboard storyboardWithName:@"SDKVCtest02" bundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]]] instantiateViewControllerWithIdentifier:@"SDKVCTest02"];
   
    return testVC;
}

 

 
            四、主工程中添加product中的JFSDKSources.bundle。
 
            command+r,發現xib,storyboard以及png都完美呈現出來,這樣,靜態庫和bundle資源包基本完成,還須要最後一步。
 

4、新建aggregate:實現腳本合併靜態庫支持的設備,生成通用靜態庫。

            一、file—>new —>target —>cross-platform—>aggregate 
            二、Build Phases 新建Run Script,添加以下腳本
           
FMK_NAME="JFSDKFramework"
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
SDK_DIR=${SRCROOT}/Products/${FMK_NAME}
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator
# Cleaning the oldest.
if [ -d "${SDK_DIR}" ]
then
rm -rf "${SDK_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
#mv "${INSTALL_DIR}/${FMK_NAME}.bundle" "${SDK_DIR}"
open "${SDK_DIR}" 

 

 
            三、command +R,編譯幾秒鐘彈出framework文件。
 
大功告成!!!
 
 
附:不一樣資源在靜態庫中的加
 
 //圖片
    UIImage *image = [UIImage imageNamed:@"iconjf.png" inBundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]] compatibleWithTraitCollection:nil];
    //storyboard
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SDKVCtest02" bundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]]];
    //xib
    SDKVCtest01 *testVC =  [[SDKVCtest01 alloc]initWithNibName:@"SDKVCtest01" bundle:[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]]];
   
    NSArray *array = [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]] loadNibNamed:@"nibname" owner:nil options:nil];
    //mp3
    NSString *path = [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]] pathForResource:@"test" ofType:@"mp3"];
   
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: path];
    //plist
    NSString *filePath = [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"JFSDKSources" ofType:@"bundle"]] pathForResource: @"test" ofType: @"plist"];
    NSDictionary *plistDic = [NSDictionary dictionaryWithContentsOfFile:filePath]; 

 

 
注意:  一、storyboard 在bundle中的文件應該是編譯以後的 storyboardc 文件;
      二、xib 在bundle中的文件應該是編譯以後的 nib 文件;
      三、不要讓圖片編譯成tiff格式。
      四、‘Missing submodule ’的問題。在JFSDKFramework.h文件中添加公開的頭文件,如#import <JFSDKFramework/SDKVCtest01.h>,用於解決引用公開頭文件時提示。
      五、Build Active Architecture Only,設置爲NO的時候,會編譯支持的全部的版本;設置爲YES的時候,是爲Debug的時候速度更快,它只編譯當前的architecture 版本
      
 
Demo地址:點這裏
 
                   SDK 開發 
相關文章
相關標籤/搜索