※本記事が筆者の初投稿です! 優しい目で参考程度にご活用ください!
#はじめに
なーんにも考えずに、AlamoFireでAPIを叩いたりなどでHTTP通信をすると、
「エラーが出る」とか「想定より少ないデータしか取れない」
って問題が発生したりします。
HTTP通信は暗号化されていない安全性の低い通信のため、
appleがデフォルトでブロックさせています。
この状態でrequestを出しても、セキュリティでブロックされてる状態なので、
responseは返ってきません。
キャッチボールしようとしてるのに、二人の間に壁があるようなものです。
これでは投げても相手に届かないので投げ返してくれませんね。
壁に邪魔されない形式の通信に変更しましょう。
#解決策
例えばAPIを使おうとして、サイトに載ってるサンプルクエリをコピペしてみます。
そうするとありがちなのが以下みたいなURL。
「http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=[APIキー]&large_area=Z011」
このデフォルトで文頭が「http://」になってるのが引っかかりポイント。
単純に「http://」を「https://」に直してあげましょう。
これで壁に邪魔されない、安全性の高い通信形式に変更できました。
#それでもダメな場合は
API側が、http通信しか対応していない場合があります。
「httpsに直してもダメだ〜」って時は、そもそもの壁を取っ払ってやりましょう。
###①ATSを無効化する (簡易版)
下記URLの「info.plistの編集」を参照してください。
【swift】XcodeでiOSアプリのhttp通信を許可する方法
Info.plist
に飛んで、ATSを無効化しましょう。
ただ、上記の方法は全てのHTTP通信を許可しているため、安全性に欠けます。
審査に提出するとなると、apple様はこの方法では通してくれません。
特定のボール(ドメイン)だけ、壁(ATS)を通り抜けるようにしましょう。
###②特定のドメインのみ許可する (発展版)
下記URLを参照して、特定のドメインだけ許可してあげましょう。
お菓子検索アプリ:iOS10でのATS設定について
これで指定したボール(ドメイン)だけは通り抜けられるようになりました。
ただATSという壁を設けている時点で、そもそもHTTP通信をappleは推奨していないことには留意してください。
2020年11月現在でも審査に通るかは未検証です。
##終わりに
何がハマったって、これやらなくても「少量ならレスポンスが返ってきた時があった」のが、
1番のハマり&誤認ポイントだった。
「無制限にデータ受け取りたいのに、取得データが少ない」とか、
「10件くらいの少量なら大丈夫だけど、100件とか多量のデータを受け取ろうとするとエラー吐く」
とかいう方は「http通信になっていないか」、もしくは「ATSはどうなっているか」を確認してみてください。
自分と同じくらいの初学者さんの助けになれれば。
###参考文献