Xcode以外の開発ツール

「Objective-C」という言語と「Xcode」で作るアプリの事をネイティブアプリと呼びますが、それ以外のツールでアプリを作ることもできます。

「1つのコードでマルチプラットフォーム化できる」、「AppStore以外の場所で公開できる」など、それぞれのツールには特徴があります。

Xcode以外の開発ツールについて簡単に書いていきます。


Titanium Mobile


Titanium Mobileは、オープンソース/商用無料の開発環境で、言語はJavaScriptを使います。

ひとつのソースコードで、iOS, Android, Windows Phone, BlackBerryなど、マルチプラットフォームに展開できます。

カメラ、加速度センサ、電子コンパスなど、デバイス固有の機能が使えますが、Titanium Mobile経由で提供されるため、処理能力で劣る場合もあるようです。

参考ページ

Titanium MobileではじめるiPhoneアプリ開発
titanium-mobile-doc-ja


Unity3D


Unity3Dは、3Dコンテンツも作成できるゲーム開発用のプラットフォームです。
基本機能は無料ですが、デバイスへの書き出しにはライセンスの取得($300)が必要なようです。

iOS端末、Android端末などマルチプラットフォームでコンテンツの書き出しができ、ドラッグ&ドロップで手軽に3Dデータが扱えます。

参考ページ

Unity3Dをイチから学ぶのに便利なリンクまとめ


ローカルWebアプリ


HTML5とCSS3を使って、iOS端末のWebブラウザの上で動くWebアプリケーションを作ることができます。

サーバーからブラウザへロードが完了したら、それ以降はネットワーク接続不要で動作するので「ローカルWebアプリ」と呼ばれます。 ユーザーは「インストール」という作業をする必要がありません。

Appleの審査を経由することなく自由に配布できるので、どんな内容のアプリでも公開できます。

「Xcode + Objective-C」で作るネイティブアプリと比べて動作が遅いなどといった劣る面もありますが、徐々に改善されているようです。

参考ページ

HTML5 で作る iPhone ローカル Web アプリ入門
HTML5でiPhone/Androidアプリケーションを作ろう!:ITpro


iOS Core Audio 概要

iOSアプリ開発でオーディオを扱う時には、パワフルなライブラリ/フレームワーク「CoreAudio」を使うことができます。

CoreAudioはもともとMacOSXに搭載されていた、高性能なオーディオ処理エンジンです。それがiOS(iPhone/iPad)でも使えるようになり、たくさんのオーディオアプリがAppStoreに公開されています。

iOS版のCoreAudioはMac版と比たらコンパクトで、電話の割り込みへ対応する「AudioSession」や簡単にオーディオを扱える「AVFoundation」といったiOS固有のサービスが存在します。

「CoreAudio」のフレームワークには、

  • Audio Toolbox フレームワーク
  • Audio Unit フレームワーク
  • AVFoundationというフレームワーク
などがあります。

簡易的な再生や録音を行いたい場合は「AVFoundation」
波形レベルでオーディオを扱いたい場合は「Extended Audio File Services」&「AudioUnit」または「AudioQueue」
といった感じで、目的に応じてフレームワークを使い分けます。


Audio Toolbox フレームワーク

オーディオファイルの読み出し、書き出し、再生、変換などを担当します。

System Sound Services

30秒以下のサウンドファイルが再生でき、警告音の再生などに使います。簡単にサウンドファイルを再生できます。

Audio Queue Services

iOSが対応しているオーディオフォーマットの再生と録音ができます。長さの制限はありません。

Audio File Services

オーディオデータをそのまま入力又は出力できます。フォーマットの変換の機能はありません。

Audio Session Services

iOS固有のサービスであり、オーディオの動作をコントロールします。iPodが再生している時やサイレントモードの時に音を出すかどうか、電話がかかってきた時やアラームが鳴った時にどう対応するか、などの処理を担当します。

Audio Converter Services

オーディオデータのフォーマットの変換をするためのサービスです。

Audio Format Services

オーディオのフォーマットに関するサービスです。

Extended Audio File Services

「Audio Converter Services」と「Audio Format Services」の機能を組み合わせて、サウンドファイルを簡単に読み書きできるようにしたものです。

Audio Unit Processing Graph Services

CoreAudioが持つプラグイン規格「Audio Unit」を複数接続するためのサービスであり、AudioUnitを組み合わせてオーディオ処理を行うことができます。

