2017-02-20 85 views
4

我有一个安全的webView,显示客户加载他的钱包。我传递安全信息MPIN(如一次性密码)。有问题的服务器日志“dataTaskWithRequest”在仅需要一个请求时请求NSMutableRequest两次

@IBOutlet weak var loading: UIActivityIndicatorView! 

@IBOutlet var lblLoading: UILabel! 


@IBOutlet weak var mob_webview: UIWebView! 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    mob_webview.hidden = true 
    mob_webview.delegate=self 
    cmmn.createDatabase() 
    linkgot = cmmn.geturl() 

    link="http://*****************************************.jsp?" 

    let request = NSMutableURLRequest(URL: NSURL(string: link)!) 
    request.HTTPMethod = "POST" 
    let postString = "recharge_type=\(_catcode)&amount=\(_amountfiled_got)&mobileNo=\(cmmn.getPhoneNumber())&prePostLan=\(prePostLan)&stdCode=\(_stdCode)&accNo=\(accNo)&deduct_frm=B&rcMobileNum=\(_numberfiled_got)&mobOperator=\(_merch_code)&operator=\(_operatr)&rcType=\(_rec_type)&mpin=\(_mpin)" 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     data, response, error in 

     if error != nil { 
      print("error=\(error)") 
      return 
     } 

     print("response = \(response)") 

     let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("responseString = \(responseString)") 
    } 
    task.resume() 
    mob_webview.loadRequest(request) 







    // Do any additional setup after loading the view. 
} 
func webViewDidFinishLoad(webView_Pages: UIWebView) 
{ 

    mob_webview.hidden = false 
    loading.hidden = true 
    lblLoading.hidden=true 
    print("OK") 

} 

响应: enter image description here enter image description here

在服务器中,如果用户键入的M-PIN 3次错误,他被阻止。这是根据服务器中错误的MPIN命中次数完成的。出于某种原因,我的web视图提出请求两次(即调用加载请求两次的链接),即使它只加载一次。假设客户输入错误的MPIN并加载web视图,链接被调用两次,他失去了两次机会输入正确的MPIN。我们的APP的Android版本与类似的请求正常工作。它的任何原因?

+5

发布您的代码 - 请求和完成处理程序。一条线是不够的。 – Roee84

+0

你有一个webview和正在做'NSURLSession'请求?这两者如何相关?也许webview正在发出一个请求,然后你用'NSURLSession'发出另一个请求。 –

+0

你可以请你清理你的代码吗?我们看到发生的事情真的不够好。 –

回答

4

在阅读完您的问题后,我浏览了苹果的参考文档。它说,然后webViewDidFinishLoad在webview中加载每个帧后调用。 Here is document

webViewDidFinishLoad:在web视图完成加载帧后发送。

请向服务器确认一次运行的请求数。它是2或1。还想知道在您的代码中执行了多少次打印语句print("response = \(response)")。因为我没有主持这个声明。

在你的问题中发现你调用NSURLSession的dataTaskWithRequest,并在Web视图中加载请求。这可能也是两次调用同一个事物的问题。如果你想在webview中打开请求,请不要使用NSURLSession任务请求。 运行它通过评论task.resume()

+0

我会尽快检查。 btb打印语句只会被执行一次,而不管我在服务器中是否命中......在发布此问题之前,我已经检查过它。 –

+0

2请求的主要原因是在Web视图中调用datataskrequest和加载请求。如果你评论'task.resume',你的问题将得到解决 – sschunara

+0

我会接受这个..你有我的赏金.. :) –

1

您要求您NSMutableURLRequest两次:

  1. 你把它传递给一个URLSessiondataTaskWithRequest方法。此方法在封闭中从请求中的URL返回数据。
  2. 您将其传递给您的UIWebViewloadRequest方法。此方法将您的请求的URL内容加载到您的UIWebView(您的mob_webview IBOutlet)中。

要解决此问题,您需要删除URLSession代码或UIWebView代码。你删除哪个取决于你想要做什么与服务器的响应 - 你想它作为数据,或者你想要加载它在web视图?如果你想要它作为数据,你应该使用URLSession并删除UIWebViewloadRequest。如果你想在webview中加载它,那么你应该使用UIWebView并删除任何UISession代码。

如果是URLSession代码,你需要删除,你应该删除以下的所有:

let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
    data, response, error in 

    if error != nil { 
     print("error=\(error)") 
     return 
    } 

    print("response = \(response)") 

    let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
    print("responseString = \(responseString)") 
} 
task.resume() 
+0

有什么新的答案比我的回答:) – sschunara

3

task.resume()和mob_webview.loadRequest(请求)将运行要求的两倍。

你最好删除任务。resume()在loadRequest之前。