应用拒绝NSUrlConnection IPv6网络问题iOS



iTunes App被拒绝

原因:

我们在iPhone上审查你的应用程序时发现了一个或多个漏洞在Wi-Fi连接到IPv6网络上运行iOS 9.3.4

具体来说,应用程序内容加载失败。

我们在NAT64网络(从mac设置)中测试了它,工作正常,但苹果审查小组在IPv6网络中有一个问题。

我们使用NSURLConnection来调用web service,但是得到nil响应。

NSURLConnection:connectionDidFinishLoading:被调用,但在IPv6网络中得到nil NSData响应,它在IPv4网络中工作良好

解析代码

NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions | NSJSONReadingAllowFragments | NSJSONReadingMutableContainers error:&error];

解析错误,因为nil receivedData:数据不能被读取,因为它不是正确的格式

这一切都工作在IPv4网络,也在IPv6 connectionDidFinishLoading:调用,但为什么得到nil响应?

修改你的应用NSURLSession。使用此委托方法获取响应

service url = "你在这里解析你的url ";

 NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
    NSURL * url = [NSURL URLWithString:serviceurl];
    NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url];
    NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithRequest:urlRequest];
    [dataTask resume];

在这个委托方法中,您只需复制并粘贴您的connectionDidFinishLoading, connectionDidReceiveResponse, connectionDidReceiveData, connectionDidFailWithError应该在(NSURLSession *)会话任务的else部分:

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
    didReceiveResponse:(NSURLResponse *)response
     completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
    {
        NSLog(@"### handler 1");
        [self.responseData setLength:0];
        completionHandler(NSURLSessionResponseAllow);
    }
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
        didReceiveData:(NSData *)data
    {

    }
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
    didCompleteWithError:(NSError *)error
    {
        if(error == nil)
        {
            NSLog(@"Download is Succesfull");
        }
        else
        {
            NSLog(@"Error %@",[error userInfo]);
        }
    }

我认为这对你有帮助。

最新更新