Xcode で URLエンコーディング周りの処理



URL処理

さてさて、XcodeiPhone アプリを作る上でのちょっとしたこねた集第三弾です。
今回は、URLエンコーディング(URL Encoding)、URLデコーディング(URL Decoding)周りについて。
で、そのついでに、URLスキーム(URL Scheme) と呼ばれる URL のアドレスのような書式で、他のアプリにデータを渡しつつアプリを起動する処理の関連をまとめていきます。


URLデコーディング

まずは、URLデコーディングから。
というか、このあたりは、実際には、Xcode には関数が用意されていて、そのまま、それを書けばそれで済む、はずなんですが、どうもそうはいかない事例が発生してしまいます。
URLデコーディングの場合は、"stringByReplacingPercentEscapesUsingEncoding" の関数を使って、例えば下記のように書けば、エンコードされている orgStr は、decodedStr にデコードされる。
(ちなみに、"NSShiftJISStringEncoding"はエンコード元に合わせて、"NSUTF8StringEncoding"などに変更する必要がある。)

NSString *decodedStr = [orgStr stringByReplacingPercentEscapesUsingEncoding:NSShiftJISStringEncoding];



ただ、これだと私の場合は、空白文字 "+" がどうしてもうまく処理されなかった。なので、下記のように一行追加することにした。

NSString *tmpStr =[orgStr stringByReplacingOccurrencesOfString:@"+" withString:@" "]; //最初に空白文字を処理
NSString *decodedStr = [tmpStr stringByReplacingPercentEscapesUsingEncoding:NSShiftJISStringEncoding]; //組み込みの関数でデコード



これで何とかうまくいきました。
なお、ネットなどを見ているとさらにうまく処理できないで残存する文字コードも存在する場合があるみたいですが、この程度でも何とかなる場合があるのでお試しください。


URLエンコーディング

次は、エンコーディング。こちらも状況は一緒で、"stringByAddingPercentEscapesUsingEncoding" という関数を使って、下記のようにすれば、通常文字列の orgStr はエンコードされて encodedStr になることになっている。

NSString *encodedStr = [orgStr stringByAddingPercentEscapesUsingEncoding:NSShiftJISStringEncoding];



しかし、これがやはりうまくいかない場合が発生する。
こちらはなかなか難敵だったのですが、こちらのサイトを参考にさせていただき、下記のようにすれば、うまくいきました。
(ちなみに、"kCFStringEncodingUTF8"はエンコード元に合わせて、"kCFStringEncodingShiftJIS"などに変更する必要がある。)

NSString *encodedStr = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)orgStr,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8 ));



URLスキーム

さてさて、そんな URLエンコード、デコードが必要になる場合って何かというと、私の場合、URLデコードのほうは、ネット上の XML ファイルを読み込んでデータを使おうとしたときでした。こちらの XML 系の処理はそれだけでネタにしたほうが良さそうなので、後日のお楽しみに。URLエンコードのほうは、URLスキームによって値を別のアプリに渡しつつ起動するとき必要でした。
このURLスキームを簡単に説明します。例えば、単純にあるサイトを Safari でプログラム的に起動したいときは下記。

NSString *urlScheme = @"http://d.hatena.ne.jp/dzd12061/"; //URLの設定
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlScheme]]; //safariの起動



電話の場合なんかは、下記。

NSString *urlScheme = @"tel:03-12**-34**"; //電話番号の設定
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlScheme]]; //電話アプリの起動



つまりは、"UIApplication sharedApplication] openURL:NSURL"で、URL呼び出しができて、NSURL に 所定の書式で書いた URL を入れておけばいいと言うこと。
かなり多くのアプリが、この URLSchme 書式を持っていてそのあたりは、たとえばこちらのサイトにまとまっている。


twitter 投稿事例

ちなみに、上記のURLエンコーディングとURLスキームを使ったのは、twitter へ投稿する機能をもつアプリを作ったとき。
まずは、twitter に投稿したい内容を作成後、URLエンコード。このエンコードした文字列をくっつけて、twitter アプリを URLスキームを使って起動するという手順になります。

NSString *msg = @"twitter に投稿します。";
msg = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)msg,NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8 )); //URLエンコーディング
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"twitter://post?message=%@",msg]]]; //twitter アプリの起動



すると下記のようば画面が起動されてきます。





関連リンク:
Xcode Downloads and Resources - Apple Developer
関連サーチ:
Xcode(AMAZON.co.jp)
Xcode(Google)
Powered BY AmazoRogi

初めてのiOSプログラミング 第2版
発売日 : 2012-10-20 (大型本)
売上ランク : 196625 位 (AMAZON.co.jp)
¥ 3,360 在庫あり。
Powered BY AmazoRogi Data as of 2013-07-13
See detail & latest visit AMAZON.co.jp