Как написать приложение 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()
}
}
Вы можете скачать это здесь:
У меня следующие вопросы:
- Поскольку я использую UIKit и SwiftUI, я не могу использовать
.task
модификатор. Итак, я создал асинхронную задачу вviewDidLoad()
вместо этого настроить сеанс групповой активности. Это правильный способ делать что-то или есть лучший способ? - Все, что мне нужно протестировать, - это иметь два устройства под управлением iOS 15 b4 с одним и тем же установленным приложением или один Mac с macOS 12 b4 и одно устройство iOS с iOS 15 b4, верно?
Заранее спасибо. Приносим извинения за любое нарушение, это непреднамеренно, так как я впервые публикую на StackOverflow. Любая помощь, мысли, комментарии очень приветствуются.
Будьте в безопасности и берегите себя.
1 ответ
Протестировали мое приложение, и оно работает!
- Не знаю, остается ли это лучшим решением, но создание асинхронной задачи в viewDidLoad() у меня сработало.
- да. Я тестировал свое приложение на Intel Mac под управлением macOS 12 b4 и iPhone SE под управлением iOS 15 b4.
Надеюсь, кому-то это пригодится.
Будьте в безопасности и берегите себя.