项目开发时经常会遇到个别模块想打包成framework的情况,传统的打包方式太繁琐,反复测试时很麻烦,不如一个项目管理来得方便。
这里记录一下用一个Workspace方式管理项目依赖的方式。由于图是两天前截的,按图码字,有疏漏之处还请见谅。
1.新建Workspace:
1.1 Xcode -> File -> New -> Workspace并放到Test文件夹下
2.新建TestProject和FrameworkProject:
2.1 Xcode -> File -> New -> Project,同样放在Test文件夹下

2.2 在Xcode中将这两个Project添加到Workspace

3.添加Target到FrameworkProject
3.1 FrameworkProject -> Targets -> [+]

选择Cocoa Touch Framework

命名为TestFW,先不要选Embed in App

可以看到Targets下面新增了一个Framework

4.添加Framework到TestProject
4.1 TestProject ->Targets -> General -> Embedded Binaries -> [+]

可以看到刚刚生Target的Products已经列了出来,选择TestFW.frameworkiOS

framework嵌入成功

可以看到在Project中也显示出来了,不要在意红色,因为在编译TestProject时会先编译它依赖的framework,这也是这种方法建立项目依赖的方便之处,不需要额外手动编译framework。

如果看着不舒服,可以移动到项目的Frameworks文件夹(Tips:看不到Frameworks文件夹可以先随便嵌入一个系统库,比如UIKit.framework,然后再删掉,就可以看到Frameworks文件夹了)。

4.2 添加测试方法
这里举例添加方法到ViewController中,注意这是错误演示,下面会说明。


当然不要忘了在暴露的.h中#import "ViewController"

运行,发现报错,提示找不到ViewController,导致无法编译framework模块

原来是新增的Target中不包含ViewController这个类。
解决方法:选择ViewController.h -> TargetMembership -> 勾选TestFW

再次运行,发现helloFramework方法并没有调用,并且控制台输出提示ViewController这个class被两个类文件同时生成了,一个是TestProject项目,一个是TestFW这个framework。

解决方法:把两个ViewController其中一个改下名字就可以了,这里我把framework中的ViewController改名为TestViewController(当然里面的类名也一定要改啊)。

可以看到输出正常了。

[重点] 所以说,自己生成的framework一定要一个特殊的类名前缀,否则很容易和项目中某个类冲突。
4.3 添加测试类
当然实际使用时基本不会使用默认的ViewController类,都会自己新建一个或几个类来实现。注意新建类时一定要选择对应的Target,否则就会出现无法编译的问题。

自己添加类后,运行,依然报错?找不到helloFramework方法,什么鬼?

解决方法:FrameworkProject -> Targets -> TestFW -> Build Phases -> Headers,将Project中新增的方法,拖到Public下。否则编译器将新增的方法视为私有的,无法被TestFW.h引用。

移动后

至此,就大功告成了。
当然,这种方法适用于将现有项目简单的打包,如果想从0完全新建framework,那在新建项目时直接选择Cocoa Touch Framework就好,这样会少生成很多AppDelegate之类的文件。

网友评论