我正试图创建共享扩展,需要网址和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的新手,对这个问题了解甚少:-)感谢三一的帮助。谢谢
1条答案
按热度按时间kadbb4591#
由于您在发出http请求后立即调用self.extensionContext!.completeRequest(),因此会得到不一致的结果。
当你调用completeRequest()时,你告诉操作系统你的扩展已经完成,操作系统将终止你的扩展。它最初成功可能是偶然的,那时你有一个非常快的连接,http请求有机会在操作系统终止你的扩展之前发出。
为了确保html被发送出去,你需要把你对completRequest()的调用移到http tasks响应中,在那里放一个超时值可能是个好主意,以防你的服务器在一段时间内没有响应(尽管如果在一段时间后没有收到响应,操作系统可能会杀死你的扩展)。
但是你有没有考虑过如果没有连接或者服务器宕机了怎么办?你不能等着以后再用扩展重试,那么你该怎么办?
您需要考虑类似这样的事情来彻底地构建您的扩展和应用。