従って、IPv6をサポートしないNSURLConnectionを通信に使用しているアプリは2016年6月1日以降の審査提出分について、リジェクトされる。
Supporting IPv6-only Networks
https://developer.apple.com/news/?id=05042016a
Supporting IPv6 in iOS 9
https://developer.apple.com/news/?id=08282015a
いずれ今後のiOSメジャーアップデートで、IPv6をサポートしないアプリは動作しなくなる可能性があることから、IPv6をサポートしないNSURLConnectionから、IPv6をサポートするNSURLSession またはCFNetworkを使用して通信するように改修が必要である。
NSURLSessionではバックグラウンドでデータをダウンロード・アップロードしたりと多くの機能を持つが、NSURLConnectionを使って単なるデータのダウンロードをしているだけの機能を有する場合は、移行は比較的簡単である。
hogeViewController.h
<変更前>
@interface hogeViewController : UIViewController <NSURLConnectionDelegate>
{
@property (nonatomic, retain) NSMutableData *data; // ダウンロードしたデータの格納先
}
<変更後>
@interface hogeViewController : UIViewController <NSURLSessionDelegate>
{
@property (nonatomic, retain) NSMutableData *data; // ダウンロードしたデータの格納先
}
hogeViewController.m
1. ダウンロードの開始
<変更前>
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://hoge.com/"]]; // ダウンロードURLの作成
NSURLConnection *feedConnection = [[NSURLConnection alloc] initWithRequest: urlRequest delegate:self]; // ダウンロードの開始
<変更後>
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://hoge.com/"]]; // ダウンロードURLの作成
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; // セッションの種類
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration
delegate:self
delegateQueue:[NSOperationQueue mainQueue]]; // セッションの作成
NSURLSessionDataTask *task = [session dataTaskWithRequest: urlRequest]; // タスクの作成
[task resume]; // タスクの実行
2. ダウンロードの開始直後
<変更前>
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
self.data = [[NSMutableData data] init]; // ダウンロードしたデータの格納先を初期化
}
<変更後>
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {
self.data = [[NSMutableData data] init]; // ダウンロードしたデータの格納先を初期化
completionHandler(NSURLSessionResponseAllow); // didReceivedData と didCompleteWithErrorが呼ばれるように定数を処理継続のハンドラーに渡す
}
3. ダウンロードされたデータの追加
<変更前>
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[self.data appendData:data];
}
<変更後>
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
[self.data appendData:data];
}
4. ダウンロードエラーの通知
<変更前>
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
if ([error code] == kCFURLErrorNotConnectedToInternet) {
} else {
}
}
<変更後>
NSURLSessionでは、「5. ダウンロード完了通知」に示す
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {で、ダウンロード完了通知とエラー通知を同時に受け取る。
5. ダウンロード完了通知
<変更前>
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
<変更後>
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
if (error) {
// エラー処理
} else {
// ダウンロードされたデータのパースなどの処理
}
}
- (void)URLSession:(NSURLSession *)sessionでダウンロード完了通知を受け取ることも可能だが、上記事例ではこのデリゲートは呼ばれない。
downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
参考記事:
http://qiita.com/akitaika_/items/2f4fca20a82cb6895329
http://qiita.com/aKentaKoyama/items/96a979ab3a140e7b39ec
https://www.gaprot.jp/pickup/ios7/background-fetch
http://blog.techfirm.co.jp/2013/11/25/ios-7-nsurlsessionでバックグラウンド通信をする/
【NSURLSessionの最新記事】
https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html
またはNSURLConnectionを使用している場合リジェクトされるというのは公式の情報でしょうか?
>>>>
because IPv6 is already supported by NSURLSession and CFNetwork APIs.
>>>>
を読む限り、NSURLConnectionもCFNetworkの一つなので、IPv6に対応してると思われますが・・