iPhoneアプリで文字列(NSString)をURLエンコードする方法|Objective-C・Swiftの実装例
URLエンコードが必要な理由
APIベースのWebアプリケーションを開発していると、複数のWebサービスやURLとやり取りする場面が必然的に多くなります。URLには、特殊文字や検索キーワード、クエリパラメータ、ヘッダー情報など、接続先サービスに応じたさまざまな要素が含まれるためです。
たとえば検索語にスペースや記号が含まれていると、そのままURLに組み込んだ場合に正しく解釈されないことがあります。そこで必要になるのがURLエンコード(パーセントエンコーディング)です。適切にエンコードすることで、アプリ側で組み立てたURLと、実際にサーバーへ送られるURLとを一致させることができます。
Objective-CでURLエンコードを行う
方法1:NSStringのカテゴリとして実装する
まず紹介するのは、NSStringにカテゴリを追加し、どの文字列からでも呼び出せるユーティリティとして実装する方法です。
#import "NSString+URLEncoding.h"
@implementation NSString (URLEncoding)
-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
(CFStringRef)self,
NULL,
(CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
CFStringConvertNSStringEncodingToEncoding(encoding));
}
@end
このカテゴリをプロジェクトに追加しておけば、任意のNSStringに対してurlEncodeUsingEncoding:を呼び出すだけで、指定した文字エンコーディングでURLエンコードされた文字列を取得できます。
方法2:stringByAddingPercentEscapesUsingEncodingを使う
もっと手軽な方法としては、NSStringのインスタンスメソッドを直接呼び出すことでも実現できます。
NSString *sUrl = @"https://www.myService.com/search.jsp?param= name"; NSString *encod = [sUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
注意:CFURLCreateStringByAddingPercentEscapesとstringByAddingPercentEscapesUsingEncoding:は、いずれもiOS 9.0以降で非推奨(Deprecated)となっています。新規開発では、後述のstringByAddingPercentEncodingWithAllowedCharacters:(Objective-C)/ addingPercentEncoding(withAllowedCharacters:)(Swift)の利用が推奨されます。
SwiftでURLエンコードを行う
Swiftでは、String型に用意されているaddingPercentEncoding(withAllowedCharacters:)メソッドを使うのが基本です。許可する文字セット(CharacterSet)を指定すると、それ以外の文字がすべてパーセントエンコードされます。
func getURL(_ str: String) -> String? {
return str.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
}
この関数は、エンコード済みのURL文字列(Optional)を返します。実際の使い方は以下のとおりです。
var sURL = "https://www.myService.com/search.jsp?param= name" print(getURL(sURL) ?? "")
実行すると、スペースが%20に置き換えられた、次のようなエンコード済みURLが得られます。
https://www.myService.com/search.jsp?param=%20name
CharacterSetの選び方のポイント
URL全体をエンコードしたいのか、クエリの値だけをエンコードしたいのかによって、適切なCharacterSetは異なります。主なものは以下のとおりです。
- .urlHostAllowed:ホスト名(ドメイン部分)に使える文字セット
- .urlPathAllowed:パス部分に使える文字セット
- .urlQueryAllowed:クエリ文字列に使える文字セット
- .alphanumerics:英数字のみを許可(最も強くエンコードされる)
用途に合ったCharacterSetを選ぶことで、意図しない文字までエンコードされてしまうトラブルを防げます。
まとめ
iOSアプリでURLを扱う際は、特殊文字やスペースが含まれていても正しく通信できるよう、必ずURLエンコード処理を挟むようにしましょう。CFURLCreateStringByAddingPercentEscapesなどのレガシーなAPIは非推奨となっているため、これから新しく書くコードではaddingPercentEncoding(withAllowedCharacters:)を使うのが安全です。
-
iPhone 11で5Gは使える?5G対応機種と設定方法を徹底解説
5Gは4Gに続く次世代通信規格で、2019年頃から一部のキャリアがサービスを開始しました。4Gと比べて最大100倍の高速通信が可能になるとされており、低消費電力のIoTデバイスでは最大10年間のバッテリー駆動も実現できます。電気自動車やスマートホームが急速に普及する現代において、より高速なネットワークは必要不可欠な存在となり、5Gが市場に登場しました。2020年以降に発売されたスマートフォンの多くが5Gに対応しています。本記事では、「iPhone 11で5Gをオンにする方法」について詳しく解説します。 iPhone 11は5Gに対応している? 結論からお伝えすると、iPhone 11は5Gに
-
iPhoneにPingを送る方法|音を鳴らして紛失したiPhoneを探す・追跡する完全ガイド
Appleは長年にわたりモバイル業界を牽引してきたメーカーであり、iPhoneは圧倒的な動作速度、洗練されたデザイン、多彩な便利機能で世界中のユーザーから支持されています。一方で価格が高いため、多くのユーザーが大切に扱っているのも事実です。しかし、どんなに注意していても、うっかりiPhoneを紛失してしまうことはあります。そんなとき役立つのが「Ping」機能です。本記事では、iCloudや「探す(Find My)」アプリを使ってiPhoneにPingを送り、音を鳴らして位置を特定し、デバイスを取り戻すための手順を詳しく解説します。 iPhoneにPingを送る方法 この記事で紹介する手順に従