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_第1张图片
新建iOS工程

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

Xcode9在原iOS工程里打包framework_第2张图片
新建Framework工程
Xcode9在原iOS工程里打包framework_第3张图片
工程名
Xcode9在原iOS工程里打包framework_第4张图片
添加到原工程
Xcode9在原iOS工程里打包framework_第5张图片
目录结构

新建Hello.m和Hello.h

Xcode9在原iOS工程里打包framework_第6张图片
新建m文件

更改Xcode项目配置

Xcode9在原iOS工程里打包framework_第7张图片
更改Xcode项目配置

增加armv7s

Xcode9在原iOS工程里打包framework_第8张图片
增加armv7s

设置Headers

Xcode9在原iOS工程里打包framework_第9张图片
设置Headers

公开头文件

Xcode9在原iOS工程里打包framework_第10张图片
公开头文件

编译FrameworkProject

Xcode9在原iOS工程里打包framework_第11张图片
编译framework

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

Xcode9在原iOS工程里打包framework_第12张图片
copy

编译运行app

Xcode9在原iOS工程里打包framework_第13张图片
编译运行app

build成功。

Xcode9在原iOS工程里打包framework_第14张图片
成功

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 with  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

你可能感兴趣的:(Xcode9在原iOS工程里打包framework)