Привет!
Я новичок в IOS разработке. Делаю свой первый проект и хочу реализовать небольшое приложение, которое позволит сохранять любимые ссылки из браузера. Я использую SwiftUI для основного приложения + компонент Share Extension, чтобы передать ссылку в основное приложение из браузера. Последовательность действий выглядит так: я нахожу интересный сайт, нажимаю кнопку «Поделиться» и выбираю значок своего приложения. Затем открывается мое приложение и там я вижу ссылку. Проблема в том, что после этого браузер полностью зависает и приходится его закрывать и открывать заново, происходит это не всегда, примерно в 70% случаев. Причем, если подключаю телефон к маку и запускаю приложение в debug режиме, то ничего не виснет.
Код share extension:
@objc(ShareExtensionViewController)
class ShareViewController: UIViewController {
private static let URL_STORAGE_KEY = "url"
private static let APP_URL = "MyApp://"
private static let APP_GROUP_NAME = "group.ru.myapp"
override func viewDidLoad() {
super.viewDidLoad()
// set link to UserDefaults
handleShared()
// open main app from extension
openMainApp()
}
@objc
@discardableResult
func openURL(_ url: URL) -> Bool {
var responder: UIResponder? = self
while responder != nil {
if let application = responder as? UIApplication {
return application.perform(#selector(openURL(_:)), with: url) != nil
}
responder = responder?.next
}
return false
}
private func openMainApp() {
DispatchQueue.global(qos: .background).async {
self.extensionContext?.completeRequest(returningItems: nil, completionHandler: { _ in
let url = URL(string: ShareViewController.APP_URL)!
self.openURL(url)
})
}
}
private func handleShared() {
let attachments = (extensionContext?.inputItems.first as? NSExtensionItem)?.attachments ?? []
let contentType = kUTTypeURL as String
for provider in attachments {
if provider.hasItemConformingToTypeIdentifier(contentType) {
provider.loadItem(forTypeIdentifier: contentType, options: nil) {
[unowned self] (data, error) in
guard error == nil else {
return
}
let userDefaults = UserDefaults(suiteName: ShareViewController.APP_GROUP_NAME)!
userDefaults.set(data, forKey: ShareViewController.URL_STORAGE_KEY)
}
}
}
}
}
Фрагмент основного приложения, который читает ссылку из UserDefaults:
static func tryGetLink() -> String? {
let userDefaults = UserDefaults(suiteName: DataStorage.APP_GROUP)
return userDefaults?.object(forKey: URL_KEY) as? String
}
В чем может быть проблема?