iOS xcode9中framework靜態庫的創建以及xib和圖片的使用記錄


  來到了新公司,要開發的第一個項目據說可能要封成framework,可是我從來沒自己做過framework呀!頓時開始發憤圖強,趕緊惡補了起來。但是還是遇到了一些亂七八糟的情況,所以寫個隨筆記下來。

 有哪里不對的,大家可以溫柔的指出哈~

零、准備工作

1.新建工程,選擇iOS->Framework&Library->Cocoa Touch Framework,命名為FramewrokTest.

2.新建FrameworkManager和TestViewController(Also create XIB file),並添加進來一張圖片,我的是yumy.JPG.

3.開始寫代碼

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface FrameworkManager : NSObject

+(NSString*)presentTestVCFromCurrentVC:(UIViewController *)VC; @end
#import "FrameworkManager.h"
#import "TestViewController.h"

@implementation FrameworkManager

+(NSString *)presentTestVCFromCurrentVC:(UIViewController *)VC{ TestViewController *testVC = [[TestViewController alloc] initWithNibName:@"FrameworkBundle.bundle/TestViewController" bundle:nil]; [VC presentViewController:testVC animated:YES completion:nil]; return @"調用成功!"; } @end
#import "TestViewController.h"

@interface TestViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imgView; @end @implementation TestViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. self.imgView.image = [UIImage imageNamed:@"FrameworkBundle.bundle/yumy.JPG" inBundle:nil compatibleWithTraitCollection:nil]; self.imgView.highlightedImage = [UIImage imageNamed:@"FrameworkBundle.bundle/haha.JPG" inBundle:nil compatibleWithTraitCollection:nil]; } - (IBAction)changeImg:(id)sender { self.imgView.highlighted = !self.imgView.highlighted; } - (IBAction)back:(id)sender { [self dismissViewControllerAnimated:YES completion:nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end

一、創建bundle

1.創建bundle,選中PROJECT之后,點擊加號選擇macOS->Framework&Library->Bundle,命名為FrameworkBundle

之后將FrameworkBundle->Build Settings->Build Options->Enable Bitcode設置為NO.

因為bundle默認是macOS的所以要改成iOS的,需要將FrameworkBundle->Build Settings->Architectures->Base SDK改為Latest iOS

分別將FrameworkBundle->Build Settings->Deployment下的iOS Deployment Target和macOS Deployment Target,選擇為你最低支持的版本

將FrameworkBundle->Build Settings->User-Defined->COMBINE_HIDPI_IMAGES設置為NO(此屬性在Base SDK 選擇了iOS SDK之后才會出現)

2.選中剛剛創建的FrameworkBundle->Build Phases->Copy,將所有的圖片和xib添加到copy bundle resources中,如下圖。

3.選擇FrameworkBundle和Generic iOS Device,之后Command+B編譯Bundle。(注意:伺候只要是xib有改變或是新加了圖片等等都需要重新編譯 Bundle)

編譯之前,可以看到Products下的FrameworkBundle.bundle還是紅色的,編譯后就變成了黑色,變成黑色后選中FrameworkBundle.bundle選擇show in finder,之后就可以把bundle加到主工程中啦!(具體的下面會說)

二、使用腳本自動合並framework

1.事前准備都做完了,現在開始配置了!

 1)Targets->FrameworkTest->General->Deployment Info->Deployment Target設置成你支持的最低版本

 2)給FrameworkTest->Build Settings->Architectures->Architectures添加上armv7s,下圖是添加完的樣子。

 3)按下圖設置紅框中的字段

 4)在FrameworkTest->Build Phases->Headers中,將想要讓靜態庫使用者看到的頭文件放到public中。(FrameworkTest.h默認必須在Public中)

2.選中FrameworkTest點擊加號選擇Cross-platform->Other->Aggregate,命名為FrameworkAggregate。

3.選中FrameworkAggregate->Build Phases,點擊加號,添加New Run Script Phases。

之后將下面的腳本添加到Run Script中

