如何编写包含 GroupActivities 框架的 UIKit 应用程序

How to write a UIKit app incorporating the GroupActivities framework

我观看了 Apple 的 WWDC 2021 视频,介绍了如何编写具有自定义群组活动的 iOS 应用,link here

观看此视频后,我尝试使用 UIKit 而不是 SwiftUI 编写自己的简单应用程序。这是一个简单的应用程序,它使用 UIAlert 将字符串添加到 UITableView。我在 macOS Monterey beta 4 上使用 Xcode 13 beta 4 运行 编写了它。它似乎在我的 MacBook 上运行良好,但我没有设备 运行 iOS 15 beta 4 进行测试,在模拟器中无法运行。希望尽快测试。

与此同时,我想我应该分享代码。这是一个简单的应用程序,只有一个视图控制器,下面是其中的代码:

//
//  ViewController.swift
//  ShareOrder
//
//  Created by iOS 15 Programming on 28/07/2021.
//

import UIKit
import GroupActivities

class ViewController: UIViewController {
    
    var orders: [String] = []
    var groupSession: GroupSession<ShareOrder>?
    var messenger: GroupSessionMessenger?
    
    @IBOutlet var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "ShareOrder"
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "orderCell")
        Task {
            for await session in ShareOrder.sessions(){
                configureGroupSession(session)
            }
        }
    }
    
    @IBAction func activateGroupActivity(_ sender: Any) {
        ShareOrder().activate()
    }
    
    @IBAction func addOrder(_ sender: UIBarButtonItem) {
        
        let alert = UIAlertController(title: "New Order", message: "Add a new order", preferredStyle: .alert)
        
        let saveAction = UIAlertAction(title: "Save", style: .default) {
            [unowned self] action in
            guard let textField = alert.textFields?.first, let orderToSave = textField.text else {
                return
            }
            self.orders.append(orderToSave)
            if let messenger = messenger {
                Task {
                    do {
                        try await messenger.send(orderToSave)
                    } catch {
                        print("Failed to send")
                    }
                }
            }
            self.tableView.reloadData()
        }
        
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel)
        
        alert.addTextField()
        alert.addAction(saveAction)
        alert.addAction(cancelAction)
        present(alert, animated: true)
    }
    
}

extension ViewController: UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        orders.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "orderCell", for: indexPath)
        cell.textLabel?.text = orders[indexPath.row]
        return cell
    }
    
}

extension ViewController {
    
    struct ShareOrder: GroupActivity {
        var metadata: GroupActivityMetadata {
            var metadata = GroupActivityMetadata()
            metadata.title = NSLocalizedString("Share Order", comment: "Title of group activity")
            metadata.type = .generic
            return metadata
        }
    }
    
    func configureGroupSession(_ groupSession: GroupSession<ShareOrder>) {
        orders.removeAll()
        self.groupSession = groupSession
        let messenger = GroupSessionMessenger(session: groupSession)
        self.messenger = messenger
        Task.detached { [weak self] in
            for await (message, _) in messenger.messages(of: String.self) {
                await self?.handle(message)
            }
        }
        groupSession.join()
    }
    
    func handle(_ message: String) {
        self.orders.append(message)
        self.tableView.reloadData()
    }
}

您可以在这里下载:

ShareOrder app

我的问题如下:

  1. 由于我使用的是 UIKit 和 SwiftUI,因此无法使用 .task 修饰符。所以我在 viewDidLoad() 中创建了一个异步任务来配置组 activity 会话。这是做事的正确方法,还是有更好的方法?
  2. 我需要测试的是两台设备 运行 iOS 15 b4 安装了相同的应用程序,或者一台 Mac 运行 Mac OS 12 b4 和一个 iOS 设备 运行 iOS 15 b4,正确吗?

已测试我的应用程序,它可以正常工作!

  1. 不知道这是否仍然是最佳解决方案,但在 viewDidLoad() 中创建异步任务对我来说确实有效。
  2. 是的。我在 Intel Mac 运行 macOS 12 b4 和 iPhone SE 运行 iOS 15 b4.
  3. 上测试了我的应用程序