iOSアプリからHTTP通信をする

Swift
iOSアプリからHTTP通信を許可する

はじめに

iOSアプリから直接MongoDBを叩こうとして断念し、データベースサーバを立ててAPIを発行してデータをもらう方針にしました。そして、Postmanを使って諸々できるところまでたどり着いていました。

いよいよiOSアプリからデータベースサーバにAPIを発行して、データのやり取りを試していきたいと思います。かなりの寄り道から戻ってまいりました。

例のごとくじっくりと進めていきます。まずHTTP通信を許可するところから。オレオレ証明書を用意する手間をかけるくらいなら、テストと割り切って潔く許可しましょう。

HTTP通信を許可する

iOSアプリからHTTP通信は原則できない

iOS9からはセキュリティ上の関係でHTTP通信できません。ですので、データベースサーバとの通信もHTTPS通信にする必要があります。

ただし、お試しでローカル環境にデータベースサーバを立てる場合に証明書の取得や設定をするのは手間です。オレオレ証明書という手もありますが、ここでは見送りとしました。オレオレ証明書自体が意味のないものですので、わざわざ手間を掛けて設定をするのもなぁ。

plistファイルに設定を追加する

まずは通常通りにプロジェクトを作ります。作ったらplistファイルに設定を加えていきます。

この設定はちょっとしたものなのでサササッとできるものです。また、「許可をしたら禁止する」までの手順を覚えておくぐらいでちょうど良いように思います。あくまでも一時的なものですし。

許可する手順をまとめますと、

  • Info.plistを開く
  • Key列からInformation Property Listを見つける
  • App Transport Security Settingsを追加する
App Transport Security Settingsを追加する
  • 追加したApp Transport Security SettingsAllow Arbitrary Loadsを追加する
Allow Arbitrary Loadsを追加する
  • Allow Arbitrary LoadsのValueにYESと設定する

許可を取り消す手順は、

  • App Transport Security Settingsを削除する

これだけです。
App Transport Security Settingsを削除するとその下位のKeyも消えます。

気になったこと

Allow Arbitrary Loadsにいくつか種類がある

無印Allow Arbitrary Loadsの他に、for MediaMedia Exception Usagein Web ContentWeb Content Exception UsageException Usageが付けられたものがありました。せっかくなのでちょっとだけ調査。

Keyの値使いみち
Allow Arbitrary Loads for MediaAVFoundationFrameworkからの通信に限って許可するとき
Allow Arbitrary Loads in Web ContentWKWebViewでの通信に限って許可するとき
無印Allow Arbitrary Loads以外の使いみち

これらのKeyに何か値を設定すると、無印Allow Arbitrary Loadsの設定が無視されるそうなのでご注意ください。

残りの3つはException Usageから察するに、コンテンツの内容や種類によってHTTP通信を許可するかどうかを細かく決めることができるようです。詳細は分かりませんでしたすみません。

  • Allow Arbitrary Loads-Media Exception Usage
  • Allow Arbitrary Loads-Web Content Exception Usage
  • Allow Arbitrary Loads-Exception Usage

Allow Arbitrary LoadsでYESを設定した後、Content Encrypted at Network Layer(ネットワークレイヤで暗号化されたコンテンツ)に関するHTTP通信は禁止したいときに、Allow Arbitrary Loads-Exception UsageをNOにするという使い方でしょうか?

true/falseではなくYES/NO

些細なところですが、true/falseではなくYES/NOなんですね。ここは統一しておいて頂けたらありがたかった。XMLの制限もなさそうですしね〜

まとめ

許可されていなかったHTTP通信ができるように設定してみました。これでローカル環境のSSL対応していないデータベースサーバへの接続ができるようになります。

ただし、HTTP通信がもともと許可されていないということは、それなりの理由があるはずです。許可するのは一時的なものと考えて、リリースなどを考えるときは忘れず許可を消しておきましょう。

許可してしまっていることはちゃんと覚えておかないといけませんね。