まるのヘタレ日記

技術ビビリなSEが、覚えた事を記述し、次回以降はびびらないで済むように復習します。

既存エンジニアがiOS開発を始めるには:入門編

どの言語もそうだろうけど、
最初にやってみてよくわかんないと、とっつき辛いと思う。
そんな「よくわかんない」ってかつて自分が感じたとこを、
プログラミング経験ある人に伝えるイメージでまとめてみる。

Xcodeが扱うファイルの種類について

A new picture

①AppDelegate.h/AppDelegate.m

新規にiOSプロジェクトを作成した際、
デフォルトで作成される。
OSから呼ばれた時の処理を記載する箇所。
主に以下のようなケースでAppDelegate.mをいじる。
・起動時の処理(初期画面の起動等)
・バックグラウンドからフォアグラウンドに戻った際の処理
・通知から起動した際の処理

②Main.storyboard

Storyboard(ストーリーボード)で使用する、
複数画面のデザイン・遷移を定義するファイル。
新規にiOSプロジェクトを作成した際、
デフォルトで作成される。
詳細は後述。

③*.hファイル

クラスを追加すると*.mファイルと併せて作成される。
クラスの宣言を記述するクラス。
ヘッダファイルなんて呼ばれたりする。

④*.mファイル

クラスを追加すると*.hファイルと併せて作成される。
クラスの実装を記述するクラス。
実装ファイルなんて呼ばれたりする。

⑤*.xib

Viewのデザインを定義するファイル。
View関連のクラスを追加する際、
"With XIB for user interface"を指定すると、.hファイル/.mファイルと共に作成される。
詳細は後述。

⑥Images.xcassets

Xcode5から追加された、画像管理用のファイル。
複数画像をまとめて管理できる。
使用方法については記載しないが、
使った方が良いと思う、画像ファイル扱うのが楽。

⑦*.plistファイル

値定義を行えるファイル。
key/型/値で定義する事が可能。
新規にiOSプロジェクトを作成した際、
デフォルトで、[プロジェクト名]-Info.plistというファイルが作成される。
この[プロジェクト名]-Info.plistは特殊なファイルで、
アプリ自体の設定を指定するファイル。

上記のアプリ用ファイルとは別に、*.plistを作成する事。
テーブルに表示するデータ配列や、定数なんかにも使えると思う。
使いこなせたら便利だと思う。
 

⑧main.m

エントリポイントと思われる。
特にいじる必要なし。
※起動時の処理は、AppDelegate.mに記述する。

⑨Tests

[プロジェクト名]Testsというフォルダが作成される。
JUnit的な、テストに使えるもの。
使った事ないけど、お勉強して使えるようになったら便利だと思う。

画面デザインについて

他の言語ではFormって表現したりする画面は、
Objective-CではViewと呼ばれている。

基本的には画面を追加するたんびに、
UIViewController継承したクラスを追加していくイメージ。

画面をデザインするには、主に3通りのパターンがある。

xibファイルを使用する。

xibは、1つのViewのデザインをするファイル。
Storyboardより前から存在し、一番メジャーな画面デザイン方法。

Storyboardを使用する。

複数画面をデザインする事が可能で、遷移も定義可能。
画面遷移まで含める事が可能なので、全体像を掴みやすい。
細かいカスタムするには不便かも。
Storyboard内の画面ごとに、
UIViewControllerを継承したクラスを作成して、
CoustomClassの欄に指定してあげる。

プログラムで直に書く。

他の言語でも可能なように、Objective-Cでも可能。
ロード時にコントロールの画面位置・サイズを指定して、
ViewにaddSubViewしてのっける。

所感

どれを使うかについては、xibが一番無難だと思う。
Storyboardに比べて情報量も多いし、
それぞれのViewごとにファイルが出来る感じで管理しやすい。

Storyboardは、
内容によってはコーディング無しで画面遷移まで可能なので、
最初に慣れるためには便利かも。
あとAppleイチオシな感じするので、慣れておいて悪くないと思う。
xibと併用する事も可能なので、
「簡単な部分はStoryboardで書いて、細かい部分にxibを使う」
なんて運用も有りかも。

プログラムで直に書く方法は、あんまオススメ出来ない。
細かい位置調整とかする際、GUIで出来る方が簡単だと思う。

よく使うUIクラス

使った事ある範囲で解説。

UIViewController

画面を制御してくれるクラス。
基本的にはこれを継承したクラスをカスタムして、
画面を作っていく感じ。

UINavigationController

画面上部の進む、戻るを制御してくれるコントローラ。
Navigation Barを表示して、これを便利に制御してくれる。
親画面から小画面に遷移する時、
これを使って遷移すると、勝手に戻る際の制御までしてくれる。

UITabBarController

画面下部に表示するタブバーで、画面の切替を制御してくれるコントローラ。
Tab Barを表示して、これを便利に制御してくれる。

UITableViewController

一覧表示するViewを制御してくれるコントローラ。
ただ、これはカスタムし辛いので、
UIViewController + UITableViewで使う方が楽かも。

UIAlertView

