先ほど似た質問したのですが、新たに問題が発生し、調べまくってもう1歩のところまでいくんですがエラーでうまくいきません。
そこで、アドバイスをいただきたいと思って再度質問させていただきます。
objective-cでウェブ上のテキストを取得したいのですが、
最初は
http://www.yoheim.net/blog.php?q=20120605
上記のサイトを参考に、NSURLConnectionで進めていたのですが、
実行しようとするとNSURLConnectionはダメよ!みたいなエラーが出てしまいました。
そこで調べてみると今はNSURLConnectionより便利なNSURLSessionを使うようになっているようでして、
NSURLSessionでウェブ上のテキストを取得ができないかとくまなく検索をかけたのですが、
ウェブ上の画像取得方法などはあるのですがテキストの取得方法はなかなか参考になるサイトが見当たりませんでした。
objective-cでウェブ上のテキストを取得するには具体的にどのようにすればいいのでしょうか。
参考サイトでも構いません。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ブロックにて取得する方法は以下
参考ページ
From NSURLConnection to NSURLSession
objectivec
1 2NSURL *URL = [NSURL URLWithString:@"http://www.yoheim.net/"]; 3NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 4 5NSURLSession *session = [NSURLSession sharedSession]; 6NSURLSessionDataTask *task = [session dataTaskWithRequest:request 7 completionHandler: 8 ^(NSData *data, NSURLResponse *response, NSError *error) { 9 10 NSString *html = [[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding]; 11 NSLog(@"html = %@",html); 12 13 }]; 14 15[task resume];
デリゲートにて取得する場合は以下
参考ページ
iOS 弱者が NSURLConnection を NSURLSession に置き換えた話
objectivec
1 2@interface ViewController ()<NSURLSessionDelegate> { 3 NSMutableData *receivedData; 4} 5 6// HTTPリクエスト 7NSURL *URL = [NSURL URLWithString:@"http://www.yoheim.net/"]; 8NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 9NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; 10NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration 11 delegate:self 12 delegateQueue:[NSOperationQueue mainQueue]]; 13NSURLSessionDataTask *task = [session dataTaskWithRequest:request]; 14[task resume]; 15 16 17/** 18 * HTTPリクエストのデリゲートメソッド(データ受け取り初期処理) 19 */ 20- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask 21didReceiveResponse:(NSURLResponse *)response 22 completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { 23 // 保持していたレスポンスのデータを初期化 24 25 // receiveDataはフィールド変数 26 receivedData = [[NSMutableData alloc] init]; 27 28 // didReceivedData と didCompleteWithError が呼ばれるように、通常継続の定数をハンドラーに渡す 29 completionHandler(NSURLSessionResponseAllow); 30} 31 32/** 33 * HTTPリクエストのデリゲートメソッド(受信の度に実行) 34 */ 35- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { 36 // 1つのパケットに収まらないデータ量の場合は複数回呼ばれるので、データを追加していく 37 [receivedData appendData:data]; 38} 39 40/** 41 * HTTPリクエストのデリゲートメソッド(完了処理) 42 */ 43- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { 44 if (error) { 45 // HTTPリクエスト失敗処理 46 47 } else { 48 // HTTPリクエスト成功処理 49 NSString *html = [[NSString alloc] initWithBytes:receivedData.bytes length:receivedData.length encoding:NSUTF8StringEncoding]; 50 NSLog(@"html = %@",html); 51 } 52}
そもそも以下の内容で通信ができない場合があるのでこちらも確認してみてください。
[iOS 9] iOS 9 で追加された App Transport Security の概要
投稿2015/12/01 22:32
総合スコア8490
0
ベストアンサー
実行しようとするとNSURLConnectionはダメよ!みたいなエラーが出てしまいました。
そのエラーとやらを記載してくださいね。おそらく下記のような出力があったのでしょう。
lang
1'connectionWithRequest:delegate:' is deprecated: first deprecated in iOS 9.0 - Use NSURLSession (see NSURLSession.h)
先の質問でバージョンを明記していれば、避けられたかもしれません。曖昧な質問には曖昧な回答しかできません。無駄な時間を過ごすのはお互いに不幸です。
さて、では本題。
lang
1#import "ViewController.h" 2 3@interface ViewController () 4 5@end 6 7@implementation ViewController 8 9 10- (void)viewDidLoad { 11 [super viewDidLoad]; 12 // Do any additional setup after loading the view, typically from a nib. 13 // NSURLSessionConfiguration を作成する 14 NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; 15 16 // NSURLSession を作成する 17 NSURLSession* session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:nil delegateQueue:nil]; 18 19 // リクエストを作成する 20 // API (GET http://amazingengine.co.jp/mame/counter.php) 21 22 NSURL* URL = [NSURL URLWithString:@"http://amazingengine.co.jp/mame/counter.php"]; 23 NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:URL]; 24 request.HTTPMethod = @"GET"; 25 26 // NSURLSessionDataTask を作成し、通信処理を登録する 27 NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 28 if (error == nil) { 29 // データを取り出す 30 NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 31 NSLog(@"dataAsString: %@", responseString); 32 } 33 else { 34 // 失敗時エラー出力 35 NSLog(@"NSURLSessionDataTask Failed: %@", [error localizedDescription]); 36 } 37 }]; 38 // 通信を開始する 39 [task resume]; 40 41} 42 43- (void)didReceiveMemoryWarning { 44 [super didReceiveMemoryWarning]; 45 // Dispose of any resources that can be recreated. 46} 47 48@end
iOS9 では、App Transport Security(ATS) という機構が有効になっていて、HTTP での接続ができません。そのため、サーバ側を HTTPS での通信ができるように対応するか、ATS を無効または一部無効にする必要があります。
File.plistとATSに関して(18725)|teratail
わからないようであれば、Google で App Transport Security
のキーワードで検索してください。
レスポンスヘッダを見ると、JSON を受け取りたいのでしょうか。
HTTP/1.1 200 OK Server: nginx/1.4.6 (Ubuntu) Date: Tue, 01 Dec 2015 21:22:59 GMT Content-Type: application/json; charset=utf-8 Transfer-Encoding: chunked Connection: close X-Powered-By: PHP/5.5.9-1ubuntu4.11 "157563"
JSON の取り回しなども考えているのでしたら、AFNetworking
などのライブラリを活用した方が楽かもしれません。ご検討ください。
AFNetworking/AFNetworking
投稿2015/12/01 22:28
総合スコア1698
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/12/02 03:50