Xcode9在原iOS工程里打包framework

2018-11-19  本文已影响0人  奥巴荣

本文链接: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工程

新建iOS工程

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

新建Framework工程 工程名 添加到原工程 目录结构

新建Hello.m和Hello.h

新建m文件

更改Xcode项目配置

更改Xcode项目配置

增加armv7s

增加armv7s

设置Headers

设置Headers

公开头文件

公开头文件

编译FrameworkProject

编译framework

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

copy

编译运行app

编译运行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。

$ 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文件拖到原工程就可以了。

不能用+方法调用-方法。会提示找不到。


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

解:删除原工程文件的引用。

clang: error: no such file or directory: '/Users/xxx/code/xcode/Demo/Demo/sync_framework/data/SyncLongData.m'
clang: error: no input files

解:工程的设置文件没有合并,要手动删除文件。

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

上一篇 下一篇

猜你喜欢

热点阅读