IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)

什么是SDK?

软件开发工具包(缩写:SDK,英语全称:Software Development Kit),一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合。
在OC的开发中,我们涉及到的一般是静态库(.a)或者动态库(.framework)。(注:不是所有的.framework就一定是动态库)

静态库与动态库的区别?

  • 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。表现形式为 .a和.framework。
  • 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。 表现形式为 .dylib和.framework。

a与.framework有什么区别?

.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。 .a文件不能直接使用,至少要有.h文件配合(微信的SDK就是这种形式),.framework文件可以直接使用。 .a + .h + sourceFile = .framework。 建议用.framework。再者 静态方式开发,一直是iOS SDK开发的主流方式。

静态库.framework开发:

  1. 新建SDK .framework项目:
    • File -> New -> Project -> IOS -> Framework & Library -> Framework
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第1张图片
      新建.framework SDK
    • 填写SKD名:
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第2张图片
      填写SKD名
    • 选择SDK保存位置。
  2. 设置配置:
    • TARGETS -> General -> Deployment Info,设置支持iOS系统的最低版本和支持的设备。
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第3张图片
      支持版本及设备
    • TARGETS -> Build Settings -> Linking -> Mach-O Type 更改为Static Library(静态库),默认为Dynamic Library(动态库)。
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第4张图片
      更改为静态库
    • TARGETS -> Build Settings -> Linking -> Other Linker Flage 添加-Objc标志(在静态库中慎用Category,如果使用了Category就必须在SDK和SDK使用的项目中都要添加该标识,否则会报unrecognized selector sent to instance的异常
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第5张图片
      Category 必填
    • TARGETS -> Build Settings -> Architectures 添加armv7s(Xcode6之后,默认不支持armv7s,如果需要添加SDK的工程是支持armv7s,那将会有冲突)
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第6张图片
      支持armv7s
    • TARGETS -> Build Settings -> Build Options -> Enable Bitcode设置为No,默认为YES。
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第7张图片
      Enable Bitcode
  3. 添加要制作成SDK的代码。
  4. 配置公开文件:
    • TARGETS -> Build Phases -> Headers
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第8张图片
      公开文件
  5. 在SDK的.h头文件中引用公开的文件:
//#import 
#import 
  1. SDK.framework打包:
    模拟器 iPhone5s 以下是 i386 架构,iPhone5s 及以上是 x86_64 架构。如果想同时支持 i386 和 x86_64,设置:TARGETS -> Build Settings —> Architectures —> Build Active Architecture Only —> NO。
    真机iPhone5s 以下是 armv7 架构,iPhone5s 及以上是 arm64 架构。
    • Product -> Scheme -> Edit Scheme -> Run -> Build Configuration修改为release
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第9张图片
      Build Configuration.png
    • 生成模拟器和真机使用的framework包:
      1. 真机包:模拟器选项中,选择Generic IOS Device, Command + B生成真机包。
      2. 模拟器包:模拟器选项中,选择任意模拟器, Command + B生成模拟器包。
      3. 查看真机包和模拟器包的位置:项目中的Product文件夹中选择SDK文件,右击选择Show in Finder
IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第10张图片
查看SDK
IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第11张图片
真机和模拟器包

- 通过终端命令行查看包是真机包还是模拟器包:lipo -info framework路径
IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第12张图片
SDK路径
lipo -info

终端输出为:armv7 arm64 是真机架构;i386 x86_64 是模拟器架构。

  1. 合并framework的真机包和模拟器包:
    • 通过终端命令行合并:lipo -create 真机路径 模拟器路径 -output 真机路径
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第13张图片
      合并
    • 通过脚本语言合并:
      1. TARGETS -> Build Phases 点击加号创建Run Script
        IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第14张图片
        Run Script
      2. Run Script中添加脚本运行代码:
        IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第15张图片
        Run Script

        command + B 分别生成真机和模拟器包,再次按command + B合并真机包和模拟器包。脚本代码如下:

if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#open "${DEVICE_DIR}"
open "${SRCROOT}/Products"
fi
  • lipo -info查看合并后的包支持的架构:
    IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第16张图片
    合并后

静态库.a开发:

  1. 新建SDK .a项目:
    • File -> New -> Project -> IOS -> Framework & Library -> Static Library
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第17张图片
      image
    • 填写SDK名:
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第18张图片
      image
    • 选择SDK保存位置。
    • SDK中会生成.h和.m文件,.m文件可以直接删除。
    • SDK所支持的最低版本:PROJECT -> info -> Deployment Target
IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第19张图片
支持的最低版本
  1. 添加需要生成SDK的代码。
  2. 在SDK的.h头文件中引用公开调用的头文件:
//#import "公开文件名.h"
#import "WebViewController.h"
  1. Targets -> Build Settings -> Copy Files 添加公开的.h文件。并且清空Subpath中的路径,如果不清空,.a文件和.h文件不在同一个文件夹中。
    IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第20张图片
    公开文件.h
  2. SDK.a打包:
    • Product -> Scheme -> Edit Scheme -> Run -> Build Configuration修改为release
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第21张图片
      Edit Scheme
    • 生成模拟器和真机使用的framework包:
      1. 真机包:模拟器选项中,选择Generic IOS Device, Command + B生成真机包。
      2. 模拟器包:模拟器选项中,选择任意模拟器, Command + B生成模拟器包。
      3. 查看真机包和模拟器包的位置:项目中的Product文件夹中选择SDK文件,右击选择Show in Finder
IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第22张图片
真机和模拟器包

- 通过终端命令行查看包是真机包还是模拟器包:lipo -info SDK.a路径
IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第23张图片
.a的路径
终端

终端输出为:arm64 是真机架构;x86_64 是模拟器架构。

  1. 合并framework的真机包和模拟器包:
    • 通过终端命令行合并:lipo -create 真机路径 模拟器路径 -output 真机路径
      IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第24张图片
      合并

Bundle资源文件创建:

手动创建Bundle资源:

  1. 创建一个文件夹,把这个文件夹的后缀改成.bundle
    IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第25张图片
    image
  2. 右击该文件 -> 显示包内容:
    IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第26张图片
    image
  3. 把资源文件直接copy到该文件中:
    IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第27张图片
    image
  4. Bundle加入SDK中:
    IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第28张图片
    添加Bundle
  5. 从Bundle资源文件中读取内容:
  • Html本地文件的读取:
NSString *htmlFilePath = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"Bundle名.bundle/transpay/index.html"];
NSURL * htmlFileURL = [NSURL URLWithString:htmlFilePath];
NSURLRequest * request = [NSURLRequest requestWithURL:htmlFileURL];
[self.webView loadRequest:request];
  • 图片/视频资源的读取:
NSString *imageFilePath = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"Bundle名.bundle/image/xingkong.png"];
imageView.image = [UIImage imageWithContentsOfFile:imageFilePath];
  • Storyboard、xib,需要在对应的视图控制器中添加以下代码:
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    NSBundle *bundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"Bundle名.bundle"]];
    if (bundle) {
        // 如果是storyboard
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"你的storyboard名称(例如Main)" bundle:bundle];
        self = [storyboard instantiateViewControllerWithIdentifier:@"你在storyboard中设置的此视图控制器的id"];
        return self;

        // 如果是xib
        self = [super initWithNibName:@"当前控制器的名称" bundle:bundle];
        return self;
    }
    return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}
  1. 把生成的SDK文件和Bundle资源文件放在同一个文件夹中:
    IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第29张图片
    image.png

    Bundle文件创建和使用完成。

创建的SDK中使用其他的SDK

  1. 往SDK中拖入另一个SDK:
    IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等)_第30张图片
    添加SDK
  2. 在合适的地方,添加这个引入的SDK的相关代码。

Bundle 和 其他的SDK都要和创建的SDK放在同一个文件夹,然后拖入要使用的项目中,如果该项目中的SDK和创建的SDK中的引用的SDK重复,那么就只要保持存在一个就好了。

你可能感兴趣的:(IOS SDK开发详解(.framework、.a、Bundle资源文件创建、SDK中使用其他SDK等))