Swift Playgrounds App 1 - Swift Playgrounds App 项目
晴猫编程
2022年04月23日 13:55
收录于文集
共14篇

Xcode 版本:13.2.1(Swift 5.5.2)/ 13.3(Swift 5.6.1)

Swift Playgrounds(iPad)版本:4.0.2


Swift Playgrounds 进入 4.0 版本以后,已经不完全是一个编程教学/学习工具了。除了能够在 Playground Book 文件中编写代码片段,我们还可以使用新推出的 Swift  Playgrounds app 格式构建 iPhone 或 iPad 应用程序,甚至提交到 app Store Connect 上进行上架。

也就是说,如果没有太复杂的需求,我们借助 Swift Playgrounds 4.0 就能够在 iPad 上开发出完整的 iOS / iPadOS 应用。

下面我们就简单了解一下 Swift Playgronds app 项目吧!

Swift Playgrounds app 项目在 iPad(Swift  Playgroujnds 4.0)和 Mac(Xcode 13.2/13.3)上都是可以创建和编辑的,我们可以使用 AirDrop 在 Mac 和 iPad 之间传递项目,因为 Mac 能够展示更多信息,为了能够更清楚的描述项目的内容,本文先从 Xcode 的编辑开始介绍。

在 Xcode 上创建

在 Xcode 上创建 Swift Playgrounds app 项目,只需要选择 菜单 - File - New - Project... - Swift Playgrounds app 创建项目即可。

Xcode 创建 Swift Playgrounds app

Xcode 会为我们创建一个后缀名为 .swiftpm 的项目,这就是 Swift Playgrounds app 项目了,打开后会看到项目默认提供了一个遵循 app 协议的类型(Myapp.swift)和一个简单的 SwiftUI 视图(ContentVeiw.swift),以及一个用来放置图片资源的 Assets.xcassets 目录,这部分内容和常规的 SwiftUI 项目的默认内容基本上是一致的。

Xcode Swift Playgrounds app 目录

Package.swift

但是,如果我们在 Finder 中打开项目目录,就会发现一个被隐藏的 Package.swift 文件,说明 .swiftpm 是由 Swift 包管理支持的。

Finder Swift Playgrounds app 目录

Package.swift 的初始内容如下

代码块
Swift
自动换行
复制代码
// /Package.swift:

// swift-tools-version: 5.5

// WARNING:
// This file is automatically generated.
// Do not edit it by hand because the contents will be replaced.

import PackageDescription
import AppleProductTypes

let package = Package(
    name: "MyApp",
    platforms: [
        .iOS("15.2")
    ],
    products: [
        .iOSApplication(
            name: "MyApp",
            targets: ["AppModule"],
            bundleIdentifier: "cn.edu.sbs.iosclub.MyApp",
            displayVersion: "1.0",
            bundleVersion: "1",
            iconAssetName: "AppIcon",
            accentColorAssetName: "AccentColor",
            supportedDeviceFamilies: [
                .pad,
                .phone
            ],
            supportedInterfaceOrientations: [
                .portrait,
                .landscapeRight,
                .landscapeLeft,
                .portraitUpsideDown(.when(deviceFamilies: [.pad]))
            ]
        )
    ],
    targets: [
        .executableTarget(
            name: "AppModule",
            path: "."
        )
    ]
)
复制成功

文件用到了一个新的类型 iOSapplication,开头的注释不建议我们手动修改文件的内容,但是现阶段,在开发过程中会面临一些我们不得不对其修改的情况。

比如要使用 Info.plist ,就需要在 .iOSapplication 中设置 additionalInfoPlistContentFilePath 参数,或者 Swift Playgrounds 创建的项目是缺少 bundleIdentifier 设置的,在 Xcode 中打开会弹出 invalid character in Bundle Identifier... 警告,类似这样的情况也需要我们手动修改。

Xcode fork 的 SwiftPM 包在 /applications/Xcode.app/Contents/PlugIns/IDESwiftPackageCore.framework/Versions/A/Frameworks/SwiftPM.framework/目录下,我们可以在这里找到所有 Swift Package 可能用到的类型。.iOSapplication 的完整声明在 /Versions/A/SharedSupport/ManifestAPI/PackageDescription.swiftmodule 目录下,我们可以从中了解可以设置的内容。

