Как написать приложение UIKit, включающее платформу GroupActivities

Надеюсь, вы все в безопасности и здоровы.

Я смотрел видео Apple WWDC 2021 о том, как написать приложение для iOS с настраиваемыми групповыми действиями, ссылка здесь: https://developer.apple.com/videos/play/wwdc2021/10187/

После просмотра этого видео я попытался написать собственное простое приложение, используя UIKit вместо SwiftUI. Это простое приложение, использующее UIAlert для добавления строк в UITableView. Я написал его, используя Xcode 13 beta 4, работающий на macOS Monterey 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

У меня следующие вопросы:

  1. Поскольку я использую UIKit и SwiftUI, я не могу использовать .taskмодификатор. Итак, я создал асинхронную задачу в viewDidLoad()вместо этого настроить сеанс групповой активности. Это правильный способ делать что-то или есть лучший способ?
  2. Все, что мне нужно протестировать, - это иметь два устройства под управлением iOS 15 b4 с одним и тем же установленным приложением или один Mac с macOS 12 b4 и одно устройство iOS с iOS 15 b4, верно?

Заранее спасибо. Приносим извинения за любое нарушение, это непреднамеренно, так как я впервые публикую на StackOverflow. Любая помощь, мысли, комментарии очень приветствуются.

Будьте в безопасности и берегите себя.

1 ответ

Решение

Протестировали мое приложение, и оно работает!

  1. Не знаю, остается ли это лучшим решением, но создание асинхронной задачи в viewDidLoad() у меня сработало.
  2. да. Я тестировал свое приложение на Intel Mac под управлением macOS 12 b4 и iPhone SE под управлением iOS 15 b4.

Надеюсь, кому-то это пригодится.

Будьте в безопасности и берегите себя.

Другие вопросы по тегам