Xcode9在原iOS工程里打包framework

本文链接:https://www.jianshu.com/p/2d5ca206dccb
原来的工程有一部分代码想打包成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工程
Xcode9在原iOS工程里打包framework
文章图片
新建iOS工程 创建FrameworkProject工程并添加进TestFramework工程
Xcode9在原iOS工程里打包framework
文章图片
新建Framework工程 Xcode9在原iOS工程里打包framework
文章图片
工程名 Xcode9在原iOS工程里打包framework
文章图片
添加到原工程 Xcode9在原iOS工程里打包framework
文章图片
目录结构 新建Hello.m和Hello.h
Xcode9在原iOS工程里打包framework
文章图片
新建m文件 更改Xcode项目配置
Xcode9在原iOS工程里打包framework
文章图片
更改Xcode项目配置 增加armv7s
Xcode9在原iOS工程里打包framework
文章图片
增加armv7s 设置Headers
Xcode9在原iOS工程里打包framework
文章图片
设置Headers 公开头文件
Xcode9在原iOS工程里打包framework
文章图片
公开头文件 编译FrameworkProject
Xcode9在原iOS工程里打包framework
文章图片
编译framework 添加FrameworkProject.framework到原工程,把文件拖进去就好了,记得选上copy。
Xcode9在原iOS工程里打包framework
文章图片
copy 编译运行app
Xcode9在原iOS工程里打包framework
文章图片
编译运行app build成功。
Xcode9在原iOS工程里打包framework
文章图片
成功 2 封装原工程的代码 打包的方法可以了,然后看怎么分离原来的代码。 这部分我直接拿公司项目开刀,demo没有,需要自己脑补。
把代码拖进framework工程。在FrameworkProject的设置,Build Phases->Compile Sources->点“+”把刚拖进去的代码添加进工程。
编译FrameworkProject。替换新的framework文件。
想在原工程引用包里的方法,只要添加头文件
#import

正文END 附上一些报错
  • 编译报错:
Showing Recent Messages /Users/xxx/code/xcode/TestFramework/FrameworkProject/FrameworkProject/Hello.m:10:9: 'Hello.h' file not found withinclude; use "quotes" instead

解:把头文件<> 改成""。
  • 报错:
Showing Recent Messages /Users/xxx/code/xcode/TestFramework/FrameworkProject/FrameworkProject/Hello.h:12:1: Missing context for method declarationShowing 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
【Xcode9在原iOS工程里打包framework】XCode 10 错误:Multiple commands produce -
https://www.jianshu.com/p/544a13482030

    推荐阅读