Swifi macアプリ開発まとめ
Xcodeのアーカイブ置き場
複数のXcodeを共存させるには、
Xcode.appの名前を被らないようにしないといけない。
Xcode_10_1.app
Xcode_12_5_1.app
また使用時にはそのバージョンのXcode用にパスを変更しないといけない。
例えば、Carthageを使用してのライブラリのインストールを行う場合などの保存先などのパスが、Xcodeのバージョンごとに異なったりすることがあるので、その場合に切替が必要になります。
Xcode > Preferences.. > Locations > Command Line Tool > バージョン選択
//現在使っているXcodeのパスを確認
$ xcode-select -p
/Applications/Xcode11.app/Contents/Developer
//バージョン切り替え
$ sudo xcode-select -s /Applications/Xcode10.1.app/Contents/Developer
//切り替わったことを確認
$ xcode-select -p
/Applications/Xcode10.1.app/Contents/Developer
//有効になっているxcodebuildのバージョンも確認してみる
$ xcodebuild -version
Xcode 10.1 //切り替えたバージョンになっている
Build Version 10B61
@IBOutletについて
@IBOutlet var label: UILabel!
IBとは「Interface Builder」の略でレイアウトを作成するインターフェースで具体的にはstoryboardのことを指しています。
Outletとは、そうそう郊外にある工場からの直販店…ではなくこの場合は「引出し口」という意味あいになります。
Cocoaとは
macOS用のアプリケーションを構築するためのフレームワーク(API)であり、
macOSのアプリケーション開発の中で主要なものの一つ。
NeXTSTEP (OPENSTEP) のAPIをベースとしており、macOS向けのネイティブ・アプリケーションを構築するのに適している。逆に、これまでのClassic Mac OS(Mac OS 9.xまでのMac OS)向けのアプリケーションを構築する目的で使用することはできない。
一般に、Cocoaを利用したアプリケーションを構築する場合、Appleから提供される統合開発環境であるXcode(Project Builderの後継)及び Interface Builderを使用する。なお、iOSの主要フレームワークであるCocoa Touchは、Cocoaをタッチインターフェースを前提に作り直したもので、開発環境もほぼ同様のものを用いる。
下の画像のように、プロジェクトを作成する場所を指定するための画面が表示されます。
もしGitで管理したいならば「Create Git repository on my Mac」のチェックを入れたままにし、そのつもりがないならチェックを外します。
やっとわかったSwift/CoreData入門 【part1:概念編】
Core Data って何?
Core Data はモデルオブジェクトを永続化するためのフレームワークです。もとは Mac OS X のために開発されたフレームワークで、iOS 3.0 から使用できるようになりました。
Core Data はデータの永続化に SQLite というリレーショナルデータベース(以降 RDB と略します)を使用します。Core Data はメモリ上にあるオブジェクトを RDB のレコードに変換して保存、また逆に RDB のレコードをオブジェクトに変換してメモリに展開してくれます。
Core Data のようにオブジェクトとレコードの変換を行うフレームワークのことを O/R マッピングフレームワークと呼びます(O/R は Object / Relational の略)。
Core Data は、O/R マッピングフレームワークの中でもプログラマが RDB のテーブルやレコードを意識することなく使えるのが特徴です。
O/R マッピングフレームワークはなぜ必要か?
アプリで使用するデータの構造が単純でデータ量もわずかであればオブジェクトアーカイブを使ってデータの保存をすれば問題ありません。 しかしデータの構造が複雑でデータ量が多くなるとオブジェクトアーカイブでデータ管理するには限界が出てきます。そこで複雑なデータや大量のデータを管理することができるデータベースを使います。
データベースと言ってもいくつかの種類があります。代表的なものを挙げるとリレーショナルデータベース、オブジェクトデータベース、キーバリューストアなどがあります。一番良いのは iOS で使用することができるオブジェクトデータベースがあれば O/R マッピングフレームワークは不要です。しかし残念ながらオブジェクトデータベースはその技術自体がまだまだ進化の過程にあり実用で使えるような製品は今のところありません。このような事情から技術的に成熟し、かつ安定した製品が多数存在するリレーショナルデータベースをデータの永続化に使うのが一番実用的になります。
RDB をデータの永続化に使う場合、RDB のレコードとオブジェクト指向プログラミングであつかうオブジェクトの間には様々な違いがあるためそれを吸収する O/R マッピングフレームワークが必要になります。
【Swift】Core Dataの基本的な使い方
Xcodeにて新規にプロジェクトを作る際、以下の画面で「Use Core Data」をチェックON。
既存プロジェクトにCore Dataを加える場合
プロジェクト作成時に「Use Core Data」をチェックしなかった場合、もしくはデータモデルを別途作りたい場合は、メニューの File > New > File… を選択し、「Choose a template for your new file:」の画面で「Data Model」を選択する。
Stroy Board / View Controllerについて
Xcodeのセットアップが終わったら、さっそくアプリを作っていきましょう。まずは、「ストーリーボード」で画面を作成します。ストーリーボードとは、Xcodeでアプリの画面を開発するためのファイルのこと。1画面は「View Controller」という単位で区切られ、画面が増えるごとにView Controllerが増えていきます。
StoryBoardのオブジェクトについて
各要素の見た目は、画面右側のアトリビューツインスペクタ(Attributes Inspector)で設定できます。見た目を変更したい要素をクリックすれば、要素に応じて自動的にアトリビューツインスペクタが切り替わります。もし要素をクリックしても表示されてない場合は、図の中部にある小さな四角形で囲んだ[Show the Attributes inspector]ボタンをクリックします。
ViewController.swiftの定義
ストーリーボードにボタンなどの要素を配置すると、画面上の要素をコントロールするSwiftファイル「ViewController.swift」が自動的に生成されます。このSwiftファイル内にプログラムを記述し、ボタンをクリックしたらテキストフィールドに文字が表示されるプログラムを書いてみましょう。
Xcodeを使ったアプリ開発では、画面上の要素とSwiftのコードを接続することで、要素を操作したり、タップ時のアクションを設定したりできます。
要素とSwiftのコードを接続するために、Xcodeの画面にストーリーボードとSwiftのコード編集画面を同時に表示します。
①Main.storyboardをクリック
② 画面上部のエリア(ツールバー)の図のボタンをクリック
③ 図の部分を[Automatic]にすると、画面に関連するSwiftファイルであるViewController.swiftが表示される
画面上の要素を取得する (IBOutlet)
サンプルアプリでは、テキストフィールドを取得し、そのテキストを書き換える処理が必要です。JavaScriptで言えばdocument.getElementById("id名")(jQueryでは$("id名"))で要素を取得するのと同じです。
次のようにして画面(View Controller)とプログラム(UIViewController.swift)を紐付けます。
① テキストフィールド上で右クリック(または[control]キー + クリック)しながら、ViewController.swiftまで線を引っ張ります
② Connection(接続方法)を、[Outlet]に設定します
③ Nameの箇所に、テキストフィールドの名前を入れます(例として、myTextFieldと設定)
これで、Swift上から画面のテキストフィールドをmyTextFieldという名前で操作できるようになりました。このような接続方法をIBOutletといいます。
ボタンタップ時のイベントを設定する (IBAction)
JavaScriptでは要素.addEventListener("click", 処理)(jQueryでは要素.click(処理))でボタンタップイベントを設定しました。SwiftでもIBOutletでイベント設定をしてもよいのですが、もっと簡単な方法があります。
① ボタン上で[control]キーを押しながらViewController.swiftまで線を引っ張る
② [Connection]を[Action]に設定する
③ [Name]に、処理の名前を入力(例として、onButtonTapと設定する)
完了すると、次のようにonButtonTapという名前の関数ができます。ボタンをタップした際に実行される関数です。このような接続方法をIBActionといいます。
Swift UIと Story Boardについて
Swift UIは2019年6月にAppleが発表した新しい開発フレームワークでXcode 11から使えるようになった。
Storyboardよりもコードがシンプルで画面作りもより簡単になり、シュミレーターを立ち上げる必要がなくプレビューで動作を確認できるようになった。
**iOSアプリ開発における新しいUIフレームワークです。(macOSのアプリケーションも別につくれる。)**これまでiOSアプリのUIを作る場合、StoryboardにUIパーツを配置し、Auto Layoutで制約をつけたりと慣れれば楽しいのですがStoryboardとViewControllerを行ったり来たりしたり割と辛い部分もありました。
なお、** SwiftUIの対応OSは、デバイスがiOS13以降、開発ツールはXcode11以降** となっています。そのため、利用する前に環境を確認する必要があります。
Swift UIのメリット
- データを更新したとき自動でViewに反映
- シミュレーターを立ち上げる必要がない
- デフォルトでダークモードに対応
- コードがシンプルで、開発エンジニアの負担を軽減
Swift UIの公式Tutorial
Swift UIのmacOS Appのチュートリアル
[User Interface]は「SwiftUI|Storyboard|XIB」切り替えることができますが今回は「SwiftUI」にしています。このSwiftUIはWWDC2019で発表された新しいフレームワークで今後この方法でアプリが作られていくと思います。[Next]ボタンで次に保存するためのダイアログが表示されますので、そこでProjectを保存してください。
SwiftUI macOS アプリの作成からビルドしてapp作成
Xcode Targetとは
ターゲットは基本的に、何を構築しているのか、どのように構築しているのかを定義します。複数のものを作成したい場合は、さらにターゲットを追加できます。これは通常、同じプロジェクトからいくつかの関連するものを構築する必要がある場合に意味があります。
たとえば、アプリケーションの完全な有料バージョンの1つのターゲットと、アプリケーションの縮小された無料バージョンの別のターゲットが必要な場合があります。どちらのターゲットにも同じコードとリソースの多くが含まれますが、設定の一部が異なり、それぞれに異なるファイルが含まれている可能性があります。
設定画面をみると似た項目に気づきます。プロジェクトとターゲットです。
ここでアプリをつくる際の詳細設定が出来ます。
プロジェクトの下にターゲットがひとつあります。必要であればさらにいくつかのターゲットをつくっていきます。プロジェクトとターゲットに同じ設定項目があれば、ターゲットが優先されます。
ではどんな場面でターゲットをつくるのでしょう。例えば、塗り絵アプリをつくろうとプロジェクトを作成し、ドラえもん、サザエさんで画像リソースだけ別にしたい場合を考えてみてください。もしプロジェクトをもうひとつ作ったとしたら、プログラムソースコードをドラえもんで修正し、さらにサザエさんのアプリでも修正しなければなりません。
そんなときにターゲットを使うとプログラムなどは共通、画像やアプリ名だけ別にして修正を限りなく少なく別のアプリをつくることが出来ます。
ただし結局各々で設定を変更するため、便利ではあるのですが、行き過ぎると修正量はかわらなかったり、どこが違うのか見えなくなるなどメリット・デメリットが相反してきます。そのためこのあたりは皆さん試行錯誤しているのが現状です。
プロジェクト
Deployment Target
動かせる対象OSの設定、iOS9やiOS10でも使えるようにしたい場合は9.0を設定
Configurations
Debug開発用/Release公開用など設定を分けたいときに追加作成します。デバッグ開発はプログラマー側が自由にテストしたりする場合、リリース開発はデバッグでテストした機能を公開するために作業します。
一般的にデバッグで作業をすすめ、公開前にリリースビルドでビルドします。
Localizations
多言語化対応で使用します。中国語や英語に対応させたい場合に追加してきます。
ターゲット
アプリ名
アプリの名前を設定
Bundle Identifier
アプリを特定するためのユニークなID、なんでもよいのですが、com.xxxx.xxxなど社名などのドメインアドレスを逆転するのが一般的です。
バージョン
アプリのバージョンを設定します。最初1.0.0とかにして次に1.0.1や1.1.0にしたりします。ビルドが内部番号なのに対して、ユーザーに見える番号になります。
ビルド
開発で使うアプリの内部管理番号です。ユニークにすることで間違ったアプリをアップしないようにします。
プロビジョニングプロファイル
他の人が勝手に利用できないように各々のプロファイルを設定します。最初の鬼門でしょうか。よく出てきます。
ターゲット(対応iOS)
プロジェクトと同様。こちらが優先されます。
デバイス
iPhone/iPad、両方で動作させるか設定できます。最初はiPhoneだけにしてもよいかもしれません。
デバイスオリエンテーション(回転制限)
ポートレイトだけ設定すればiPhoneをかたむけても回転をさせないように設定できます。必要がなければ固定したほうが不具合を減らすことが出来ます。
ステータスバー(ステータスバーの表示)
ステータスバーを常時表示させないことができます。
アイコン
iPhoneのホーム画面で表示するアイコンを設定します。
起動画面
起動したときに表示されるスクリーンショットを設定できます。
Capabilities
プッシュ通知、ゲームセンター、課金などiPhoneの機能を利用するための許可設定です。
info
info.plistファイルの内容をビジュアル的に変更できます。
この中の項目も他設定と重複する箇所がいくつかあります。
info.plistの重要な設定は以下となります。
Localization native development region
ベースとなる言語を設定します。日本語の場合でも多言語対応の可能性が少しでもあるのであれば、英語をベースとして日本語を追加したほうが後々便利です。
Privacy -xxx-
地図やカメラなどOSの機能を利用するための許可文言を設定します。この設定がないと利用できません。
App Transport Security Settings
安全な通信をするための設定をします。httpsで通信する場合などで利用します。
Xcode 12の変更点
【Xcode】エディタの分割表示