Xcode で URLエンコーディング周りの処理
URL処理
さてさて、Xcode で iPhone アプリを作る上でのちょっとしたこねた集第三弾です。今回は、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