iOS
 Computer >> コンピューター >  >> プログラミング >> iOS

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];

注意:CFURLCreateStringByAddingPercentEscapesstringByAddingPercentEscapesUsingEncoding:は、いずれも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:)を使うのが安全です。

  1. iPhone 11で5Gは使える?5G対応機種と設定方法を徹底解説

    5Gは4Gに続く次世代通信規格で、2019年頃から一部のキャリアがサービスを開始しました。4Gと比べて最大100倍の高速通信が可能になるとされており、低消費電力のIoTデバイスでは最大10年間のバッテリー駆動も実現できます。電気自動車やスマートホームが急速に普及する現代において、より高速なネットワークは必要不可欠な存在となり、5Gが市場に登場しました。2020年以降に発売されたスマートフォンの多くが5Gに対応しています。本記事では、「iPhone 11で5Gをオンにする方法」について詳しく解説します。 iPhone 11は5Gに対応している? 結論からお伝えすると、iPhone 11は5Gに

  2. iPhoneにPingを送る方法|音を鳴らして紛失したiPhoneを探す・追跡する完全ガイド

    Appleは長年にわたりモバイル業界を牽引してきたメーカーであり、iPhoneは圧倒的な動作速度、洗練されたデザイン、多彩な便利機能で世界中のユーザーから支持されています。一方で価格が高いため、多くのユーザーが大切に扱っているのも事実です。しかし、どんなに注意していても、うっかりiPhoneを紛失してしまうことはあります。そんなとき役立つのが「Ping」機能です。本記事では、iCloudや「探す(Find My)」アプリを使ってiPhoneにPingを送り、音を鳴らして位置を特定し、デバイスを取り戻すための手順を詳しく解説します。 iPhoneにPingを送る方法 この記事で紹介する手順に従