首页 > 解决方案 > IOS 应用程序在链接共享后冻结

问题描述

我是ios开发新手。我正在做我的第一个项目,我想实现一个小应用程序,允许从浏览器中保存最喜欢的链接。我正在将 SwiftUI 用于主应用程序 + 共享扩展组件,以从浏览器传递到主应用程序的链接。流程如下所示:我找到了一个有趣的站点,单击“共享”按钮并选择我的应用程序的图标。之后,我的应用程序打开,在那里我看到了我的链接。这工作成功,但之后浏览器完全冻结。如果我发布其他应用程序的链接,也会发生同样的事情。

下面是共享扩展的代码和读取链接的主应用程序的组件:

@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)
                }
            }
        }
    }
}

主要应用程序代码片段:

static func tryGetLink() -> String? {
    let userDefaults = UserDefaults(suiteName: DataStorage.APP_GROUP)
    return userDefaults?.object(forKey: URL_KEY) as? String
}

这些冻结的原因可能是什么?

标签: iosswiftswiftui

解决方案


推荐阅读