#指定 FrameWork 與 bundle的target名稱

FrameWork_NAME="FrameworkTest"
Bundle_NAME="FrameworkBundle"

#打包結果存儲地址
Products_DIR=${SRCROOT}/Products/

#定義framework與bundle存儲路徑
FRAMEWORK_INSTALL_DIR=${SRCROOT}/Products/${FrameWork_NAME}.framework
Bundle_INSTALL_DIR=${SRCROOT}/Products/${Bundle_NAME}.bundle

#將要生成包的路徑
WRK_DIR=build

FRAMEWORK_DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FrameWork_NAME}.framework
FRAMEWORK_SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FrameWork_NAME}.framework

Bundle_SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${Bundle_NAME}.bundle

#清理下工程
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FrameWork_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FrameWork_NAME}" -sdk iphonesimulator clean build

xcodebuild -configuration "Release" -target "${Bundle_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${Bundle_NAME}" -sdk iphonesimulator clean build

#清除下存儲路徑下的舊包
if [ -d "${FRAMEWORK_INSTALL_DIR}" ]
then
rm -rf "${FRAMEWORK_INSTALL_DIR}"
fi
mkdir -p "${FRAMEWORK_INSTALL_DIR}"


if [ -d "${Bundle_INSTALL_DIR}" ]
then
rm -rf "${Bundle_INSTALL_DIR}"
fi
mkdir -p "${Bundle_INSTALL_DIR}"

#隨便拷貝一個.framework
cp -R "${FRAMEWORK_DEVICE_DIR}/" "${FRAMEWORK_INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.

#合並.framework中的二進制文件,講通用二進制文件替換
lipo -create "${FRAMEWORK_DEVICE_DIR}/${FrameWork_NAME}" "${FRAMEWORK_SIMULATOR_DIR}/${FrameWork_NAME}" -output "${FRAMEWORK_INSTALL_DIR}/${FrameWork_NAME}"

#拷貝bundle
cp -R "${Bundle_SIMULATOR_DIR}" "${Products_DIR}/"

rm -r "${WRK_DIR}"
open "${Products_DIR}"

4.最后選擇FrameworkAggregate和Generic iOS Device,之后Command+B編譯,編譯成功會彈出窗口

三、framework(帶有bundle)的使用

1.新建工程MainProject,選擇Single View App就行之后將之前編譯成功的FrameworkBundle.bundle和FrameworkTest.framework加到MainProject中。

2.配置工程

1)將Bitcode設置為NO

2)在MainProject->Build Phases->Copy Bundle Resources中點擊加號添加FrameworkTest.framework。

其他的配置該怎么配怎么配

3.現在來調用一下framework中的方法,實現在Main.storyboard中放一個按鈕,點擊這個按鈕調用FrameworkManager中提供的方法跳轉到TestViewController。

ViewController中的調用如下

#import "ViewController.h"
#import <FrameworkTest/FrameworkTest.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (IBAction)presentVC:(id)sender {
//    [SDK2Manager presentCurrentVC:self];
    [FrameworkManager presentTestVCFromCurrentVC:self];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

 

好啦~完事啦~運行一下看看結果吧

四、在已有項目中創建framework

1.創建一個新項目FrameworkInMainProject,選Single View App就行,之后設置最低支持版本

2.選中project之后點擊下方加號,添加framework,bundle,aggregate,依次命名為ProjectFramework,ProjectBundle,ProjectAggregate

 

下圖為添加完的樣子

3.之后在FrameworkInMainProject->Build Phases->Target Dependencies中添加ProjectBundle,ProjectFramework

4.以上三小點都做完了,就可以參照文章前面講的:

零、准備工作

一、創建bundle

二、使用腳本自動合並framework

三、framework(帶有bundle)的使用

這四部分配置framework,bundle和aggregate了。想要看到效果,就正常運行項目即可(之前把framework和bundle先build一下)。aggregate是當你需要導出framework,bundle時才需要build,平時不需要。

ProjectFramework文件夾如下圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM