如何在 iOS 中创建包括 Swift 的开发框架?

2024-02-17

我的目标是创建一个包含 Swift 和 Objective-C 的 iOS 框架,我可以在我的开发项目中使用它。这个框架的本质是框架本身正在开发中。因此,每次我使用此框架构建项目时(由于缺乏更好的术语,我将使用该框架的项目称为“使用”项目),我想确保框架本身被重新构建,这一点很重要。我希望这是一个框架,因为我有一些正在使用的应用程序,我想在其中使用相同的框架代码。今天我花了很长时间来解决这个问题,并在一些本应(至少在我看来)更容易的事情上浪费了很多时间。那么,我就来分享一下我的过程。


首先要观察到的事情(这当然不是我的第一次观察!)是你cannot在 iOS 下使用静态库来完成此操作。 Xcode 不会让你在静态框架中使用 Swift 尝试一下。 Xcode 会拒绝你的愿望!

这是我最终完成的过程。我必须处理的两个主要问题是:(i) 使 Xcode 正确链接到 using 项目中的框架,以及 (ii) 访问 using 项目中框架的标头。在苹果公司的开明观点中,这两个问题是分开的。注意讽刺。 ;)。

1)创建一个Cocoa Touch Framework使用 Xcode。我相信这适用于 Xcode6 和 Xcode7。使用:

文件 > 新建 > 项目 > iOS > 框架和库 > Cocoa Touch 框架

我碰巧使用的是Xcode7。 (做not make a Cocoa Touch Static Library——就像我上面说的,Xcode 不会让你将 Swift 合并到静态库中)。

2) 对于您的 Swift 类,请确保成员和函数是public。我还没有尝试过这一点,但似乎公共属性对于框架的用户可见的成员和函数是必需的。

3) 将您想要的任何 Swift 类(和 Objective-C)添加到您的框架中。

4) 关闭该框架项目。 (同一个项目不能在Xcode中打开两次,接下来您需要将框架合并到您使用的项目中)。

5) 在 Xcode 中打开您使用的项目。对我来说,这是一个现有的通用应用程序项目。您可能正在创建一个新的使用项目。无论如何,将 Finder 中框架项目​​的 .xcodeproj 文件拖到您使用的项目中。

6) 在您的使用项目中,打开您的框架项目。并将框架文件拖入Embed Frameworks在构建阶段(Embed Frameworks当我第一次开始实验时,构建阶段中不存在该部分,而且我还不知道是什么魔法导致它出现!)。

到目前为止,这些步骤应该使您能够构建和链接,而无需实际集成库代码的使用。 (我正在使用https://github.com/RadiusNetworks/swift-framework-example https://github.com/RadiusNetworks/swift-framework-example用于我的一些测试)。

7) 现在致命一击:Build Settings, 搜索Framework Search Paths。并添加:

${TARGET_BUILD_DIR}/YourFrameworkName.framework

(看来你do not必须将其标记为递归)。

8) 在使用该框架的 Swift 代码文件中,您需要在每个文件的顶部添加导入:

import YourFrameworkName

您现在应该能够使用新库进行构建和链接!

9) 还有一个问题:确保你的Deployment Target您的框架与您的目标项目相匹配。例如,如果您使用的项目是针对 iOS7 构建的,请确保您的框架是针对 iOS7 或更早版本构建的。

10) 第二个陷阱 (10/23/15):我刚刚了解到我的框架有必要将“App-Swift.h”(我为此使用的名称)作为 Build 中的 Objective-C 生成的接口标头名称设置。当我取出这个(Objective-C 生成的接口头)(试图解决另一个问题)时,我在 App-Swift.h 中发现了一些有趣的问题。这些问题看起来像:“找不到 NSObject 的接口声明”? https://stackoverflow.com/questions/8994911/cannot-find-interface-declaration-for-nsobject

11) 第三个陷阱 (10/29/15):当我尝试将我的第一个应用程序上传到使用此框架的 iTunes Connect 时,出现上传错误。错误如下:

错误 ITMS-90206:“捆绑包无效。捆绑包位于 “Your.app/Frameworks/YourFramework.framework”包含不允许的文件 '构架'。”

各种 SO 和其他帖子都遇到了这种错误,对我来说,技巧是,对于框架目标,在构建设置中将“嵌入内容包含 Swift 代码”设置为“否”。 (我的应用程序构建设置已将此标志设置为“否”)。

