主項目的ProjectName是HelloFramework( SDK的主項目 )markdown
在主項目裏建立Framework,暫時命名MyFramework架構
Project - > Editor - > Add Larget - > Cocoa Touch Frameworkapp
- Project - > Target - > MyFramework - > Build Settings
- Architectures配置支持的指令集,增長arm64e、armv7s
以下:框架
備註:系統已經默認配置了 arm6四、armv7iphone
指令集 | 支持設備設備 |
---|---|
armv6 | iPhone、iPhone 3G、iPod 1G、iPod 2G |
armv7 | iPhone 3GS、iPhone 四、iPod 3G、iPod 4G、iPod 5G、iPad、iPad 二、iPad 三、iPad Mini |
armv7s | iPhone 五、iPhone 5C、iPad 4 |
arm64 | iPhone 5s、iPhone 六、iPhone 6P、 iPhone 6s、 iPhone 6sP、 iPhone 七、iPhone 7P、iPad Air、Retina iPad Mini |
arm64e | iPhone XR、iPhone XS Max |
Build Active Architecture Only 修改成 NOide
Mach-O Type 設置爲 Static Library(靜態庫)oop
備註:使用動態庫要注意須要在 Linked Frameworks and Libraries 和 Embedded Binaries 都加入對應的動態庫。ui
以下:atom
步驟:Target - > MyFramework - > Build Phases - > Headersspa
以下:
在FrameworkManager類裏實現了一個方法
//.h文件聲明
#import <Foundation/Foundation.h>
@interface MyFrameworkManager : NSObject
+ (UIViewController*)creatFrameworkFileViewController;
@end
複製代碼
//.m文件實現
#import "MyFrameworkManager.h"
#import "FrameworkFileViewController.h"
@implementation MyFrameworkManager
+ (UIViewController*)creatFrameworkFileViewController{
FrameworkFileViewController *vc = [[FrameworkFileViewController alloc] initWithNibName:GetNibName(@"FrameworkFileViewController") bundle:[NSBundle mainBundle]];
NSLog(@"subviews:%@",vc.view.subviews);
return vc;
}
@end
複製代碼
默認生成的.h文件中,個人是MyFramework.h,把全部須要暴露的.h文件都用#import 引入,記住必定要將全部須要暴露的.h文件都引入,也就是上面Headers-Public中加的全部.h文件,否則編譯後生成的.framework在引用的時候會有警告。 以下:
/// 引入頭文件
#import <MyFramework/MyFramework.h>
// 主項目當中
UIViewController *vc = [MyFrameworkManager creatFrameworkFileViewController];
複製代碼
打包Framework:分爲真機和模擬器,這兩個生成的framework是不同的。(若是說你須要生成一個既能夠真機使用又能夠模擬器使用的,那就分別生成,最後在合併在一塊兒)。按照下圖將編譯的 Device 選擇爲真機 ,而後按下 Command + B 開始編譯,編譯成功後右鍵 Products 文件夾下的 .framework 文件,點擊 Show in Finder。
Found an unexpected Mach-O header code: 0x72613c21
以下:
以下:
編譯完成會生成以下文件:
備註:一旦xib文件發生變化,就須要從新編譯nib文件,而後替換
把Bundle文件導入到咱們的framework中,咱們用到圖片的時候,就取Bundle中的圖片來用。
//FrameworkFileViewController.m文件實現
#import "FrameworkFileViewController.h"
@interface FrameworkFileViewController ()
@property (unsafe_unretained, nonatomic) IBOutlet UIImageView *imageView;
@end
@implementation FrameworkFileViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.imageView.image = [UIImage imageNamed:GetBundleImage(@"tiaotiaosu")];
}
- (IBAction)changeImage:(UIButton *)sender {
if (_imageView.highlighted) {
self.imageView.image = [UIImage imageNamed:GetBundleImage(@"jienigui")];
}else{
self.imageView.highlightedImage = [UIImage imageNamed:GetBundleImage(@"kabisou")];
}
self.imageView.highlighted = !self.imageView.highlighted;
}
- (IBAction)dismiss:(UIButton *)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
複製代碼
Product --> Edit Scheme --> Build Configuration
(1)在 Target 爲 MyFramework 下,選擇模擬器和Generic iOS Device各自 Command + B 一次
(2)在工程目錄 Products 下 -> 右擊 Framework -> Show in Finder,會看到有兩個文件夾,一個是真機包,一個是模擬器包。
查看包所支持框架:lipo -info 路徑/MyFramework.framework/MyFramework
armv7 arm64 armv7s arm64e 說明是真機
i386 x86_64 說明是模擬機
合併:lipo -create 真機路徑/MyFramework.framework/MyFramework 模擬器路徑/MyFramework.framework/MyFramework -output 真機路徑/MyFramework.framework/MyFramework
再次查看包支持框架:兩者均在,說明合併成功
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Targets -> Build Phases -> Link Binary With Libraries、Copy Bundle Resources 處都加上引入的Framework文件
clang: error: linker command failed with exit code 1 (use -v to see invocation)
從圖能夠看出缺乏 MJRefresh 和 CHTCollectionViewWaterfallLayout
工程中引入的第三方靜態庫真機調試沒有問題,打包的時候報錯
打好包以後上傳時候出現錯誤!!!
解決方案:
第一種:從 Embedded Binaries(動態庫裏來文件)中刪除靜態Framework文件(KJFramework.framework)可是你直接刪除會發現下面 Linked Frameworks and Libraries(簽署了框架和庫)中 Framework 文件也沒了。這是須要從新往 Linked Frameworks and Libraries 裏添加剛剛被刪除的Framework文件。
第二種:從新將Framework文件封裝成Dynamic Library(動態庫),使用動態庫要注意須要在 Linked Frameworks and Libraries 和 Embedded Binaries 都加入對應的動態庫。
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
# 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
複製代碼