草庐IT

ios - 如何在 iOS 中创建包含 Swift 的开发框架?

coder 2023-09-05 原文

我的目标是创建一个 iOS 框架,其中包含我可以在我的开发项目中使用的 Swift 和 Objective-C。这个框架的本质是框架本身在发展。因此,重要的是每次我使用这个框架构建项目时(我将使用框架的项目称为“使用”项目,因为没有更好的术语),我想确保框架本身被重新构建。我希望它成为一个框架,因为我有一些正在使用的应用程序,我想在这些应用程序中使用相同的框架代码。今天我一直在为此苦苦挣扎,并且浪费了很多时间在至少在我看来应该更容易的事情上。所以,我将分享我的过程。

最佳答案

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

这是我完成的过程。我必须处理的两个主要问题是:(i) 使 Xcode 正确链接到使用项目中的框架,以及 (ii) 访问使用项目中框架的 header 。在 Apple 的开明观点中,这两个问题是分开的。注意讽刺。 ;).

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

File > New > Project > iOS > Framework & Library > Cocoa Touch Framework

我恰好在使用 Xcode7。 (不要创建Cocoa Touch 静态库——就像我上面说的,Xcode 不会让您将 Swift 合并到静态库中)。

2) 对于你的 Swift 类,确保成员和函数是公共(public)的。我没有对此进行试验,但似乎 public 属性对于框架用户可见的成员和函数来说是必需的。

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

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

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

6) 在您使用的项目中,打开您的框架项目。并将框架文件拖到 Build Phases 的 Embed Frameworks 中(当我第一次开始实验时,Embed Frameworks 部分不存在于 Build Phases 中,我还不知道是什么魔法让它出现了!)。

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

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

${TARGET_BUILD_DIR}/YourFrameworkName.framework

(看来您不必必须将此标记为递归)。

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

import YourFrameworkName

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

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

10) 第二个问题 (10/23/15):我刚刚了解到我的框架有必要将“App-Swift.h”(我为此使用的名称)作为 Objective-C 生成的接口(interface) header build设置中的名称。当我取出这个(Objective-C 生成的接口(interface) header )(试图解决另一个问题)时,我在 App-Swift.h 中遇到了一些有趣的问题。这些问题看起来像: "Cannot find interface declaration for NSObject"?

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

ERROR ITMS-90206: "Invalid Bundle. The bundle at 'Your.app/Frameworks/YourFramework.framework' contains disallowed file 'Frameworks'."

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

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

关于ios - 如何在 iOS 中创建包含 Swift 的开发框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32816507/

有关ios - 如何在 iOS 中创建包含 Swift 的开发框架?的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  5. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  6. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  7. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  8. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  9. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  10. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

    这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

随机推荐