iPhone アプリ開発入門 2022
iPhoneで動くアプリを作っては止め作っては止めしてるが、毎回完全に記憶から消えるので初歩的なところからメモを残すことにする。
2022年にもなって新規に開発するのにObjective-C選ぶ人はおらんだろうから、Swiftオンリーで。
MacとApple Idの準備
iPhoneアプリの開発に必要なXcodeはmac版しかないのでmacを買わないとiPhoneアプリ開発はできない。
ケチ臭いがしかたない。
Apple Idも必要。まぁこれはMac買ったんなら登録するか、開発関係なく。
Xcodeのインストール
App StoreでXcodeをインストールする。これ自体はすごく簡単だけどすごく時間がかかるのでビビる。
あんまりにも時間がかかり過ぎて固まってんじゃね?と心配な人は以下の方法で動いているかどうかを確認できる。
- コンソールを開き、左上のデバイスで自身のPCを選ぶ(コンソールがどこかわからん場合は右上の検索バーでコンソールと打て)
- 画面上の開始ボタンを押す
- たくさんログが出て見づらいので右上の検索バーにApp StoreといれてEnterし、フィルターする
- 画面が小さいと見切れるが、ログの右端に935/1000だとかの進捗がでるので、今進んでるかわかる
- 画面上の停止ボタンを押す
ちなみに自分のMacBookPro環境だとインストールに45分かかった。
XcodeにApple Idを追加
XcodeのPreferenceを開き、Accountsを選んでApple Idを追加する。
何もないアプリをとりあえず作る
- Xcodeを起動し、「create a new Xcode project」を選択する
- Appを選び、Product Nameになんか適当な名前をいれる
- Teamに自分のApple Idがあるはずなので選択する
- InterfaceにSwiftUI、LanguageにSwiftを選択する
-
Include TestsのチェックをはずしNext
-
Source control:のチェックははずしCreate
これで空のアプリが完成した。
アプリを実機で動かす
iPhoneをmacにUSB接続し、Xcodeの実行(三角ボタンみたいなやつ)を押すとiPhoneにアプリがインストールされ起動する。
この時、macのログインパスワードを聞かれることがあるが、Apple Idのパスワードじゃないので注意(自分、なんどもApple Idのパスワードを入れてNGで困ったので)
アプリが動いたら成功。
コンパイルエラーがでたら
Signing for "sample1" requires a development team. Select a development team in the Signing & Capabilities editor.
とかいうエラーが出たら署名がちゃんとなされていない。
Projectのsigning & CapabilitiesのTeamに自身のアカウントを設定しないといけない。
なお、自分は設定していたけどエラーになって意味がわからず随分なやんだが、以前登録して随分放置したのち、再度開発をしたのだが、その間にApple Idのパスワードを変更してしまっていた。
要はXcodeには古いパスワードが残っていたのでずっとエラーになってしまっていた。アカウントを削除して再登録したらすんなり治ったので、アカウントがどうしてもおかしい場合はXcodeに設定したアカウントを再設定してみるのも手。
ソースコードの命名
xxxAppというようにAppとつけたソースがCでいうところのmain。
xxxViewというようにViewとつけたソースはGUI。
ViewのPreviewが表示されない
Viewクラスを継承しているソースコードを選択すると、右側に本来であればGUIがエミュレートされて表示される。
出てない場合は、「resume」ボタンを押すとでる場合があるので押してみる。
PreviewProviderクラス
自動で作られたContentView.swiftの中に、PreviewProviderクラスを継承しているContentView_Previewsクラスがいる。
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.previewInterfaceOrientation(.portrait)
}
}
実はこれがプレビュー画面を出すためのコードで、実際のアプリには不要なコード。
試しにここをコメントアウトしてもアプリは問題なく動く。
GUI本体はViewを継承しているContentViewクラスだからだ。