VBAのMsgBox、JavaScriptのAlertみたいな感じのやつ。
OKのみの情報メッセージや、
複数ボタン(はい/いいえ)のメッセージも出せる。
Objective-Cだと非同期な処理なのが独特。
他の言語だと、疑問メッセージを表示するとその場で処理が止まるが、
Objective-Cでは処理が流れてしまう。
選択されたボタンを取得するには、
UIAlertViewのデリゲートメソッドで処理を実装する必要がある。

特殊コントロール

自分が使った事がある範囲で解説。

Web画面

UIWebViewを使用する。
画面上に配置して、
中にHTML等を表示するためのコントロール。
一般的な、URLを指定してHTMLを表示する方法の他に、
ローカルのHTMLファイルを指定したり、文字列を直接読み込む事も可能。
ハイブリッドアプリだと、これをガリガリ使う事になると思う。
通常のSafariに近いイメージでJavaScript等も実行可能。
Objective-CからUIWebViewに向けてJavaScriptを実行する事も可能で、
HTML上の値を取得する際に使える。
また、JavaScriptをトリガにObjective-Cネイティブコードを呼び出す事も可能。

地図

MKMapkitを使用する。
iOS標準の地図を表示するコントロール。
純正の地図アプリのイメージ。
実装する際、地図関連の分かりにくかった用語を下記に挙げる
・地図に表示するピン
 MKPointAnnotation(ピンの事)を作成し、
 MKMapViewのaddAnnotationメソッドに渡す。

・ピンに表示する吹出し
 canShowCalloutプロパティで指定する。

・緯度経度
 CLLocationCoordinate2Dで保持する型。
 特定の場所にピンを落とす時は、この型で指定する事になる。

・指定住所から緯度経度を取得する(正ジオコーディング)
 CLGeocoderクラスのgeocodeAddressStringメソッドを使用する。

・指定した緯度経度から、住所を取得する(逆ジオコーディング)
 CLGeocoderクラスのreverseGeocodeLocationメソッドを使用する。

通知

通知には、プッシュ通知とローカル通知がある。
・プッシュ通知とは、
 外部サーバがAppleサーバを経由して通知を行う方法。
 身近なとこだと、LINEでメッセージを受信した際に表示される通知
 →サーバー側やApple側への登録も必要なため、
  簡単には出来ない。

・ローカル通知とは、
 AppからiOS端末に通知を行う方法。
 身近なとこだと、純正アプリのリマインダー
 →UILocalNotificationクラスを使用する。

デリゲート(delegate)について

他の言語であんま意識する事が無かったけど、
Objective-Cではかなり使う事になる。

メジャーなとこだと、以下のような時に使用する。

UIAlertViewの結果取得

はい/いいえを選択させるUIAlertViewを表示して、
選択結果を取得する際、
UIAlertViewのdelegateメソッドを実装する。

UITableViewの表示

UITableViewにデータを一覧表示する際、
UITableViewのセル描画メソッドをdelegateして、
ここでデータを表示する処理を行う。

DBについて

iOSからDBを扱う際、以下のような感じ。

ローカルDB

入力された値を保持するのに使用するDB。

SQLiteを使用して管理する。
SQLiteではローカルに*.dbファイルを保持し、
これをDBとして扱う。
保持方法がファイルという事以外は、
他のDBと同じようなイメージでいいと思う。
selectやらinsertやらも普通に出来る。
複雑なSQLは使えるかわからんが。

イメージし易い用途としては、
設定画面の値保持や、ユーザが入力した情報の保持。

Web+DB

各端末から共通のDBを参照させたい時に使用する方式。
後述する通り、クラサバ方式は容易ではないので、
間にAPサーバを挟んでDB操作を行う。
A new picture

①HTTPリクエスト

 iOS側からAPサーバへHTTPリクエストを行う。
 検索等の条件をiOSアプリから指定する場合は、
 リクエスト時のパラメータとして渡す。

SQL発行

 APサーバからDBサーバに対してSQLを発行する
 APサーバの言語は、DBサーバと相性が良いものであればなんでも良い。
 ex. AP:Java + DB:Oracle / AP:C# + DB:SQLServer

③DBからレコードを取得

 DBサーバからAPサーバへ結果が戻る。

④レスポンス

 APサーバはDBサーバから取得した結果セットを、
 iOSが使用しやすい形式(JSON or XML)に変換して、
 レスポンスとしてiOSに返却する。

クラサバ構成

VBやらC#やらJavaであれば、
クライアントがドライバ使って直接DBを叩くような構成が可能であるが、
Objective-Cから直接接続する事は容易ではないので、
上記に上げたWeb+DBの形式を使用するのが一般的だと思う。
※実際にやろうと試みてるようなサイトもあるので、
 出来ない事はないと思うが、
 日本語サイト等は見当たらないので、
 相当な難易度になると思う。
 ここのHPとか見てると、出来そうな雰囲気はある。
 http://odbcrouter.com/ipad

次回予告

次回は便利編として、
実際にiOSアプリ開発を初めて便利だったものを紹介していきたい。