Audio File Stream Services

オーディオデータパケットを解析するもので、インターネット上のMP3をダウンロードしながら再生する、などの処理を実現できます。


Audio Unit フレームワーク

「Audio Unit」はオーディオ処理を行うプラグイン規格であり、CoreAudioにはシステムレベルで採用されています。

オーディオ入出力、サウンドエフェクト、フォーマット変換、ミキシングなど多数のAudioUnitが存在します。単体でも使えますし、「Audio Unit Processing Graph Services」を使って複数接続して使用することもできます。

オーディオ入出力用のAudioUnitには「Remote IO Unit」というものがあり、iOS端末でオーディオを入出力する時には、ほぼRemote IO Unitが使われます。

Audio Component Services

Audio ComponentというAudioUnitのプラグイン形式を扱うサービスです。AudioUnitを使う時に使用します。

Output Audio Unit Services

AudioUnitの処理の開始/停止を担当します。


AVFoundationフレームワーク

iOSが対応している全てのフォーマットのオーディオファイルを再生できます。再生、再生位置/ボリュームの変更、停止、一時停止などの基本的な機能を備えています。

Objective-Cのインターフェイスを持ち、扱いやすいフレームワークとなっています。

AVAudioPlayerクラス

オーディオファイルの再生を担当します。

AVAudioRecorderクラス

オーディオファイルの録音を担当します。

AVAudioSessionクラス

AudioSessionの管理を担当します。



iOSでSQLiteを使う(1) SQLiteを導入する

アプリを終了しても、データを永続的に残しておくための方法として、
・オブジェクトアーカイブ
プロパティリスト
・NSUserDefaults
・CoreData
・SQLite、
などの方法がありますが、今回はSQLiteについて書いていきます。

SQLiteは、アプリケーションに組み込んで利用できる軽量のデータベースです。iPhoneにはバージョン3というバージョンのSQLiteが搭載されているので、データの保存に使うことができます。

SQLiteのAPIはC言語で提供されていて、APIの使い方を解説したサイトなどがたくさんあります。
DBOnline SQLite入門
RNK’s HomePage
SQLiteで“おこづかいちょう”
他のデータ永続化の方法よりもSQLiteの方が、豊富な情報を基にスムーズに開発を進めていけるとおもいます。


まずは、SQLiteを使うためのライブラリを追加しましょう。

sqlite
▲xcode左側のプロジェクトタイトルと青いアイコンがある部分をクリックします(この例では、sqliteTestというプロジェクト名になってます)


▲真ん中辺りのTARGETをクリックします。


▲「Build Phases」タブをクリックして「Link Binary〜」を展開します。


▲「+」をクリックします。


▲ウィンドウが出てくるのでSQLiteのライブラリを検索します。sqを入力するだけで「libsqlite3.0.dylib」が出てくるのでlibsqlite3.0.dylibを選択して「Add」を押します。


▲ライブラリが追加されました。


▲SQLiteを使うクラスの.hファイルの頭で
「#import <sqlite3.h>」
と宣言します。これでSQLiteが使えるようになりました。


NSDateクラスの基本

NSDateは、日付/時間を管理する為のクラスです。

・NSDateを生成する

+ (id)date

(例)
NSDate *date = [NSDate date];
現在時刻を取得してNSDateを生成
+(id)dateWithTimeIntervalSinceNow:(NSTimeInterval)seconds

(例:1時間後の時刻を取得して生成)
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:1*60*60];
現在時刻に指定した秒数のオフセットを加えてNSDateを生成

・インスタンスメソッド
-(NSString*)description 日付を文字列にして返す
-(NSDate*)earlierDate:(NSDate *)anotherDate 2つの日付を比較して過去の日付を返す
-(NSDate*)laterDate:(NSDate *)anotherDate 2つの日付を比較して新しいほうの日付を返す
-(BOOL)isEqualToDate:(NSDate*)anotherDate 2つの日付が同じかを判定する
- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate 2つの日付の時間の差を取得する


iCloudと共にCoreDataを使う方法

Appleのドキュメント
Using Core Data with iCloud Release Notes
を大まかに訳したものです。

アプリで生成されたデータをCoreDataで永続的に保存しつつ、
そのデータをiCloudで同期する方法を大まかに説明しています。


iCloudと共にCoreDataを使う

