objective-cでウェブ上のテキストを取得したい
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 2,184

退会済みユーザー
そこで、アドバイスをいただきたいと思って再度質問させていただきます。
objective-cでウェブ上のテキストを取得したいのですが、
最初は
http://www.yoheim.net/blog.php?q=20120605
上記のサイトを参考に、NSURLConnectionで進めていたのですが、
実行しようとするとNSURLConnectionはダメよ!みたいなエラーが出てしまいました。
そこで調べてみると今はNSURLConnectionより便利なNSURLSessionを使うようになっているようでして、
NSURLSessionでウェブ上のテキストを取得ができないかとくまなく検索をかけたのですが、
ウェブ上の画像取得方法などはあるのですがテキストの取得方法はなかなか参考になるサイトが見当たりませんでした。
objective-cでウェブ上のテキストを取得するには具体的にどのようにすればいいのでしょうか。
参考サイトでも構いません。
よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
実行しようとするとNSURLConnectionはダメよ!みたいなエラーが出てしまいました。そのエラーとやらを記載してくださいね。おそらく下記のような出力があったのでしょう。
'connectionWithRequest:delegate:' is deprecated: first deprecated in iOS 9.0 - Use NSURLSession (see NSURLSession.h)
先の質問でバージョンを明記していれば、避けられたかもしれません。曖昧な質問には曖昧な回答しかできません。無駄な時間を過ごすのはお互いに不幸です。
さて、では本題。
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// NSURLSessionConfiguration を作成する
NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
// NSURLSession を作成する
NSURLSession* session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:nil delegateQueue:nil];
// リクエストを作成する
// API (GET http://amazingengine.co.jp/mame/counter.php)
NSURL* URL = [NSURL URLWithString:@"http://amazingengine.co.jp/mame/counter.php"];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:URL];
request.HTTPMethod = @"GET";
// NSURLSessionDataTask を作成し、通信処理を登録する
NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error == nil) {
// データを取り出す
NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"dataAsString: %@", responseString);
}
else {
// 失敗時エラー出力
NSLog(@"NSURLSessionDataTask Failed: %@", [error localizedDescription]);
}
}];
// 通信を開始する
[task resume];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@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
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
参考ページ
From NSURLConnection to NSURLSession
NSURL *URL = [NSURL URLWithString:@"http://www.yoheim.net/"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
NSString *html = [[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding];
NSLog(@"html = %@",html);
}];
[task resume];
デリゲートにて取得する場合は以下
参考ページ
iOS 弱者が NSURLConnection を NSURLSession に置き換えた話
@interface ViewController ()<NSURLSessionDelegate> {
NSMutableData *receivedData;
}
// HTTPリクエスト
NSURL *URL = [NSURL URLWithString:@"http://www.yoheim.net/"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration
delegate:self
delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
[task resume];
/**
* HTTPリクエストのデリゲートメソッド(データ受け取り初期処理)
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {
// 保持していたレスポンスのデータを初期化
// receiveDataはフィールド変数
receivedData = [[NSMutableData alloc] init];
// didReceivedData と didCompleteWithError が呼ばれるように、通常継続の定数をハンドラーに渡す
completionHandler(NSURLSessionResponseAllow);
}
/**
* HTTPリクエストのデリゲートメソッド(受信の度に実行)
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
// 1つのパケットに収まらないデータ量の場合は複数回呼ばれるので、データを追加していく
[receivedData appendData:data];
}
/**
* HTTPリクエストのデリゲートメソッド(完了処理)
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
if (error) {
// HTTPリクエスト失敗処理
} else {
// HTTPリクエスト成功処理
NSString *html = [[NSString alloc] initWithBytes:receivedData.bytes length:receivedData.length encoding:NSUTF8StringEncoding];
NSLog(@"html = %@",html);
}
}
そもそも以下の内容で通信ができない場合があるのでこちらも確認してみてください。
[iOS 9] iOS 9 で追加された App Transport Security の概要
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
2015/12/02 12:51
久しぶりにXcodeを立ち上げたのですっかり抜け落ちておりました。申し訳ありませんでした。