一、Swift 默认打Daynamic Framework。
无需另外创建Bundle文件,直接和主工程一样创建storyboard和Assets文件夹。
正确资源获取
storyboard:
let bundle = Bundle(for: Self.self)
let storyboard = UIStoryboard(name: "AFStoryboard", bundle: bundle)
let vc = storyboard.instantiateViewController(withIdentifier: "AFViewController")
获取Assets文件夹中的image:
let bundle = Bundle(for: Self.self)
let image = UIImage(named: "imageName", in: bundle, compatibleWith: nil)
手动引入framework,然后主工程要在
Targets -> General -> Frameworks, Libraries, and Embedded Content
将 Embed 设置为:
Embed & Sign 或者 Embed Without Signing,
签名与否看具体情况。只有签名相同的Daynamic Framework才能和主工程共享资源。
二、framework依赖关系
有Main、A、B 三个工程。Main为主工程,A、B都是framework。
Main依赖A,A又依赖B。
1、如果A和B是在同一个workspace,A只对B添加了依赖,并没有将B手动拖到A的项目创建内部的frameworks包含的时候。AFramework中是没有BFramework文件的,只是在连接的时候会去寻找BFramework。这时候,Main工程就要集成BFramework才能正常运行。这也是正常A外部依赖打包操作。
pod依赖管理就是这样。A如果使用了pod管理,在pod创建的workspace中,A其实只是在Build Phases中Link Binary With Libraries 将 pod工程中的framework标记进来而已。并没有将这些依赖的framework拷贝到自己内部。
2、如果A是将B作为内部的frameworks手动拖进来,形成内部frameworks包含依赖的一部分的话。这时候B就是AFramework整体的一部分。Main就只需要引入A即可,链接过程中,Main能在A内部顺利的找到B。
3、其实如果这时候强行将A内部的B拖出来,再在Main中将B引入,效果是一样的。所以将B拖到A里,只是手动的改变了它所依赖的文件的存放位置而已。
4、如果A里已经包含有B,这时候再从主工程拖一个BFramework进来,这时候运行,只会运行主工程拖进来的BFramework。应该内部搜索依赖的路径时,时先从主工程目录开始,找到后就不再继续搜这个依赖了。
三、使用了pod 管理引入framework
四、使用了pod 直接源码管理
五、有和OC混编的情况
六、打包脚本
Sets the target folders and the final framework product.
FMK_NAME=${PROJECT_NAME}
Install dir will be the final output to the framework.
The following line create it in the root folder of the current project.
INSTALL_DIR={FMK_NAME}.framework
Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR={FMK_NAME}.framework
SIMULATOR_DIR={FMK_NAME}.framework
Building both architectures.
xcodebuild -configuration "Release" -target "{FMK_NAME}" -sdk iphonesimulator
Cleaning the oldest.
if [ -d "{INSTALL_DIR}"
fi
Creates and renews the final product folder.
mkdir -p "${INSTALL_DIR}"
Copies the headers and resources files to the final product folder.
cp -R "{INSTALL_DIR}/"
Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "{FMK_NAME}" "{FMK_NAME}" -output "{FMK_NAME}"
rm -r "{PROJECT_DIR}/Products"