ios - 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
}
这些冻结的原因可能是什么?
解决方案
推荐阅读
- kdb - 从 .q 文件连接到 kdb+ DB
- r - 在R中的箭头图中为特定数据着色
- firebase - “AngularFirestoreCollectionGroup”类型上不存在属性“doc”
' - java - Woodstox/XML1.1/XSD 解析+验证和 XInclude
- docker - 将 docker 映像从 GCR 拉入 GKE 时出错“无法拉取映像 .... 403 Forbidden”
- python - Python 错误:列表索引必须是整数或切片,而不是元组
- typo3 - 如何使用 sys_category 生成多个新闻 XML 站点地图
- reactjs - redux-persist 存储后删除对象方法
- python - 如何在 Vscode 中看到 Python 类型冲突?
- django - 两个模型合二为一 UpdateView“Django”