应用程序拒绝 NSUrlConnection IPv6 网络问题 iOS

Posted

技术标签:

【中文标题】应用程序拒绝 NSUrlConnection IPv6 网络问题 iOS【英文标题】:App rejected NSUrlConnection IPv6 network issue iOS 【发布时间】:2016-08-10 11:55:57 【问题描述】:

iTunes 应用被拒绝。

原因:

在 iPhone 上审核时,我们在您的应用中发现了一个或多个错误 在连接到 IPv6 网络的 Wi-Fi 上运行 ios 9.3.4。

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

我们在 NAT64 网络(从 mac 设置)中对其进行了测试,它运行良好,但 Apple 审核团队遇到了 IPv6 网络问题。

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

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

json解析代码

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

由于nil receivedData 导致解析错误:数据无法读取,因为它的格式不正确

在 IPv4 网络中一切正常,在 IPv6 connectionDidFinishLoading: 中也可以正常工作,但为什么得到 nil 响应?

【问题讨论】:

【参考方案1】:

更改您的应用程序 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];

在此委托方法中,您只需复制并粘贴您的 connectionDidFinishLoadingconnectionDidReceiveResponseconnectionDidReceiveDataconnectionDidFailWithError 应该在 (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]);

        
    

我认为这对你有帮助。

【讨论】:

以上是关于应用程序拒绝 NSUrlConnection IPv6 网络问题 iOS的主要内容,如果未能解决你的问题,请参考以下文章

dial tcp <REMOTE-IP>:6379: connect: 连接被拒绝

IOS:多个 NSUrlConnection 以及多个 UIProgressBar

NSURLConnection 挂起

拒绝来自不是服务器 IP 的 UP 的 nodejs 连接 [重复]

127.0.0.1 拒绝了我们的连接请求--访问本地IP时显示拒绝访问

NSURLConnection 是不是保留其委托?