在我的应用程序中,我目前将所有代码分离到一个静态库中,以便更轻松地为实际应用程序设置 xcode 项目目标并为我的代码进行单元测试。这样做的问题是我也想将我的大部分 xib 文件放在静态库中,但似乎当我运行我的应用程序并尝试引用 xib 时它找不到它,除非它包含在实际中应用程序的目标而不是静态库目标。是否可以在静态库中包含 xib 文件和其他资源,这些资源可以被同一库中的代码引用,如果可以,如何?
6 回答
不,这是不可能的,因为静态库与“捆绑包”不同。
捆绑包是一个目录,其中可能包含各种文件,包括资源文件 (xib)、可执行文件和静态库。它作为一组单独的文件存在于文件系统中。
静态库是包含由库创建者链接在一起的类、代码和变量的单个文件。它不“包含”其他文件,它本质上是一个编译代码的数据库。
尽管可以将 xib 的数据放在那里,但 Xcode 无法知道它在那里,因为它会在文件系统上将它们作为单独的文件查找。
在 Mac OS 中,您可以创建一个“框架”,它本质上是一组代码、资源、设置等,可以被多个项目重用。但是,Apple 似乎不支持为 iPhone OS 创建自定义框架。
回复评论(不适合评论框)
不用担心,上周我一直在尝试做与您几乎相同的事情-我想将 xib、包含文件和 .a 库的“框架”发送给客户,但不提供所有源代码代码。我也找不到使用捆绑包执行此操作的好方法。
无论出于何种原因,Apple 对此特别迟钝——我看不出他们在静态库(动态库足够公平)的情况下这样做的原因。
我现在的解决方案是手动创建一个包含以下子文件夹的包文件夹“Foo”:
- “包含”-> 将 .h 文件放在这里
- "res" -> 将 .xib 文件放在这里
- “lib”-> 包含“iphoneos”和“iphonesimulator”子文件夹,每个子文件夹都有 libFoo.a
然后将其压缩并发送给客户端。然后客户端:
- 在他们喜欢的地方解压缩包。
- 在资源组下添加“res”文件夹。
- 更改以下目标设置:
Other Linker Flags = -Objc -lfoo
Header Search Paths = /include
Library Search Paths = /lib/$(PLATFORM_NAME)
我可能可以在最后通过一些构建步骤来自动创建包,但是客户端被困在四个稍微繁琐的步骤中。
我找到了一个完美的解决方案,它可以自动完成以上所有操作,并且更多 https://github.com/kstenerud/iOS-Universal-Framework 它是一个 xCode 插件
它对我很有用,它只适用于 XCode 4 及更高版本
是的你可以。在库中添加一个 xib 文件,就像为任何普通项目所做的那样。然后在库项目目标中将 xib 文件与 .a 文件一起添加到复制文件部分。在您使用库的主项目中,将 xib 文件拖放到 .a 库文件所在的位置。
回答将 Xib 文件包含到您的静态库中。
这次我们有 Xcode 11,除了库目标之外,您只需创建一个捆绑目标。捆绑包模板在 macOS 上可用。然后从库代码中,引用捆绑包以便能够引用笔尖。您将库与捆绑包一起分发。
下面是有关将 Xibs 与静态库一起使用的详细视频: https ://www.youtube.com/watch?v=WQI02KR9kQw
分发时,您还可以创建一个 SDK。JSON.framework 在他们的 SVN 中做到了这一点,我成功地复制了这一点。您可以在项目中的 hltypes-ios.xcodeproj 和 iOS 文件夹中的http://hltypes.svn.sf.net/中查看这是如何完成的。
首先,您需要“安装”到您的构建文件夹中,然后您需要复制特殊格式的 SDKSettings.plist。然后将 SDK 的路径添加到应用程序项目中的“附加 SDK”列表中。复合 SDK 的缺点是每次更新此 mini-SDK 时都需要重新启动 Xcode 3.x,并且 Xcode 坚持构建由 Apple 的基础 SDK 和您的 mini-SDK 创建的复合 SDK(这意味着您需要等待相当长的时间) .
应用项目仍需手动添加 .xib 等资源。