SWIFT、iOS、共享扩展、url和html

bf1o4zei  于 2023-01-22  发布在  iOS
关注(0)|答案(1)|浏览(165)

我正试图创建共享扩展,需要网址和html并将其发送到服务器。代码工作2次,比停止。我真的迷路了。请帮助:

override func didSelectPost() {
        let url = self.extensionContext!.inputItems[0] as! NSExtensionItem
        let itemProvider = url.attachments![0] as NSItemProvider
        
        if itemProvider.hasItemConformingToTypeIdentifier("public.url") {
            itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil) { (url, error) in
                if let error = error {
                    // Handle error
                    return
                }
                
                guard let shareURL = url as? URL else {
                    return
                }
                
                // Get the HTML
                guard let htmlString = try? String(contentsOf: shareURL) else {
                    return
                }
                
                let shareData = ShareData(url: shareURL.absoluteString, html: htmlString)
                guard let jsonData = try? JSONEncoder().encode(shareData) else {
                    return
                }
                
                // Do  sending it to a server
                let token = UserDefaults(suiteName: "group.com.readout.app")?.string(forKey: "FirebaseAccessToken")
                            let url = URL(string: "http://blabla.com/api/article")!
                            var request = URLRequest(url: url)
                            request.httpMethod = "POST"
                            request.setValue("application/json", forHTTPHeaderField: "Content-Type")
                            request.setValue("Bearer \(token ?? "")", forHTTPHeaderField: "Authorization")
                            request.httpBody = jsonData
                            
                            let task = URLSession.shared.dataTask(with: request) { data, response, error in
                                if let error = error {
                                    // Handle error
                                    return
                                }
                                
                                guard let response = response as? HTTPURLResponse else {
                                    return
                                }
                                
                                if response.statusCode == 200 {
                                    // Successfully sent data
                                } else {
                                    // Handle non-200 response
                                }
                            }
                            task.resume()
                        }
                    }

                self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
    }

我检查了我从主应用程序收到的令牌。而且很奇怪,扩展程序随机地用完全相同的代码工作了2次。但是现在,我无法重现成功的案例。我是swift的新手,对这个问题了解甚少:-)感谢三一的帮助。谢谢

kadbb459

kadbb4591#

由于您在发出http请求后立即调用self.extensionContext!.completeRequest(),因此会得到不一致的结果。
当你调用completeRequest()时,你告诉操作系统你的扩展已经完成,操作系统将终止你的扩展。它最初成功可能是偶然的,那时你有一个非常快的连接,http请求有机会在操作系统终止你的扩展之前发出。
为了确保html被发送出去,你需要把你对completRequest()的调用移到http tasks响应中,在那里放一个超时值可能是个好主意,以防你的服务器在一段时间内没有响应(尽管如果在一段时间后没有收到响应,操作系统可能会杀死你的扩展)。
但是你有没有考虑过如果没有连接或者服务器宕机了怎么办?你不能等着以后再用扩展重试,那么你该怎么办?
您需要考虑类似这样的事情来彻底地构建您的扩展和应用。

相关问题