"app" 项目和 Xcode 中的 "framework" 项目有什么区别?

What is the difference between an "app" project and a "framework" project in Xcode?

我正在使用 SwiftUI 开发一个项目,它最初是从创建一个新项目作为“应用程序”开始的(Xcode,点击文件、新建、项目,点击“应用程序”)但是然后后来要求将其作为框架放入 pod 中。我成功地做到了(Xcode,点击文件,新项目,点击“框架”),但是我不确定有什么区别,我也不确定为什么我要这样做。对我来说,它们看起来非常相似,只是我无法在模拟器中将我的项目作为框架启动。幸运的是,SwiftUI 提供了 canvas 预览 window 但是它在某些按钮交互方面有点挑剔,这就是我想使用模拟器的原因。

混淆的两个地方:

App 是可以启动和 运行 的独立应用程序。例如,您 phone 上的所有应用程序都是 -- 应用程序。您点击它们,它们就会启动并 运行、呈现用户界面、接受输入等

框架完全是另一回事。它是一组代码,被捆绑到一个包中,供另一个框架或应用程序使用。系统提供了一些框架——例如,SwiftUI 是一个听起来像是您在应用程序中使用的框架。其他框架由第三方提供。例如,您可以通过 CocoaPods 或 Swift 包管理器找到许多框架——Alamofire 是一个常见的例子。此外,您可以制作自己的框架并在自己的代码中使用它们作为一种组织形式和职责分离。

Why is it more advantageous to have my project as a framework?

不是——它们是两个几乎完全不同的概念(除了它们最终都是代码和资源的集合)。如果您打算构建一个可以在某人的设备上启动的应用程序,您唯一的选择就是制作一个应用程序。如果您打算收集可重复使用的代码以供您或其他人的应用程序使用,那么您应该制作一个框架。

@jnpdx 的出色回答(并点赞)。让我举一个物理例子:

(1) 在Xcode中创建一个项目,这是一个框架。称它为“MyAppKit”。在它里面,基本上可以创建任何东西——一个 ViewUIView,或者更可能是一个将被多个视图 共享 的函数。 (让我们开始吧。)

public func setLoginName(_ login:String) -> String {
    return ""Hello, " + login + "!";
}

很简单。调用它,传递一些东西,然后它 returns 一个字符串打招呼。请注意 public 部分。这很重要。 (还有更多。这是一个简单的例子。)

(2) 现在我们进入您的一个或多个应用程序。假设您有两个应用程序需要使用此(同样,非常简单)代码。一种是 SwiftUI,一种是 UIKit。 (除了语法之外没关系。)正因为我的强项是 UIKit,所以我会使用它。 (也可以是几十个应用程序。)

import MyAppKit

let myLoginMessage = setLoginName("World").

差不多就是“你好,世界!”

再说一次,这真是一个荒谬的例子。但它应该让您开始了解 Xcode Framework 项目和 App 项目之间的区别。