reona.dev

ローカルサーバーと通信する


地味にハマったのでメモ。

やりたいこと

  • Rails プロジェクトで用意した API に iOS アプリの開発環境からアクセスしてデータを取得したい。
    • Rails サーバー起動した状態で、XCode シミュレータから localhost 接続する。

開発環境

  • MacOS Catalina
  • XCode 11.5

エラーログ

2020-06-27 00:13:31.111948+0900 SampleApp[36026:3294237] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
2020-06-27 00:13:31.112049+0900 SampleApp[36026:3294237] Cannot start load of Task <B5B5EF60-F560-4344-BCDC-244DEBA3D77E>.<1> since it does not conform to ATS policy
2020-06-27 00:13:31.115825+0900 SampleApp[36026:3294237] Task <B5B5EF60-F560-4344-BCDC-244DEBA3D77E>.<1> finished with error [-1022] Error Domain=NSURLErrorDomain Code=-1022
  - The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. UserInfo={NSUnderlyingError=0x6000039ed170 {Error Domain=kCFErrorDomainCFNetwrk Code=-1022
  - (null)}, NSErrorFailingURLStringKey=http://localhost:3000/api/users, NSErrorFailingURLKey=http://localhost:3000/api/users, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.}

iOS9 からデフォルトで ATS(App Transport Security)が設定されており、https 以外の通信はシャットアウトされているらしい。

解決策

Info.prist を右クリック > Open As > Sourse Code で次のコードを挿入

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsLocalNetworking</key>
  <true />
</dict>

次のように ATS を無効化することでも通信可能だが、セキュリティが担保されないので非推奨 (何故かこの方法のみ説明している日本語記事が多い…)

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true
/></dict>

エラーログが解消され、データが取得できることを確認できれば通信成功!