代码块
Swift
自动换行
复制代码
import PackageDescription
import Swift
extension PackageDescription.Product {
  public static func iOSApplication(
    name: Swift.String, 
    targets: [Swift.String], 
    bundleIdentifier: Swift.String? = nil, 
    teamIdentifier: Swift.String? = nil, 
    displayVersion: Swift.String? = nil, 
    bundleVersion: Swift.String? = nil, 
    iconAssetName: Swift.String? = nil, 
    accentColorAssetName: Swift.String? = nil, 
    supportedDeviceFamilies: [PackageDescription.ProductSetting.IOSAppInfo.DeviceFamily], 
    supportedInterfaceOrientations: [PackageDescription.ProductSetting.IOSAppInfo.InterfaceOrientation], 
    capabilities: [PackageDescription.ProductSetting.IOSAppInfo.Capability] = [], 
    additionalInfoPlistContentFilePath: Swift.String? = nil) 
  	-> PackageDescription.Product
}
复制成功

在 Xcode 上编辑

预览

和常规的 SwiftUI 项目不同,Swift Playgrounds app 的编辑界面默认提供一个对整个 app 的预览,我们可以通过它来检查整个程序的界面和交互。

Xcode Swift Playgrounds app 默认预览

如果需要对某个 SwiftUI  视图进行预览,只需要创建对应的 PreviewProvider 就可以添加预览了,添加的预览会和默认的 app 预览同时显示,下图为 apple 官方 Swift Playgrounds app 项目 “关于我” 在 Xcode 中的截屏。

Xcode 关于我 app 截屏

(注意:Swift Playgrounds 4.0.2 中获取的官方 Swift Playgrounds app 项目已经无法在版本号 < 13.3 的 Xcode 中打开,如果尝试打开会报 Command CompileAssetCatalog failed with a nonzero exit code 错误。)

导入 Swift 包

Swift Playgrounds app 可以通过 URL 下载、导入现有的 Swift 包来实现功能。

在 Xcode 中,只需要 右键项目 - Add Package... 就可以添加包,可以直接选择 apple 官方发布的包,也可以通过 URL 下载添加其他包。

Xcode 添加 Swift 包

在 iPad 上创建和编辑

在 iPad 上创建 Swift Playgrounds app,只需要在 Swift Playgrounds 4.0 的主页面点击左下角的 “获取 Playground - app” 即可。

Swift Playgrounds 主页截图

新建的项目会随机选择一个颜色和图标作为默认的 icon。

新建的 Swift Playgrounds app 项目

打开项目后,我们在目录里只看到了 Myapp.swift 和 ContentView.swift 两个文件,其实 Swift Playgrounds 上创建的项目默认内容和 Xcode 上创建的是一样的,只不过这里 Package.swift 和 Assets.xcassets 被隐藏了而已。

也就是说目前在 iPad 上几乎是无法编辑 Package.swift 的(除非极个别情况,比如 Package.swift 内容出现缺少逗号等让 Swift Playgrounds 识别到并显示可提供解决方案的简单错误,点击报错建议就可以进入 Package.swift 编辑。)

使用 iPad 编辑时,右侧默认提供的 app 预览要比 Xcode 上更加强大,可以自动运行,并且运行后可以支持网络、相机、AR 等功能,基本上通过预览就能够实现 app 运行的效果。

iPad 预览中使用相机功能

如果要对某个 SwifUI 视图进行预览,可以为其定义 PreviewProvider,通过右侧的预览界面底部的按钮可以在 app 预览和手动创建的预览之间进行切换。

iPad 预览

想要往项目中添加文件内容(swift 文件、文件夹、图片等),只需点击左上角的添加按钮即可。

iPad 添加文件内容

如果想要添加 Swift 包,点击上图中的 “Swift 软件包”,在弹出窗口输入要添加的包地址就可以抓取包内容了。

无论是 Xcode 还是 Swift Playgrounds ,通过 URL 添加包的都不太稳定,会出现搜不到包,或者 Xcode 能搜到,Swift Playgrounds 搜不到的情况。

iPad 通过 URL 添加 Swift 包

在 iPad 的编辑中,如果想要设置项目的 icon 和名称,可以点击文件列表顶部的 app 设置,使用 Swift Playgrounds 提供的图标 和色调,或者上传自己制作的图片。

iPad 设置项目名称和icon

将设置窗口拖至底部,就可以登录开发者账号,如果开发者账号购买了付费的开发者计划,就可以将 app 上传至 app Store Connect 审核上架。

iPad 项目上架

以上就是本文全部内容,如有疏漏或错误之处,欢迎私信交流 。

参考

【1】文章 - Swift Playgrounds app Projects :

https://skyaaron.com/posts/swiftpm-app-projects/