【iOS開発】アプリ開発中に陥りがちな罠

#はじめに
自分がiOSアプリ開発をしてきた中で「陥りがちだな」と思った罠をまとめてみました。
リリース申請前に確認するといいかも？

#レイアウト、UI系
##端末によってレイアウトが崩れる
**AutoLayoutを見直そう　Previewを活用しよう**

AutoLayoutというのは、LabelやButtonなどの部品に、部品の大きさや他の部品との距離といっった制約を設定することで、異なる大きさのiPhoneでも自動的にレイアウトを整えてくれる機能のことです。
iPhoneの画面サイズの種類はとても多いので、AutoLayoutで制約をつけておかないと、リリース申請時にリジェクトされると思います。

AutoLayoutの分かりやすい記事
https://qiita.com/_ha1f/items/5c292bb6a4617da60d4f

Previewというのは、AutoLayoutで設定した制約がしっかり機能しているかどうかを、ビルドなしで確認することができる機能のことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/c9e299df-0844-fbb7-f1c8-89dbdbf5e9d4.png)


Previewの分かりやすい記事
http://developers.goalist.co.jp/entry/2017/06/29/170000

##iPadのSplit View/Slide Overでレイアウトが崩れる
**AutoLayoutを見直そう　Requires full screenを設定しよう(非推奨)**

Split View/Slide Overというのは、iPadの機能の1つで、1つの画面上に2つのアプリを起動させることができる機能のことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/9fb8b9f4-4cae-0980-05bf-8d9f9ef56f42.png)


AutoLayoutを設定する時、この機能たちの存在を忘れてしまいがちです。
気をつけたい

アプリのGeneralの項目にある、Requires full screenというチェックボックスをONにすると、Split ViewとSlide Overを無効にすることができます。

##画面サイズ4インチ以下のiPhoneのみ、着信状態にレイアウトが崩れる
**AutoLayoutを見直そう**

これは本当に盲点中の盲点だと思います。
iPhoneSE(第１世代)などの4インチのiPhoneは、着信時にステータスバーが太くなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/114175f2-2998-119a-7af6-14f9dbceb488.png)
シュミレーターを起動中に⌘Yを押すと、着信時のレイアウトを確認することができます。

##ダークモード
**ダークモードに対応しよう**

iOS13からの新機能のダークモードは、アプリ全体を黒を基調にした配色に変更することができるモードです。
Color Setという機能を使えば簡単に実装できます。

ダークモード対応の分かりやすい記事
https://qiita.com/hirothings/items/4834481d170332e173f5


##ランチスクリーン
**Launch Screenを設定しよう**

Launch Screenというのは、アプリの起動中に表示される画面のことです。

Launch Screenの分かりやすい記事
https://qiita.com/h1d3mun3/items/93d1e00e8f47a7ed6215

##モーダル遷移
**遷移の設定を確認しよう**

iOS13から、モーダル遷移のデフォルト設定が` .automatic` という、遷移元のViewの上に遷移先のViewが上に重なる遷移方法になっています。
しかし、この方法だとユーザーは自分の意思で前の画面に戻ることができるので、勝手に戻って欲しくない場合は` .fullScreen` に設定しましょう。

モーダル遷移をfullScreenにすることに関する分かりやすい記事
https://qiita.com/akatsuki174/items/fd74cb1e08b70da5e4fd

#旧バージョンとの互換
##iOS12以下で起動すると画面が真っ暗になる
**SceneDelegate、AppDelegateを見直そう**

iOS13から、新しくUIWindowSceneDelegateが導入されました。
しかしiOS12まではそんな概念はなかったので、iOS13以上用に開発していたアプリをiOS12以下で動かすには、コードを少し追記する必要があります。
iOS12で実際にビルドするまで、画面が真っ暗かどうかはわからないので、気づかずに申請してしまいがちです。

SceneDelegateなどの分かりやすい記事
https://qiita.com/sakuto0116/items/7caad22f041375810c9c

##iOS12以下だとSF Symbolsが消える
**SF Symbolsを画像にする**

SF Symbolsとは、iOS用のアイコンの素材集のようなもので、Appleの標準アプリのようなアイコンをすぐに使うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/563e16d5-c6f9-11fd-ef5f-8d13a2ef3508.png)
しかしiOS12まではそんなものなかったので、SF SymbolsをiOS12以下で使いたい時は、SF Symbolsを画像にする必要があります。
そんな時におすすめなのが`HappyCoding`というソフトです。
https://happycoding.app/
このソフトは、SF Symbols以外にも、アプリの多言語化やプライバシー関係など様々な機能があるのでおすすめです。

HappyCodingの使い方の分かりやすい記事
https://happycoding.app/
↑この記事にはSF Symbolsを画像化させる方法が載っていなかったので、今度自分が記事書いておきます。

#その他
##iPadでポップオーバーしようとすると落ちる
**`sourceView`を設定する**

UIAlertControllerのActionSheetや、UIActivityViewControllerなどをiPadで使う場合は、`sourceView`を設定する必要があります。
iPhoneでは`sourceView`を設定しなくても問題なく動くので、忘れがちです。

分かりやすい記事
なかったので今度自分で書いておきます。
簡単にいうとこういうことです

```swift:
activityViewController.popoverPresentationController.sourceView = Button
```

##Sign in with Appleを実装する
**Sign in with Appleを実装する**

サードパーティーのログイン連携をしているアプリは、Sign in with Appleの実装が必須です！

分かりやすい記事
https://qiita.com/shiz/items/5e094910f742c2ad72a4

#おわりに
今後、また罠を見つけたら追記していこうと思います
この記事が役に立ったと思ったらLGTMお願いします👍
少しでも多くの人の役に立てたなら幸いです
「他にもこんな落とし穴あるよ！」というのがあれば是非コメント欄で教えてください