Estou tentando refatorar minha implementação existente para um aplicativo para que ele esteja em conformidade com o Swift 6. Para fazer isso, preciso tocar na seguinte classe que fornece uma extensão de compartilhamento "abrir URL no Safari":
import Foundation
import UIKit
public final class SafariActivity: UIActivity {
var url: URL?
// MARK: - UIActivity Implementation
public override var activityType: UIActivity.ActivityType {
.openInSafari
}
public override var activityTitle: String? {
"Open in Safari"
}
public override var activityImage: UIImage? {
UIImage(systemName: "safari")?.applyingSymbolConfiguration(.init(scale: .large))
}
public override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
// ERROR: Main actor-isolated class property 'shared' can not be referenced from a nonisolated context
activityItems.contains { $0 is URL ? UIApplication.shared.canOpenURL($0 as! URL) : false }
}
public override func prepare(withActivityItems activityItems: [Any]) {
// ERROR: Main actor-isolated class property 'shared' can not be referenced from a nonisolated context
url = activityItems.first { $0 is URL ? UIApplication.shared.canOpenURL($0 as! URL) : false } as? URL
}
public override func perform() {
if let url = url {
// ERROR: Call to main actor-isolated instance method 'open(_:options:completionHandler:)' in a synchronous nonisolated context
UIApplication.shared.open(url)
}
self.activityDidFinish(true)
}
}
extension UIActivity.ActivityType {
static let openInSafari = UIActivity.ActivityType(rawValue: "openInSafari")
}
extension UIActivity {
@MainActor public static let openInSafari = SafariActivity()
}
Eu luto para entender a maneira correta de restringir métodos que são substituições para o thread principal. Como posso fazer os métodos que substituí de UIActivity
isolate para @MainActor
?