Xcode9在原iOS工程里打包framework
原来的工程有一部分代码想打包成framework不让客户看到,但是有各种分支,不好重建工程,所以想在原工程里面直接打包。本来想做混淆,但是没做成功,发现不需要混淆,因为打包后看不到代码的,这跟Android的jar包不一样。
参考这篇文章
iOS Xcode9 封装生成.framework - 简书
https://www.jianshu.com/p/5ef5e21d887c
⚠️后面的内容是新手所写,慎入!
这是我的工程:
obarong/TestFramework: iOS,Xcode9在原工程里打包framework
https://github.com/obarong/TestFramework
1 测试打包framework
创建TestFramework工程

创建FrameworkProject工程并添加进TestFramework工程




新建Hello.m和Hello.h

更改Xcode项目配置

增加armv7s

设置Headers

公开头文件

编译FrameworkProject

添加FrameworkProject.framework到原工程,把文件拖进去就好了,记得选上copy。

编译运行app

build成功。

2 封装原工程的代码
打包的方法可以了,然后看怎么分离原来的代码。 这部分我直接拿公司项目开刀,demo没有,需要自己脑补。
把代码拖进framework工程。在FrameworkProject的设置,Build Phases->Compile Sources->点“+”把刚拖进去的代码添加进工程。
编译FrameworkProject。替换新的framework文件。
想在原工程引用包里的方法,只要添加头文件
#import <FrameworkProject/NSObject+Hello.h>
正文END
附上一些报错
- 编译报错:
Showing Recent Messages
/Users/xxx/code/xcode/TestFramework/FrameworkProject/FrameworkProject/Hello.m:10:9: 'Hello.h' file not found with <angled> include; use "quotes" instead
解:把头文件<> 改成""。
- 报错:
Showing Recent Messages
/Users/xxx/code/xcode/TestFramework/FrameworkProject/FrameworkProject/Hello.h:12:1: Missing context for method declaration
Showing Recent Messages
/Users/xxx/code/xcode/TestFramework/FrameworkProject/FrameworkProject/Hello.m:12:1: Expected method body
解:重新创建Hello类,选category。
-
问 :一个workspace放两个project有点问题,先从一个framework工程开始吧。单独的工程一下就编译出了framework。拖到新的工程,找不到头文件。
解:拖入文件的时候选上Copy items if needed。 -
问:
为了真机调试,按照教程合并了两个文件,
$ lipo -create /Users/xxx/Library/Developer/Xcode/DerivedData/FrameworkTest-boysvzdxnnueeqeqvwlqvevycxmy/Build/Products/Debug-iphoneos/FrameworkTest.framework/FrameworkTest /Users/xxx/Library/Developer/Xcode/DerivedData/FrameworkTest-boysvzdxnnueeqeqvwlqvevycxmy/Build/Products/Debug-iphonesimulator/FrameworkTest.framework/FrameworkTest -output ~/Desktop/new/FrameworkTest
但是编译不通过,报错
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_Hello", referenced from:
objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解:设置armv7s。修复代码Hello类的错误。
折腾了半天,原来之前的工程可以用,只要修改代码的错误,还有把framework文件拖到原工程就可以了。
不能用+方法调用-方法。会提示找不到。
-
问:怎么Xcode一个workspace多个project?为什么要多个project?
答:因为不想分两个仓库。 -
报错:
Undefined symbols for architecture arm64:
"_OBJC_METACLASS_$_AModule", referenced from:
_OBJC_METACLASS_$_BModule in BModule.o
...
解:framework工程的Build Phases的Compile Sources选项添加工程的m文件。
- 报错
ld: 2 duplicate symbols for architecture arm64
解:删除原工程文件的引用。
- 问:打包的工程在其他地方打开编不过。估计是工程设置问题。
解:有解决办法了,同一个git仓库,但不同工程,在Xcode分开打开、分开编译就好了。
- 错误:master分支合并到branch2后编译失败
clang: error: no such file or directory: '/Users/xxx/code/xcode/Demo/Demo/sync_framework/data/SyncLongData.m'
clang: error: no input files
解:工程的设置文件没有合并,要手动删除文件。
- 报错:升级Xcode10后master分支也编不了
error: Multiple commands produce '/Users/xxx/Library/Developer/Xcode/DerivedData/Demo-csqebbfrltqlntcmhtnshtcpktql/Build/Products/Debug-iphoneos/Demo.app/Info.plist':
1) Target 'Demo' (project 'Demo') has copy command from '/Users/xxx/code/xcode/Demo/Demo/ui/Masonry/Info.plist' to '/Users/xxx/Library/Developer/Xcode/DerivedData/Demo-csqebbfrltqlntcmhtnshtcpktql/Build/Products/Debug-iphoneos/Demo.app/Info.plist'
2) Target 'Demo' (project 'Demo') has process command with output '/Users/xxx/Library/Developer/Xcode/DerivedData/Demo-csqebbfrltqlntcmhtnshtcpktql/Build/Products/Debug-iphoneos/Demo.app/Info.plist'
解决方案:根据提示信息,选中对应的target-> Build Phases -> Copy Bundle Resource -> 移除Info.plist
- 报错
ld: library not found for -lstdc++.6
解:删除引用libstdc++.6.tbd。
- 打包出来的工程会报错
ld: framework not found DemoFW
解:.gitattributes把DemoFW忽略打包了,找不到DemoFW,修改为允许打包再重新打包就可以了。
参考
Undefined symbols for architecture arm64解决方案 - 岽少的专栏 - CSDN博客
https://blog.csdn.net/zuoyou1314/article/details/46638073
XCode 10 错误:Multiple commands produce - 简书
https://www.jianshu.com/p/544a13482030