美文网首页
Xcode9在原iOS工程里打包framework

Xcode9在原iOS工程里打包framework

作者: 奥巴荣 | 来源:发表于2018-11-19 19:58 被阅读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。

    • 问 :一个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

          本文链接:https://www.haomeiwen.com/subject/mgwofqtx.html