CoreDataとiCloudをAppで使う場合2つの選択肢が存在する。
A.どういったAppを作りたいか?
B.どういう型のストアを使いたいか?


A.どういったAppを作りたいか?

iCloudと統合するCoreData App は2種類ある。
Library-style App 単一の永続ストアを持ち、App全体から利用される。
例:Music and Photos.
Document-based applications Appのライフタイムの中で、異なるドキュメントを異なる時間に開くもの。
例:Keynote and Numbers
既にCoreDataを使っているなら、Library-style Appがあてはまるだろう。
この場合、Core DataのiCloud統合SQLiteのストアを使用することを勧める。

UIKitは、UIManagedDocumentクラス(UIDocumentのサブクラス)を提供し、iCloudを使ったDocument-based applicationsをサポートする。library-style applicationsの場合、iCloudを使っていない場合、一般的に Core Data stackをセットアップする。
どちらの場合でも、永続的なストアを設定する必要がある。


B.どういう型のストアを使いたいか?

目的に応じて、ストアタイプを選択する。
  1. SQLite
  2. Atomic (the binary store type)、もしくは NSAtomicStore由来のカスタムAtomic


Use the SQLite Store for Large Datasets and Fine-Grained Change Notification


効率的なper-record changeの伝播と、対応する変更通知を提供するので、SQLite storeを使う。

CoreDataはiCloudとSQLiteのstoreの効率的な統合をサポートする機能の強化を含む。
主な新機能は、あなたが永続ストアに対して行った各変更が、iCloudに格納されているdiscrete transaction log filesに記録されること。(iCloud上に直接永続ストアが維持されるのではない)
iCloudを介した伝達が効率的であることを意味する。(代わりに、変更ごとに全体のSQLiteファイルをプッシュする)
これには、いくつかの影響がある:


・ストアへの変更に関するtransaction logsを保存する場所は、コアデータに指示する必要がある。

storeを構成した時に、NSPersistentStoreUbiquitousContentNameKey、オプションでNSPersistentStoreUbiquitousContentURLKey に値を与える必要がある。
(NSPersistentStoreUbiquitousContentURLKeyを明示しない場合、URLは、application bundle identifierを、NSFileManagerのURLForUbiquityContainerIdentifier:メソッドに渡すことによって構築される。)
コンテンツ名は、異なるデバイス間でストアを識別するために使用される。そのため、transactionsはすべてのデバイス間の永続的ストアファイルの潜在的な多くのインスタンスで一貫して同期される。
このような理由から、それぞれのstoreに一意の名前を与えることを確認する必要がある。(例:UUID)


・iCloudからストアを削除するときは(どちらのデバイスにローカルにするために、または完全にそれを削除する)直接transaction logsを消さなければならない。

NSFileManagerを使ったコーディネート・オペレーションを行う。
カスタムまたはユニークなNSPersistentStoreUbiquitousContentURLKeyを指定しているのなら、
単にそのディレクトリを削除すると、ストアに関連付けられているすべてのトランザクションログデータが削除される。
NSPersistentStoreUbiquitousContentURLKeyを共有しているのなら、NSPersistentStoreUbiquitousContentNameKeyサブディレクトリを取り除けば良い。


・変更がiCloudによって伝播される場所で、SQLiteファイル自体を格納してはいけない。

これは、SQLiteストアファイルを含む全体の親ディレクトリが含まれている。
これは、アプリケーションの種類のコンテキストで後述。



Guidance for Library-style Applications


library style applicationにおいて、通常は単一の永続ストア及びコーディネータを持つ、単一のCoreDataスタックを保持する。

SQLiteストアを使う場合、
・addPersistentStoreWithType:configuration:URL:options:error: でストアを追加した時に
NSPersistentStoreUbiquitousContentNameKeyを、オプションでNSPersistentStoreUbiquitousContentURLKeyを提供する。
好きな名前を選択することができる contentURLは、しかしながら、ubiquity containerを識別する必要がある。
・ストア自体を、ローカルアプリケーションサンドボックス内、もしくは、ubiquity container内のa .nosync suffixディレクトリ内に配置する必要がある。
永続ストアによるNSPersistentStoreDidImportUbiquitousContentChangesNotification通知を観測できる。
これはレコード単位の変更に対応することができる。

atomicストアを使う場合、
ubiquity containerに直接、永続ストアを配置できる。iCloudから伝播された変更を処理するには、適切なNSFilePresenterプロトコルのメソッドを実装する。