已完成大部分步骤的示例项目位于https://github.com/crspybits/CocoaTouchFramework.git https://github.com/crspybits/CocoaTouchFramework.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 iOS 中创建包括 Swift 的开发框架? 的相关文章

  • Swift - 在 TableView 单元格中使用步进器递增标签

    这里又是一个 Swift 初学者 我只是想在每个 TableView 单元格中使用一个步进器来增加同一单元格中的标签 我发现了关于这个主题的几个问题 但它们包含其他元素 我无法提取基本概念 Swift Stepper Action 更改同一
  • 在 iOS 8 中创建通话/双高状态栏?

    是否有调用自定义通话 双高状态栏的标准方法 如果没有 那么构建我自己的功能的最佳起点是哪里 我知道关于如何做到这一点存在一些多年的问题 但没有任何令人满意的答案 有什么新方法可以做到这一点吗 可能在 iOS 8 中 这里没有什么新鲜事 但我
  • 如何读取 Xcode 6.1 Instruments .trace 文件?

    我一直在尝试阅读 trace文件 我使用生成的custom仪器模板 仪器 自动机 分配 Leaks using 仪器 https developer apple com library mac documentation Developer
  • swift 中闭包和函数作为参数的区别

    我有将近 4 年的 Objective C 经验 并且是 swift 的新手 我试图从 Objective C 的角度理解 swift 的概念 所以如果我错了 请指导我 在目标 c 中 我们有块 可以稍后异步执行的代码块 这绝对是完全合理的
  • xcode“将源编译为”覆盖特定文件

    我有一个项目 必须将 编译源为 值设置为 Objective C 不 根据文件类型 在我的主项目中不起作用 我从框架 特别是 OpenFeint 获得的文件有问题 该文件在编译为 Objective C 时出现编译错误 error poin
  • 通过应用程序组在应用程序之间通信和保存数据

    iOS 8 昨天发布了一个有关应用程序组的新 API 以前在应用程序之间共享数据和通信有点混乱 我相信这正是应用程序组旨在纠正的问题 在我的应用程序中 我启用了应用程序组并添加了一个新组 但我找不到任何有关如何使用它的文档 文档和 API
  • 如何通过我的 ios 应用程序的指示打开苹果地图应用程序

    我的目标是从 ios 应用程序打开带有方向的地图应用程序 我可以打开地图应用程序 但它没有显示方向 我编写的代码如下 NSString mystr NSString alloc initWithFormat http maps apple
  • Cordova Phonegap“导出失败”错误代码 70 构建 ios 时

    我目前正在使用 Cordova Phonegap 构建 iOS 应用程序 本来工作正常 但现在运行时出现错误cordova build ios在终端中 我收到以下错误 导出失败 错误 命令的错误代码 70 带有参数的 xcodebuild
  • 将 UIRefreshControl 用于 UIWebView

    我在 iOS 6 中看到了 UIRefreshControl 我的问题是是否可以通过下拉来刷新 WebView 而不是像在邮件中那样让它弹出 我使用 rabih 的代码是 WebView UIRefreshControl refreshCo
  • Swift 3 中数组的 indexOf(_:) 方法的替换

    在我的项目 用 Swift 3 编写 中 我想使用从数组中检索元素的索引indexOf 方法 存在于 Swift 2 2 中 但我找不到任何替代方法 Swift 3 中是否有任何好的替代方法或类似的方法 Update 我忘记提及我想在自定义
  • ExpandableLabel iOS 中的“少看”

    我正在使用第三方库可扩展标签 https github com apploft ExpandableLabel实施一个see more特征 我正在寻找仅快速的解决方案 其中包含标签中的文本而不是按钮中的文本 因此这可以完美地工作 添加库并更
  • iOS JPEG 图像旋转 90 度

    我正在使用选择器视图从相册中选择图像 我使用上面的代码 void imagePickerController UIImagePickerController picker didFinishPickingMediaWithInfo NSDi
  • TableView 中图像的大小不正确

    我正在使用来自 URL 的图像创建一个表视图 但图像不会调整到所有视图的大小 直到我将其按入行中 知道为什么会发生这种情况吗 这是一个自定义的表格视图 我的代码是 UITableViewCell tableView UITableView
  • iOS:我如何知道某个属性是否符合 KVO 标准?

    In the 键值观察编程指南 https developer apple com library archive documentation Cocoa Conceptual KeyValueObserving KeyValueObser
  • iOS 键盘显示后分屏宽度

    我刚刚开始研究 Cordova 应用程序对分屏多任务处理的支持 到目前为止 该应用程序在模拟器中的 iPad 上显示和调整大小都很好 但是当我单击编辑字段并显示软件键盘时 100 宽度的值开始返回整个屏幕 而不是给出的窗口 初始显示 到目前
  • GoogleSignIn ios 附加到谷歌表格

    我目前正在开发一个 iOS 应用程序 该应用程序需要写入登录用户拥有的 Google 工作表 要登录我正在使用的用户GoogleSignInpod 并附加到我正在使用的谷歌表GoogleAPIClientForREST Sheets pod
  • 如何像谷歌日历一样将单元格的内容滚动到表格视图中的另一个单元格中?

    我希望用户界面像谷歌日历那样进入桌面视图 它在不同的行中显示相同的日期事件 但是当您向上或向下滚动时 左侧的日期也会向上向下滚动 Can you please help me how to achieve this Please take
  • ArraySlice 中的 Swift [重复]

    这个问题在这里已经有答案了 在数组上使用 prefix 方法后 我得到了所谓的 arraySlice 我怎样才能将其转换为数组 我试图从 FacebookGraphApi 获取 Ints 然后请求前 3 个 前缀 3 并尝试将它们添加到新数
  • 如何在运行仅 iPhone 应用程序(非通用)的 iPad 上的 UIPickerView 中支持 VoiceOver?

    一般来说 我会查看 Apple 的 UICatalog 示例代码以获取基本的 VoiceOver 支持 但示例代码中似乎有对 UIPickerViews 的 VoiceOver 支持 我是否需要在某处提供accessibilityLabel
  • 在iOS中设置框架的原点

    我正在尝试以编程方式设置框架的原点 Method1 button frame origin y 100 方法二 CGRect frame button frame frame origin y 100 我尝试了方法 1 但它不起作用 显示错

随机推荐