モバイルアプリにWebとの連携は不可欠なわけで,iOSエンジニアがWeb APIを使うとき最初にどないすんねん!とぶつかる問題がパーセントエンコーディングだと思う.
我らがNSString
にはそれを解決するためのstringByAddingPercentEscapesUsingEncoding:
という凄まじく長くてステキなメソッドがある.
そして全てのiOSエンジニアは喜び勇んでこのメソッドを使い,絶望する.
なにを隠そうこのstringByAddingPercentEscapesUsingEncoding:
ってのは,エスケープ対象の文字が少なく,本来エスケープされるべき文字をエスケープしてくれない.
そんなこんなでCFURLCreateStringByAddingPercentEscapes
なんか使っちゃったりしてCore Foundationデビューなんかしちゃったりするのである.
(ちなみにアンエスケープはちゃんと動く.)
しかし,よくよく考えてみれば,JavaScriptならecodeURI
があって,こんなの問題にもならない.
ここで,みんな大好きUIWebView
の登場である.
UIWebView
にはみんなが愛してやまないstringByEvaluatingJavaScriptFromString:
メソッドがある.
NSURL
のカテゴリにでも以下のように書いてやればパーセントエンコーディング問題は解決するのである.
(どうでもいいけどload
でURLWithString
とswizzleすると悪魔的だけどオサレ)
+ (instancetype)URLWithUnescapedString:(NSString *)URLString { NSString *escaped = [[UIWebView new] stringByEvaluatingJavaSctiptFromString:[NSString stringWithFormat:@"encodeURI(\"%@\");", URLString]; return [self URLWithString:escaped]; }
こんなためにいちいちUIWebView
作るのはたいそうすぎるとか思うかもしれないけど,それはstaticにするなりで少々マシにすることはできると思うし,なによりiOS 7以降ならJSContext
もある.
結局なにが言いたいかというと,JavaScriptの資産使うためにUIWebView
使ったり,JSContext
使うの結構アリだと思うということ.