加密累

iOS Framework开发实践-2019

2019-05-10  本文已影响0人  勇往直前888

动态库 vs 静态库

iOS中的framework既可以是动态库,也可以是静态库

image.png image.png

如果是动态库

image.png image.png

如果是静态库

image.png

选哪种?Embedded Framework

资源读取

image.png
  • Frameworks文件夹是General->Embedded Binaries操作之后固定生成的,下面可以放很多的framework。
  • KJTCashierDemo是主工程的可执行文件。
  • KJTSingle.storyboaddc是主工程中的资源
  • KJTCashier是framework中的可执行文件,与主工程的可执行文件相互独立。
  • KJTPay.storyboaddc是framework中资源,与KJTCashier在同一目录,由KJTCashier来读取,跟主工程KJTCashierDemo没关系。
  • KJTCashier. framework相当于一个独立的bundle,可执行文件,资源等全部自给自足,跟主工程的可执行文件和资源都没有关系。
// 读图片函数
+ (nullable UIImage *)imageNamed:(NSString *)name inBundle:(nullable NSBundle *)bundle compatibleWithTraitCollection:(nullable UITraitCollection *)traitCollection NS_AVAILABLE_IOS(8_0);

// 故事版函数
+ (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(nullable NSBundle *)storyboardBundleOrNil;
 // load from main bundle
+ (nullable UIImage *)imageNamed:(NSString *)name;     

如何确定bundle参数?

// 可执行文件和资源同在一个bundle中,类编译后就在可执行文件中
return [NSBundle bundleForClass:[self class]];

生成framework之后,所有的类都被编译到了动态framework的可执行文件中。类所在的bundle,也就是可执行文件所在的bundle,也就是动态framework这个bundle

例子代码

// 从故事版读取Controller
+ (nullable __kindof UIViewController *)controllerWithStoryboardName:(NSString *)storyboardName identifier:(NSString *)identifier {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: [NSBundle bundleForClass:[self class]]];
    if (storyboard == nil) {
        return nil;
    }
    __kindof UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:identifier];
    vc.hidesBottomBarWhenPushed = YES;
    return vc;
}

// 读取本地图片
+ (nullable UIImage *)imageWithName:(NSString *)name {
    UIImage *image = [UIImage imageNamed:name inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];
    return image;
}

对外的头文件

image.png image.png

合并framework

  1. Build Phases 中点击左上角+ ,选择New Run Script Phase 添加一项
image.png
  1. 将下面的脚本代码粘贴至提示“Type a script or drag…”输入框内
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
  1. 测试一下脚本,在release环境下分别选择真机和模拟器运行,运行成功后会自动打开Finder并定位到工程根目录下的Products:
image.png image.png

如何调试?

image.png

如何使用?

image.png image.png

其他的一些配置

image.png

参考文章

上一篇 下一篇

猜你喜欢

热点阅读