Ios 即使没有internet连接,如何将数据和图像发布到服务器中
您好,我正在处理http POST数据和图像,当wifi/互联网连接可用时,它工作良好。但当关闭移动数据/wifi时,会出现如下问题:Ios 即使没有internet连接,如何将数据和图像发布到服务器中,ios,swift,swift2,Ios,Swift,Swift2,您好,我正在处理http POST数据和图像,当wifi/互联网连接可用时,它工作良好。但当关闭移动数据/wifi时,会出现如下问题: error=Optional(Error Domain=NSURLErrorDomain Code=-1009 "The Internet connection appears to be offline." UserInfo={NSErrorFailingURLStringKey=http://moneymonkey.tokiiyo.com/api/polic
error=Optional(Error Domain=NSURLErrorDomain Code=-1009 "The Internet connection appears to be offline." UserInfo={NSErrorFailingURLStringKey=http://moneymonkey.tokiiyo.com/api/policy, _kCFStreamErrorCodeKey=8, NSErrorFailingURLKey=http://moneymonkey.tokiiyo.com/api/policy, NSLocalizedDescription=The Internet connection appears to be offline., _kCFStreamErrorDomainKey=12, NSUnderlyingError=0x16ef25f0 {Error Domain=kCFErrorDomainCFNetwork Code=-1009 "(null)" UserInfo={_kCFStreamErrorDomainKey=12, _kCFStreamErrorCodeKey=8}}})
func barButtonItemClicked(barButtonItem: UIBarButtonItem)
{
let myUrl = NSURL(string: "http://moneymonkey.tokiiyo.com/api/policy");
let typeItem: InsuranceType = InsuranceManager.sharedInstance.TypeArray[0]
//let typeItem = InsuranceManager.sharedInstance
let compItem = InsuranceManager.sharedInstance
let request = NSMutableURLRequest(URL:myUrl!);
request.HTTPMethod = "POST";
let param = [
"api_key" : "AiK58j67",
"api_secret" : "a#9rJkmbOea90-",
"phone" : "\(mobile)",
"policy_type" : "\(typeItem.name)",
"company" : "\(compItem.selectedCompany.cname)"
]
print("Policy_type: \(typeItem.name)")
print("Company: \(compItem.selectedCompany.cname)")
let boundary = generateBoundaryString()
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let imageData = uploadImage?.highestQualityJPEGNSData
if(imageData==nil) { return; }
request.HTTPBody = createBodyWithParameters(param, filePathKey: "file[]", imageDataKey: imageData!, boundary: boundary)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error=\(error)")
return
}
// You can print out response object
print("******* response = \(response)")
// Print out reponse body
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("****** response data = \(responseString!)")
do{
_ = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary
dispatch_async(dispatch_get_main_queue(),{
});
}
catch
{
// report error
print("Oops!! Something went wrong\(error)")
}
}
task.resume()
let alert = UIAlertController(title: "Message", message:"Your document was uploaded successfully to our Server.", preferredStyle: .Alert)
let action = UIAlertAction(title: "DONE", style: .Default) { _ in
// Put here any code that you would like to execute when
// the user taps that OK button (may be empty in your case if that's just
// an informative alert)
self.performSegueWithIdentifier("listSegue", sender: self)
}
alert.addAction(action)
self.presentViewController(alert, animated: true){}
}
func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData {
let body = NSMutableData();
if parameters != nil {
for (key, value) in parameters! {
body.appendString1("--\(boundary)\r\n")
body.appendString1("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
body.appendString1("\(value)\r\n")
}
}
let filename = "upload.png"
let mimetype = "image/jpeg"
body.appendString1("--\(boundary)\r\n")
body.appendString1("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
body.appendString1("Content-Type: \(mimetype)\r\n\r\n")
body.appendData(imageDataKey)
body.appendString1("\r\n")
body.appendString1("--\(boundary)--\r\n")
return body
}
func generateBoundaryString() -> String {
return "Boundary-\(NSUUID().UUIDString)"
}
extension NSMutableData {
func appendString1(string: String) {
let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
appendData(data!)
}
}
我使用HTTP post方法的代码如下:
error=Optional(Error Domain=NSURLErrorDomain Code=-1009 "The Internet connection appears to be offline." UserInfo={NSErrorFailingURLStringKey=http://moneymonkey.tokiiyo.com/api/policy, _kCFStreamErrorCodeKey=8, NSErrorFailingURLKey=http://moneymonkey.tokiiyo.com/api/policy, NSLocalizedDescription=The Internet connection appears to be offline., _kCFStreamErrorDomainKey=12, NSUnderlyingError=0x16ef25f0 {Error Domain=kCFErrorDomainCFNetwork Code=-1009 "(null)" UserInfo={_kCFStreamErrorDomainKey=12, _kCFStreamErrorCodeKey=8}}})
func barButtonItemClicked(barButtonItem: UIBarButtonItem)
{
let myUrl = NSURL(string: "http://moneymonkey.tokiiyo.com/api/policy");
let typeItem: InsuranceType = InsuranceManager.sharedInstance.TypeArray[0]
//let typeItem = InsuranceManager.sharedInstance
let compItem = InsuranceManager.sharedInstance
let request = NSMutableURLRequest(URL:myUrl!);
request.HTTPMethod = "POST";
let param = [
"api_key" : "AiK58j67",
"api_secret" : "a#9rJkmbOea90-",
"phone" : "\(mobile)",
"policy_type" : "\(typeItem.name)",
"company" : "\(compItem.selectedCompany.cname)"
]
print("Policy_type: \(typeItem.name)")
print("Company: \(compItem.selectedCompany.cname)")
let boundary = generateBoundaryString()
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let imageData = uploadImage?.highestQualityJPEGNSData
if(imageData==nil) { return; }
request.HTTPBody = createBodyWithParameters(param, filePathKey: "file[]", imageDataKey: imageData!, boundary: boundary)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error=\(error)")
return
}
// You can print out response object
print("******* response = \(response)")
// Print out reponse body
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("****** response data = \(responseString!)")
do{
_ = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary
dispatch_async(dispatch_get_main_queue(),{
});
}
catch
{
// report error
print("Oops!! Something went wrong\(error)")
}
}
task.resume()
let alert = UIAlertController(title: "Message", message:"Your document was uploaded successfully to our Server.", preferredStyle: .Alert)
let action = UIAlertAction(title: "DONE", style: .Default) { _ in
// Put here any code that you would like to execute when
// the user taps that OK button (may be empty in your case if that's just
// an informative alert)
self.performSegueWithIdentifier("listSegue", sender: self)
}
alert.addAction(action)
self.presentViewController(alert, animated: true){}
}
func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData {
let body = NSMutableData();
if parameters != nil {
for (key, value) in parameters! {
body.appendString1("--\(boundary)\r\n")
body.appendString1("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
body.appendString1("\(value)\r\n")
}
}
let filename = "upload.png"
let mimetype = "image/jpeg"
body.appendString1("--\(boundary)\r\n")
body.appendString1("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
body.appendString1("Content-Type: \(mimetype)\r\n\r\n")
body.appendData(imageDataKey)
body.appendString1("\r\n")
body.appendString1("--\(boundary)--\r\n")
return body
}
func generateBoundaryString() -> String {
return "Boundary-\(NSUUID().UUIDString)"
}
extension NSMutableData {
func appendString1(string: String) {
let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
appendData(data!)
}
}
请任何人指导我,即使没有互联网连接,如何上传。提前感谢如果互联网连接不可用,则无法上载数据
但若互联网不可用,您可以将该数据存储到本地数据库中,并且可以在出现互联网连接时发布该数据。并在上传数据后从本地数据库中删除。如果internet连接不可用,则无法上传数据
但若互联网不可用,您可以将该数据存储到本地数据库中,并且可以在出现互联网连接时发布该数据。并在上传数据后从本地数据库中删除。无法将数据上传到服务器。设备上的internet连接不可用。但您可以将数据保存在本地,同时在始终或某个时间间隔内检查可访问性,当到达时,将数据从本地数据库发送到服务器并从本地删除项目(如果需要)不可能将数据上载到服务器设备上的internet连接不可用。但您可以将数据保存在本地,同时在始终或某个时间间隔内检查可访问性,当到达时,将数据从本地数据库发送到服务器并从本地删除项目(如果需要)您不能。即使没有网络连接,你怎么能上传呢?你不能。即使没有网络连接,你如何上传?