Objective-C(NSUrl関係)

URLを設定する。
URLからサーバ名を取得してみる。
URLはファイルURLか?
URLをエスケープしてみる。
指定URLをSafariで開いてみる。
指定URLをwebViewにロードしてみる。
指定URLからテキストをゲットしてみる。

URLを設定する。

// HTTPからNSURL作成例
    NSURL *url = [NSURL URLWithString:@"http://ellidanus-b.ddo.jp/"];

URLからサーバ名を取得してみる。

// HTTPからNSURL作成例
    NSURL *url = [NSURL URLWithString:@"http://ellidanus-b.ddo.jp/"];
    // URLからサーバ名を取得してみよう。
    NSLog(@"%@", [url host]);

URLはファイルURLか?

ここ、 URLスキーム(httpとか)を欠いている状態でもファイルとはみなさない のに要注意。あくまで スキームとしてFile:〜が提示されている時だけFileURLとみなす ようだ。

    NSURL *url = [NSURL URLWithString:@"http://ellidanus-b.ddo.jp/"];
    NSURL *url2 = [NSURL URLWithString:@"file:///index.html"];
    // これはファイルのURLか?(Boolなので返り値はcharで?)
    NSLog(@"isFileURL: %d", [url isFileURL]); // これは偽
    BOOL y = [url2 isFileURL];
    NSLog(@"isFileURL: %d",y); // これは真

URLをエスケープしてみる。

ネタ元 http://qiita.com/uasi/items/f7bdf16a343c7264c8a5

+[NSURL fileURLWithPath:] は、 +[NSURL URLWithString:] と違って path に含まれる URL 特殊文字をエスケープする(?→%3Fなど)。またそれが返す NSURL オブジェクトは -isFileURL が真になっていて、 -URLByAppendingPathComponent: などの引数も同様にエスケープする。File URL にパラメータ文字列(例:?key=value)を含めるには、次ように +[NSURL URLWithString:relativeToURL:] を使う:

// こうする
NSURL *fileURL = [NSURL fileURLWithPath:path];
NSURL *URLWithParam = [NSURL URLWithString:@"?key=value" relativeToURL:fileURL];

指定URLをSafariで開いてみる。

「どこにもSafariって書いてないじゃん」って声がありそうだけど、これってつまり「環境指定のブラウザで開く」なんだよね。iOSデバイスでは結果としてSafariが呼ばれるだけ。

iOS用開発しかシラネって人には無意味な情報かもだけど、複数の環境で開発する人なら「(標準アプリ(SharedApplication)で)URLを開く」っていい方の方がわかりやすいと思う。

でもまぁ、名前ったってキタブ・アル・アジフをネクロノミコンって呼び替えるようなもので はあるか。うむ。

なおURLオブジェクトの定義やなんかの考え方はOOPによくある形なので説明不要。

    NSURL *url = [NSURL URLWithString:@"http://www.apple.com/jp/"];
    UIApplication *app = [UIApplication sharedApplication];
    [app openURL:url];

指定URLをwebViewにロードしてみる。

外部ブラウザでなく、iOS上のWebView上にロードしてみよう。あまり変わらないけどな。

なお、webViewには myWebViewという名をつけてある。

        // URLオブジェクトを作る
        NSURL *url = [NSURL URLWithString:@"http://www.apple.com/jp/"];
        // URLリクエストを作る
        NSURLRequest *urlreq = [NSURLRequest requestWithURL:url];
        // WebビューにWebページを読み込む。
        [_myWebView loadRequest:urlreq];

指定URLからテキストをゲットしてみる。

パラメータを含む場合やPOSTの場合は少し変わってくるので注意。

まず応答の収納場所を作る。応答は割り込みで返ってくるので単純な式で代入できないためだ。ここでは簡単にプロパティ「string」を作ってみた。

次に実際の処理。指定URLを組み込んでリクエスト発行するだけなので、voidで作成。

あとは見れば想像つくと思う。

HTTPレスポンスをUTF-8エンコーディングとして取り出しているが、これは試験データにUTF-8のRSSデータを使ったため。もちろんCP932の時などはそれに応じたものにしなければならない。

あと、statusコードの200の意味についてはHTTPの応答コードである。言うまでもないが、あえて書けば「正常終了」って意味である。ここが500や404、403等だとデータが正しく取得できていないのでデータは保存されない。

#import "testappViewController.h"

@interface testappViewController ()
@property (retain, readwrite, nonatomic) NSString *string;

- (void) stringURL:(NSString *)url;
@end

@implementation testappViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // URLにパラメータが含まれるとき、POST等ではやり方が異なる。
    [self stringURL:@"http://取得元データのURL"];
    NSLog(@"END\n------\n%@\n---------",_string);
}

- (void)stringURL:(NSString *)url{
    NSURLSession *aSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    [[aSession dataTaskWithURL:[NSURL URLWithString:url] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (((NSHTTPURLResponse *)response).statusCode == 200) {
            if (data) {
                NSString *contentOfURL = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                //NSLog(@"%@", contentOfURL);
                _string = contentOfURL;
                NSLog(@"%@", _string);
                NSLog(@"--:)-------------");
            }
        }
    }] resume];
}