[Swift] iOSアプリ開発の基本情報と学習ソース

# はじめに

本稿では、iOSアプリ開発に関する初歩的な情報を共有します。
※本稿の情報は2020年2月現在です。

Xcode + Swiftによる開発を前提として記述しています。

私の認識違いなどがありましたらコメントでお知らせいただけると幸いです。

# iOSアプリ開発に必要なもの

## Mac

iOSアプリの開発ツールの"王道"は、Appleが提供しているXcodeです。
XcodeはMacでのみ動作します。
まずはMacの操作に慣れる必要があります。
[Mac をはじめてお使いになる方（Apple公式）](https://support.apple.com/ja-jp/explore/new-to-mac)

## Xcode

Xcode（エックスコード）はAppleが提供している、無料の統合開発ツール（IDE）です。

iPhone、iPad、Mac、Apple Watchのアプリを開発することができます。

Apple製品ユーザーであれば、Apple IDはお持ちかと思います。
MacとApple IDがあれば、Xcodeをダウンロード・インストールすることができます。

**注意．macOSとXcodeのバージョン**
最新バージョンのXcodeをインストールするためには、macOSも最新のメジャーバージョンである必要がある場合が多いです。
事前に、Xcodeのシステム要件と、macOSのバージョンを確認しておきましょう。

App Storeからダウンロード・インストールが基本となります。
ただし、後述するような下位互換の問題で旧バージョンのXcodeを入れたい場合、以下のサイトからダウンロード可能です。
[Downloads for Apple Developers](https://developer.apple.com/downloads/)

昔はiOS実機でデバッグするには有償のApple Developer Programライセンスが必要でしたが、現在はライセンスがなくても、iOS実機でのデバッグが可能になりました。
（他者への配布はできませんが）

なので、とりあえずハードウェア（MacおよびiOS実機）を調達すれば開発をスタートできます。

Xcodeのメニューは英語です。
また機能が盛りだくさんなので、ちょっと取っ付きにくいかもしれません。

WebサイトでXcodeの操作を学習するのであれば、以下のサイトがお勧めです。
[Swift学習・Xcode使い方入門｜iOSアプリ開発初心者が最初に知りたかったのはこれ](http://mtitg.com/swiftxcode/#ios)
※若干古い情報ですが基本的なことは参考になります。

Apple Developer Programについては後述します。

# iOSシミュレータ

XcodeにはiOSシミュレータが付属しており、iOS実機を繋げなくてもアプリを“大体は”デバッグできます。

ただし、シミュレータでは、

- 加速度センサー、カメラ、マイクなど、一部のセンサー/デバイスを使うテストができない
- PCキーボードではフリック入力やピンチズームなどの操作がしづらい
- PC上ではメモリやCPU性能が潤沢なので、性能テストはできない

という制約があります。

[Simulator User Guide - Apple Developer](https://developer.apple.com/library/archive/documentation/IDEs/Conceptual/iOS_Simulator_Guide/Introduction/Introduction.html)（英語）

# Swift

## Swiftの概要

SwiftはAppleが開発した新しいプログラミング言語で、2014年から提供されています。
JavaやC#のような静的型付け言語です。

クラッシュを防止できる安全な言語機構を持ち、簡潔な記法により書きやすく読みやすい、モダンでパワフルな言語です。

## Swiftの学習ソース

[The Swift Programming Language](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/index.html#//apple_ref/doc/uid/TP40014097-CH3-ID0)
Apple公式ガイドです。（英語）
この中の[A Swift Tour](https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html)をXcodeのPlaygroundで"写経"してみるのがオススメです。

## Swift学習でのハマりどころ

Swiftのハマりどころはズバリ、オプショナル型と、クロージャーだと思います。

オプショナル型はJavaで言うNullPointerExceptionを防止するための言語仕様です。
こちらの記事が分かりやすいと思います。
[どこよりも分かりやすいSwiftの"?"と"!"](http://qiita.com/maiki055/items/b24378a3707bd35a31a8)

クロージャーについては（厳密な定義はともあれ）、Swiftでは関数も型であり、関数を変数として扱ったり、関数を関数の引数や戻り値にできる、という概念の理解が必要となります。
こちらの記事が分かりやすいと思います。
[【Swift】クロージャ（基本編）](https://qiita.com/funafuna/items/9be7653cf8d002bac4ec)

# チュートリアル

[Start Developing iOS Apps (Swift)](https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/index.html#//apple_ref/doc/uid/TP40015214-CH2-SW1)
Apple公式チュートリアルです。（英語）

# 開発ライセンスについて

Apple IDがあれば、開発ライセンスを取得することができます。
一つのライセンスでiPhone、iPad、Mac、Apple Watchのアプリを配布できます。
（自分の端末でデバッグするだけならライセンスは要りません）

ライセンスの種類は大きく2種類に分かれています。

[Apple Developer Program](https://developer.apple.com/programs/jp/)

- アプリをApp Storeで配布するための開発ライセンスです。
- アプリは配布前にAppleによって審査されます。
- 個人、法人ともにライセンス取得可能です。
    - 法人の場合、実在を証明する「D-U-N-S Number」の取得が必要です。（東京商工リサーチに申請します）
    - 法人の場合、アプリを「所有する」法人自身がライセンスを取得する必要があります。受託業者は開発者としてチームに招待される形をとります。
    - 個人の場合、他の開発者を追加することはできません。
- 社内用アプリ開発としては実質使えません。
    - Appleの審査で却下されたら配布できません。
    - 審査にかかる期間はApple次第ですので（バグフィックス等も含め）、任意のタイミングでは配布できません。
    - App Storeでの配布なので、誰でもダウンロードできてしまいます。
- ライセンスは年単位で、99 US$です。

[Apple Developer Enterprise Program](https://developer.apple.com/programs/enterprise/jp/)

- 社内用アプリを配布するための開発ライセンスです。
- 逆に、App Storeでの配布はできません。
- 配布にはHTTPSのWebサーバーが必要です。
- 社外への配布は規約違反になります。
- Appleの審査を受けずに配布できます。
- D-U-N-S Numberの取得が必要です。
- アプリを「所有する」法人自身がライセンスを取得する必要があります。受託業者は開発者としてチームに招待される形をとります。
- ライセンスは年間 299 US$です。

両者の違いについて、さらに詳しい情報はこちらが参考になります。
[[iOS] Apple Developer Program と Apple Developer Enterprise Program の違い](http://dev.classmethod.jp/smartphone/difference-between-developer-and-enterprise-program/)

＜2022/12/03追記＞
Apple Developer Enterprise ProgramはAppleのポリシーにより現在新規のライセンス取得が困難になっています。
以下の記事をご参照ください。
[[iOS] （社内アプリ等で）限定的にアプリを配布する方法をまとめてみた](https://qiita.com/y-some/items/60c6919ec40fbbea1d83)

# バージョンアップ問題

運用／保守の観点で知っておきたいのが、iOSおよび、Xcode + Swiftのバージョンアップにまつわる問題です。

## iOSのアップデートを止められるか？

iOSのアップデートを止める方法はありません。
iOSのアップデート通知はAppleによって勝手に行われます。

例えば、社内用のiOSアプリで、利用者は社員限定。デバイスは会社配布のiPad。
社内の運用担当者がiOSのアップデートを止めさせたいと思っても、それもできません。
エンドユーザーがタップしてしまえば、アップデートは否応なく行われます。

## iOSとXcodeとSwiftのバージョンについて

- 「古いXcode」と「最新版のiOSデバイス」を繋げて実機デバッグはできません。
- 最新機種・バージョンのiOSシミュレータは、最新のXcodeにしか格納されません。
- Swiftは下位互換がなく、最新版のコンパイラでは前バージョンのコードはエラーになります。
- Xcodeの最新版に格納されているのは、原則、最新版のSwiftコンパイラのみです。(※)

すなわち、原則的には、

- アプリを最新の機種・iOSに対応させるためには最新のXcodeが必要
- 最新のXcodeを使うには、最新のSwiftバージョンでのコンパイルが必要
- 最新のXcodeにバージョンアップするためには、使用しているライブラリも含めて最新のSwiftバージョンへの対応が必要

ということですので、Appleの動向を常にキャッチアップする必要があります。

(※) 補足
Xcode 8以降では、メジャーバージョンアップから何回かのマイナーバージョンアップの間は、前バージョンのSwiftコンパイラが選択できる「経過措置」が取られています。

# アプリの公開

## App Storeでの公開申請

[公式ドキュメント](https://developer.apple.com/jp/support/articles/)

## プロビジョニング・プロファイル

iOSアプリの配布の際、「プロビジョニング・プロファイル」という情報が必要になります。

Apple Developer Programサイト内のMember Centerという場所で管理するのですが、以下のような情報が含まれるようです。

（１）開発者のApple ID
（２）開発者の証明書
（３）アプリのID
（４）デバッガーが利用するデバイス固有のID（UDID）　※デバッグ用限定配信（AdHoc）の場合のみ

このプロビジョニング・プロファイルの扱いが厄介で、配布用パッケージの作成でエラーが発生する等の事象に悩まされます。

- 基本的な概念がわかりにくい
- Apple Developer Programのサイトデザインが頻繁に変わるため、ネット検索で手順を調べても、画面が異なっている場合がある
- まれに、Apple側に起因する、開発者側の手順誤りではないエラーが発生する

宿命だと思って、試行錯誤を覚悟して付き合うしかありません。:sweat_smile:

基本的な概念を頭に入れておくと、トラブルシューティングが早くなります。
[iOSアプリのプロビジョニング周りを図にしてみる](http://qiita.com/fujisan3/items/d037e3c40a0acc46f618)

もっとも、アプリを配布する段階の話なので、十分学習が進んでから気にすれば良いと思います。

# 次のステップ

**さらに学習を深めたい方向け**
[[Swift] [Xcode] 脱・初級者のための学習ソース](https://qiita.com/y-some/items/f3432fa2be6577e6b06b)

**チームビルディングをする方向け**
[iOSアプリ開発チームビルディングのTODOリスト](https://qiita.com/y-some/items/27d5312dc8372155f90a)