スキーマの移行


コア·データ·アプリケーションは、異なるスキーマを使用した他のバージョンとは同期しない。SQLiteストアを使った場合、CoreDataはiCloudにおいて、軽量の移行だけをサポートする。
軽量の移行を使った時、Appの違うバージョン同士では、互いに同期されないだろう。しかし、古いバージョンをアップグレードした時、古いバージョンはそれまでの変更を拾い、新しいバージョンは古いバージョンの変更を統合するだろう。

アトミックストアはファイル全体を上書きするため、スキーマを更新する場合、ストアは、以前のスキーマを使用しているクライアントで読み取ることができない。




機能制限


iCloudを使う際に、SQLiteストアはいくつか制限される。こういうときに:

・順序付けられた関係はサポートされない。
・パッケージ化されたデータベースファイルを使用して初期コンテンツをシードするべきではない。代わりに、コードを書いてデフォルトアイテムを作るか、NSPersistentStoreCoordinatorのmigratePersistentStore:toURL:options:withType:error:メソッドを使ってパッケージ化されたデータベースを必要な場所に統合することができる。
・mapping modelsを使ったスキーマ移行はサポートされない。軽量の移行はサポートする。


NSTimerを使う

NSTimerは、
・一定時間経った後にメソッドを呼び出したい時
・一定間隔でメソッドを呼び出したい時
に使います。

・NSTimerを作成する。


・主なメソッド

-(void)fire
(例)
[aTimer fire];
タイマーを動かす
-(void)invalidate
(例)
[aTimer invalidate];
タイマーを停める
-(BOOL)isValid
(例)
BOOL isTimerVaild = [aTimer isValid];
タイマーが動いているかを判定する


ネットワークアクセス中であることをユーザーに明示する方法

network access Activity indicator
ステータスバーにネットワークアクセス中であることを示すインジケータを表示する方法を説明します。

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
でインジケータが有効になります。
(ネットへのアクセスが始まると、自動でインジケータが表示されます。)

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
でインジケータは無効になります。


アプリを複数の言語に対応させる方法

アプリを複数の言語に対応させる方法について説明します。
今回は日本語と英語に対応させてみます。

1、まずは言語の設定ファイルを作ります。

▼適当なグループ(ここではSupporting Filesを選択しています)を右クリックしNew Fileを選択します
xcode new file

▼メニューが出てくるのでiOSのResouseの中からStrings Fileを選択します
strings file

▼英語表記のときに表示する文字列を
“Edit”=”Edit”;のような形式で入力します。(セミコロンを忘れずに!)
en localize

▼FileinspectorのLocalizationという項目の下にあるプラスボタンを押します
localization

▼Englishが現れます。
localization en

▼もう一度プラスボタンを押し、Japaneseを選択します
japanese

▼Japaneseが表示され、
localize

▼.stringsファイルが分割されます。
localizable.strings

▼.stringsファイルの(Japanese)の方は
“Edit”=”編集”;という形式で書きます。
localization ja

2、多言語化する部分にコードを追加する
▼下記の画像のように多言語化する文字列は
NSLocalizedString(@”Settings”, @”")
という形式で書きます。


3、確認してみる
「設定app→一般→言語環境」で表示言語を変更できます。
▼日本語の場合


▼Englishにした場合


ローカライズできました!


オブジェクトをプロパティリストに出力する方法と、プロパティリストから読みこむ方法

アプリで生成したデータを永続的に(アプリを終了しても消えないように)保存する方法のひとつに、「プロパティリストへ保存する」という方法があります。
NSArray、NSDictionary、などのオブジェクトからプロパティリストへ出力する方法と、プロパティリストから読み込んだデータをオブジェクトに戻す方法について書きます。

1,オブジェクトからプロパティリストへ出力する方法



2,プロパティリストから読み込んだデータをオブジェクトに戻す方法


自作の画像を使ってボタンを作る方法

一旦画像ファイルからUIImageに変換し、ボタン作成時にUIImageを指定して作成します。



「setBackgroundImage: forState:」メソッドのforStateには
1,UIControlStateNormal(ボタンが有効な時)
2,UIControlStateHighlighted(ボタンがハイライトの時)
3,UIControlStateDisabled(ボタンが無効な時)
と、3種類の状態が指定できるので、それぞれの状態に対して異なる画像を指定できます。