完整项目准备迁移mPaaS,计划是把整个项目导入到mPaaS工程中,仅使用一个Launcher,后期在分批量的,拆分成microApp和H5包,百度说,项目需要编译成.framework或者.a库后导入主项目中,这里也跟随这个思路往下走。
坑1
- framework的target和项目target一样,需要.m文件绑定到target才可以使用
- 对应的,项目引用的framework,静态库,都要让framework进行引用
-
资源文件的引用,assets、Xib、StoryBoard,都需要让framework进行引用
这是framework的Build phases 就这样
不然运行过程中会报错找不到文件,形态库用不了,或者Xib无法加载之类的
//使用了未定义的类,
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_xx文件名", referenced from:...
上千个.m的绑定target,要命!
几个办法:
- 顺着项目找,一个一个改
- Xcode - find - regular expression 使用正则匹配
([a-zA-Z]*)(\.m)
, 不过问题是实际匹配的是注释里面的XXX.m,如果没有注释或者注释是错的,就没法子了 - 着重介绍第三种,直接修改project.pbxproj,上面需要的资源文件都可以通过这种方式进行添加
分几步:- 第一步肯定是打开project.pbxproj了
- 找到
/* End PBXProject section */
行,在他上面有下面样式的代码,SubProjectOutlet,就是我们的framwork的target,项目的target
targets = (
EF1D01D1250B21F500F5F0FB /* SubProject */,
EF1D01EC250B21F600F5F0FB /* SubProjectUITests */,
EF1D02BD250B514A00F5F0FB /* SubProjectOutlet */, 我是framwork的target
);
- 拷贝SubProjectOutlet的代码
EF1D02BD250B514A00F5F0FB
继续搜索,找到资源的指向位置,
EF1D02BD250B514A00F5F0FB /* SubProjectOutlet */ = {
isa = PBXNativeTarget;
buildConfigurationList = EF1D02C9250B514A00F5F0FB /* Build configuration list for PBXNativeTarget "SubProjectOutlet" */;
buildPhases = (
EF1D02B9250B514A00F5F0FB /* Headers */,
EF1D02BA250B514A00F5F0FB /* Sources */,
EF1D02BB250B514A00F5F0FB /* Frameworks */,
EF1D02BC250B514A00F5F0FB /* Resources */,
);
。。。
};
/* End PBXNativeTarget section */
- 找到资源位置如下所示,明显能看出,项目绑定的比framwork绑定的要多的多,我们把项目的files 复制到framework,保存。compile Expression 就和项目一样了。
/* Begin PBXSourcesBuildPhase section */
EF1D01CE250B21F500F5F0FB /* Sources */ = { // 项目的引用
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
EF1D022F250B223500F5F0FB /* UIImage+MultiFormat.m in Sources */,
EF1D022B250B223500F5F0FB /* UIImageView+HighlightedWebCache.m in Sources */,
EF1D022C250B223500F5F0FB /* FLAnimatedImageView+WebCache.m in Sources */,
EF1D01DD250B21F500F5F0FB /* PBViewController.m in Sources */,
... // 这里就省略了若干个
);
runOnlyForDeploymentPostprocessing = 0;
};
。
。
。
EF1D02BA250B514A00F5F0FB /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
EF1D02D1250B518E00F5F0FB /* PBViewController.m in Sources */,
EFFE3EA72510567C00BFBE50 /* PBNextViewController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
后面的Link Binary and Libraries 、 Copy bundle resources 都可以用这种方法解决。
PS: 绑定完成之后运行项目,可能会有如下的问题,
dyld: Library not loaded: @rpath/XXX.framework/XXX
Referenced from:XXX
Reason: image not found
此时,到framwork-General,下图位置,为对应的库,添加签名。

网友评论