iOS組件化之使用pod命令創建組件

前言

前幾篇博客描述了手動創建組件的方法,到新公司發現這種方式不適合小公司快捷方便的需求,所以轉而向cocoapods為我們提供的pod lib命令來創建組件,這樣對于沒接觸過組件化的新人比較友好,另外也確實少了很多自己需要配置的各種東西。

準備

  • 組件創建需要cocoapods
  • 如果想上傳到倉庫還需要有git
  • 如果環境都沒搭建可以看下之前本序列的文章都有介紹

創建

1、創建組件命令,你可以CD到特定文件夾下執行命令,創建名為名為Demo的組件為例

# 開始執行以下命令后會去github克隆模板代碼沒翻墻可能會比較慢
pod lib create  Demo

#創建過程中的選項可參考下面,有特殊也可以自己決定

What platform do you want to use?? [ iOS / macOS ]  平臺我們選擇iOS
 > iOS

What language do you want to use?? [ Swift / ObjC ]  語言我選擇oc
 > ObjC

Would you like to include a demo application with your library? [ Yes / No ]  是否創建demo工程
 > Yes

Which testing frameworks will you use? [ Specta / Kiwi / None ]  是否添加測試支持
 > None

Would you like to do view based testing? [ Yes / No ]  是否添加測試的view
 > No

What is your class prefix?  類名使用的前綴
 > GG

當前命令執行完之后,它會幫我們執行pod install命令并自動打開里面的Example工程,我們先看下創建后文件夾目錄:

image.png
  • Demo文件夾是我們實際的組件目錄,后面創建的圖片及文件和源代碼都在這里
  • Demo文件夾下有兩個文件夾,一個Classes是存放代碼的地方在xcode創建的時候記得把代碼的目錄選擇放這里,一個是Assets存放不限于圖片的其他資源文件一般我們放圖片可以創建一個系統的.xcassets圖片管理器很方便存取
  • Demo.podspec是組件的描述,不懂可以看下之前的基本概念都是一樣的
  • Example 是我們調試使用的工程,跟我們平時使用的項目差不多,只是它在Example/Podfile中幫我們加入了當前組件的本地依賴方便我們調試

pod 'Demo', :path => '../'

  • .git是git相關的你可以刪掉它后續自己創建
  • .travis.yml是有關自動化相關的也可以先忽略或者直接刪除

在xcode中的工程目錄:

image.png
  • 紅色部分是調試工程的目錄先不管他
  • 綠色部分就是我們在調試的時候組件代碼具體呈現的地方,Demo就是我們組件的名稱有多個的話就是多個這樣的文件夾,Demo/Pod中的放的是組件的描述和README.md文件和實際的目錄是同步的

2、創建好之后最好到項目根目錄下打開.gitgnore忽略文件中添加下列兩行,忽略我們在測試的工程添加的依賴也上傳到git上

Example/Pods
Example/Podfile.lock

3、如果有自己的私有庫,在Example/Podfile中替換以下添加私有源,沒有的可以忽略這步

source 'git@xxxx/Specs.git'

4、上傳到倉庫,刪掉項目根目錄下的git文件夾,使用以下命令將文件提交至git,嫌麻煩也可以直接使用Sourcetree來上傳

#當組件的根目錄下
cd Demo
git init
#關聯內網git倉庫
git remote add origin git@xxxt/Demo.git
#提交源碼
git add .
git commit -m "Initial commit"
git push -u origin master

5、創建源代碼文件應注意選擇路徑,還有對應的target選擇

image.png

6、圖片的讀取問題

  • 我們可以在xcode中選擇Asset Catalog來創建一個自己的圖片管理器,名字最好用組件名稱來命令好區分,一般存放在組件的Assets目錄下
image.png
  • 存放圖片的時候和我們一般項目中存儲的沒什么區別
  • 如果需要發布組件需要在podsepc中添加以下描述,以我的示例工程為例
 s.resource_bundles = {
     'Demo' => ['Demo/Assets/Demo.xcassets']
  }
  • 代碼獲取圖片我寫了個工具類,就是獲取bundle之后再獲取里面的圖片,使用方法也在里面了,使用這種方法Podfile需要去掉里面默認添加的use_frameworks!,后續swift再作兼容
//
//  ResourceManager.h
//  AssetsKit
//
//  Created by GuoMS on 2019/2/18.
//

#import <Foundation/Foundation.h>

/* 使用方法,新建一個文件,頭文件寫入以下宏定義
 #import "ResourceManager.h"
 //自定義特定的名稱
 #undef XXXBundle
 #define XXXBundle [ResourceManager resourceBundleForClass:[self class] podName:@"組件名稱"]
 
 #undef BXXXImage
 #define BXXXImage(name) [ResourceManager imageName:name inBundle:XXXBundle]
 */



@interface BQSResourceManager : NSObject


/**
 獲取組件的bundle并緩存

 @param aClass 當前調用的類,用于定位bundle位置
 @param name 組件的名字
 @return bundle
 */
+ (NSBundle *)resourceBundleForClass:(Class)aClass
                             podName:(NSString *)name;



/**
 制定bundle獲取圖片

 @param name 圖片名字
 @param bundle bundle實例
 @return 圖片、為空返回nil
 */
+ (UIImage *)imageName:(NSString *)name
              inBundle:(NSBundle *)bundle;

@end
//
//  ResourceManager.m
//  AssetsKit
//
//  Created by GuoMS on 2019/2/18.
//

#import "ResourceManager.h"

@interface BQSResourceManager()

@property (strong, nonatomic) NSMutableDictionary *bundleDic;

@end

@implementation ResourceManager

+ (instancetype)sharedInstance {
    
    static BQSResourceManager *manager;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[self alloc]init];
        manager.bundleDic = [NSMutableDictionary dictionary];
    });
    
    return manager;
    
}

+ (NSBundle *)resourceBundleForClass:(Class)aClass podName:(NSString *)name {
    
    NSAssert(aClass, @"class 不能為空");
    NSAssert(name.length > 0, @"組件名稱不能為空");
    
    if (name.length <= 0 || !aClass) {
        return nil;
    }
    
    //獲取bundle
    NSBundle *cacheBundle = [[BQSResourceManager sharedInstance].bundleDic objectForKey:name];
    if (cacheBundle) {
        return cacheBundle;
    }
    
    NSBundle *bundle = [NSBundle bundleForClass:aClass];
    if (bundle) {
        NSString *resourceBundlePath = [bundle pathForResource:name ofType:@"bundle"];
        if (resourceBundlePath && [[NSFileManager defaultManager] fileExistsAtPath:resourceBundlePath]) {
            bundle = [NSBundle bundleWithPath:resourceBundlePath];
        }
        [[BQSResourceManager sharedInstance].bundleDic setObject:bundle forKey:name];
        
        return bundle;
    }
    
    return nil;
}


+ (UIImage *)imageName:(NSString *)name
              inBundle:(NSBundle *)bundle {
    
    NSAssert(bundle, @"bundle 不能為空");
    NSAssert(name.length > 0, @"圖片名稱不能為空");
    if (name.length <= 0 || !bundle) {
        return [UIImage new];
    }
    
    UIImage * image = [UIImage imageNamed:name
                                 inBundle:bundle
            compatibleWithTraitCollection:nil];
    
    return image;

}


@end


最后添加了新的頭文件之后有時候在Example工程中導入會提示找不到頭文件,可以重新執行pod install就可以找到了

如果你有遇到什么問題歡迎在評論中回復,我看到的都會回

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375