プログラマでありたい

おっさんになっても、プログラマでありつづけたい

iPhoneでカレログを作ろう その1 位置情報の取得

 話題沸騰のAndroidアプリ、カレログ。初期に打ち出したコンセプトは確かにアレですが、彼氏の監視という利用方法から離れれば色々面白い製品になるのではないでしょうか?例えばモバイルデバイス管理(MDM)の製品は、似たような機能が搭載されています。例えば運送会社等で車に設置して、リアルタイムにどこに走っているかを一元管理して配車の最適化等でも使えるのではないかなと思います。
 ということで、技術的な検証の為にiPhoneでも似たような機能を作ってみようと思います。カレログの機能の構成要素としては、次の4点があります。(あとはサーバとの連携機能。)一部iOSでは許可されていないものもありそうですが、Appleのサンプルプログラムを元に順番に機能を実装していこうと思います。
・位置情報
・バッテリー残量の把握
・通信履歴の取得
・インストールされているアプリの一覧


 まずは、位置情報の取得からです。
サンプルコードを元に必要な機能を組み立てていきましょう。
Apple Developer Sample Code


 ざっと見て、LocateMeとLocationsが関係しそうです。
LocateMe
Locations
LocateMeはその名の通り、位置情報を使うアプリのサンプルコードです。Locationsは、位置情報をCoreData(DB)に格納してUITableViewで操作するサンプルコードです。2つのコードをみていると、CoreLocationフレームワークをインポートしてCLLocationManagerDelegateをデリゲートすることが解ります。ということで、まず位置情報を取得するところまで作ってみましょう。


 アプリ名は何でも良いですが、仮にDareTokuで作りました。
アプリのひな形は画面遷移等もシンプルなので、View-based Applicationでよいでしょう。
プロジェクトを作成したら、CoreLocation.frameworkを追加してください。
追加後に対象ソースにインポートして、CLLocationManagerを宣言しDelegateの設定も行います。

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>


@interface DareTokuViewController : UIViewController<CLLocationManagerDelegate> {
    CLLocationManager *locationManager;
}
@property (nonatomic, retain) CLLocationManager *locationManager;

@end


 CLLocationManagerの主なプロパティには測位の精度と取得間隔(時間ではなく、距離)があります。精度の要求を高くする程、バッテリーの減りも早いようです。メソッドとしては、GPSとコンパスの使用可否を判断するものと、開始・停止があります。今回はコンパスは関係ないので、GPSのスタートストップであるstartUpdatingLocation,stopUpdatingLocationを使います。またデリゲートメソッドとして、didUpdateToLocationというGPSから値を取得した時に発生するイベントがあります。このあたりを使えば、位置情報取得の一通りの機能が作れます。詳しくはiOS Developer Libraryで確認ください。
CLLocationManager Class Reference
CLLocationManagerDelegate Protocol Reference

#import "DareTokuViewController.h"

@implementation DareTokuViewController

@synthesize locationManager;
@synthesize startButton;
@synthesize stopButton;
@synthesize latitude;
@synthesize longitude;

...

#pragma mark -
#pragma mark Location manager

//Location Manager 設定
- (CLLocationManager *)locationManager {
	
    if (locationManager != nil) {
		return locationManager;
	}
	
	locationManager = [[CLLocationManager alloc] init];
	[locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
	[locationManager setDelegate:self];
	
	return locationManager;
}


//位置情報取得
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {
    NSLog(@"didUpdateToLocation");
    CLLocationCoordinate2D coordinate = [newLocation coordinate];
    self.latitude.text = [[NSNumber numberWithDouble:coordinate.latitude] stringValue];
    self.longitude.text = [[NSNumber numberWithDouble:coordinate.longitude] stringValue];
    
}

//位置情報取得失敗
- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error {
    NSLog(@"can't get location");
}

#pragma mark -
#pragma mark Buttion Action
- (IBAction) startButtonTapped {
    [[self locationManager] startUpdatingLocation];
}
- (IBAction) stopButtonTapped {
    [[self locationManager] stopUpdatingLocation];
}

@end


 アプリを起動してStartボタンを押すと無事に位置情報の取得が出来ました。
こんな感じで一つづつ機能を実装していこうかと思います。またある程度までいったら、
どこかにソースを全部公開しようと思います。


 次回は取得したデータをローカルのDBに保存しようと思います。
enjoy!!


目次
iPhoneでカレログを作ろう その1 位置情報の取得
iPhoneでカレログを作ろう その2 DBへのデータ格納
iPhoneでカレログを作ろう その3 地図の表示


iPhone SDKの教科書―Cocoa Touchプログラミング、最初の一歩
赤松 正行
秀和システム
売り上げランキング: 13153

iPhone/iPadアプリ作家必見。iTunesでのダウンロード数が簡単にチェック出来るアプリ

 iTunesストアでアプリを公開したことがある方なら解ると思いますが、iOSアプリ製作者向けのAppleの管理サイト「iTunes Connect」ですが、幾つかの点で不満があります。
・ダウンロード数の保持期間が短い
・ダウンロード数のレポートが、CSV等の形式でダウンロード出来ない
・カスタマーレビューが国別に別れている為、公開している国ごとに選択しないといけない


 特にカスタマーレビューのチェックについては、全世界への公開をしていたら現実的に使えない代物になっています。上記解決する為にはApple自身がAPIのような形式でダウンロード数やカスタマーレビューを取得出来るようにして貰えればありがたいのですが、現状はそうなっていません。代替策としてWebをスクレイピングして、必要な情報を取得するという方法が取られています。
 WebベースだとappFiguresというサービスがあるのですが、iTunesConnectのID,Passwordを外部のサービスに預けるというのは非常に危険です。そうなると自前のローカルのアプリとして動かして、そこにID,Passwordを保存するのが理想的です。幾つか探してたのですが、iPhoneアプリとして良いのがありました。"AppSales"
 なかなか高機能で、ダウンロード数の推移やカスタマーレビューも一目でわかります。また保存したデータを、エキスポートも出来ます。自前でビルドする必要はありますが、元々アプリ製作者向けなので何ら問題ないと思います。是非、お試しあれ

iPhoneアプリ開発の必読書がまた1冊。iOS開発におけるパターンによるオートマティズム

 巷で話題のiOS開発におけるパターンによるオートマティズムを買って読みました。一言でいうと、こんな本が欲しかったです。iPhoneアプリの開発本は数あれど、デザインパターンに言及している本はお目に掛かったことがなかったです。(正確にはデザインパターンでは無いですが。)
 冒頭の目的にも書いてある通り、アプリを実装するだけであればサンプルやチュートリアルを見ていれば作れるようになります。しかし、コードの寄せ集めのアプリでは規模が大きくなると破綻します。規模が大きくなっても破綻しないようなクラス設計の手助けをするのが本書です。


 まずは、目次をご覧あれ

1. パターンとは何か
2. アプリ設計のパターン
3. モデルのパターン
4. メモリ管理のパターン
5. ビューコントローラのパターン
6. テーブルのパターン
7. 通知のパターン
8. ネットワークのパターン
9. iPadへの対応

 MVCのそれぞれの部分について、どのようなパターンで作ればよいかのサンプルがあります。
私も幾つかアプリ作ったことがありますが、正直iOSでの開発経験が慣れていないので、どこにどんな役割のクラスを配置すれば良いのか試行錯誤でした。一度iPhoneアプリを作ってからこの本を読めば、有り難さが実感でき、またより良いソースを書くにはどうすればよいかの参考になります。
(Cocoa touchフレームワークの上に)フレームワークを作るな。パターンを作れ。これですね。


 この本は、間違いなくiPhoneアプリ開発の定番の一冊になると思います。是非、ご検討を。
次は、誰かiPhoneアプリのテストの本を出してくれないですかねw

iOS開発におけるパターンによるオートマティズム
木下 誠
ビー・エヌ・エヌ新社
売り上げランキング: 1556

iPhone/iPadアプリを多言語対応する

 自作のiPhoneアプリを多言語対応してみました。
iPhoneというかObjective-Cに用意されている機構を使えば、割と簡単に対応出来ます。

まずは、サンプルのxibファイルです。

ラベル2個と、ボタン1個というシンプルな画面です。


 次に、Localizeファイルの用意します。
今回は例として、英語と日本語に対応してみます。
適当にLangというフォルダを作って、その下に、en.lprojとja.lprojというフォルダを作ります。この言語フォルダは、ISO_639で定義された2文字か3文字のコードです。他の言語に対応する場合は、このコードに対応したディレクトリを追加すれば大丈夫です。なお、xcodeのグループで作ろうとした場合、実ディレクトリが作れません。最初にFinderでディレクトリだけ作ることをお薦めします。


 ディレクトリを作ったら、Resourcesの下にLocalizable.stringsというファイルを作ります。新規ファイルの作成のMac OS X→Resource→Strings Fileで作れます。注意点は、先ほど作ったディレクトリを指定することです。(直下とかに作ると、二つ目の言語の時に名前が被って作れません)


 二つの言語を追加すると、次のようになります。
Localizable.stringsの下に二つの言語が出てきます。何か良い感じです。


Localizable.stringsの中身は、次のようになります。
English

/* 
   Localizable.strings
   LocalizeSample
 */
"label1"="label1";
"label2"="label2";
"button"="button";

日本語

/* 
   Localizable.strings
   LocalizeSample
 */
"label1"="ラベル1";
"label2"="ラベル2";
"button"="ボタン";

 書式は、"ラベル名"="表示させる内容";となります。
最後のコロンを忘れると、次のようなエラーが出るのでご注意を。プロパティファイルなので、XCodeは指摘してくれません。

Command /Developer/Library/Xcode/Plug-ins/CoreBuildTasks.xcplugin/Contents/Resources/copystrings failed with exit code 1


最後にコードの方で、上記のラベルを呼び出せば完了です。

	label1.text = NSLocalizedString(@"label1", @"");
	label2.text = NSLocalizedString(@"label2", @"");
	button.titleLabel.text = NSLocalizedString(@"button", @"");

引数の一つ目がラベル名です。二つ目はコメントなので指定しなくても大丈夫です。
ラベルが見つからなかったら、ラベル名が代入されます。


ちなみにこう言う書き方も出来ます。

	label1.text = [[NSBundle mainBundle] localizedStringForKey:@"label1" value:@"label1" table:nil];

localizedStringForKeyでラベルを探してきて、無かったらvalueの値をセットします。記述量が多いので、基本的には最初の書式で充分じゃないかと思います。


 実行すると次のようになります。
尚iOSシュミレータ上で言語の切替をするのは、シミュレータ上から設定ボタンで変更します。
少し変な感じです。


 また、言語別にアプリの表記名等を代える場合は、InfoPlist.stringsで可能です。

/*
 ja.lproj/InfoPlist.strings
 */
CFBundleDisplayName = "日本語アプリ";


 多言語対応した感想ですが、日本語しか対応しない場合も基本的にはこの作り方で作っておいた方が良いのではないかなと思います。1画面しか無い場合は恩恵は少ないですが、複数画面あるような場合は、表記名の一元管理に威力を発揮します。もちろん多言語対応する場合も簡単になります。是非これは覚えておくべき手法かなと思います。是非お試しあれ!!


参考:
livedoor Techブログ : iPhoneアプリを多言語対応にする

iPhone,iPad開発電子ブック、Appleが無料で公開

 Apple、6冊の開発者向け書籍をiBookstoreで提供開始で知りましたが、iOS Developer Centerで公開されている資料が、無料でiBookStoreに公開されました。


 リンク元によると6冊公開のようですが、日本ではiOS Human user interface Guidelineを除いた5冊のようです。apple developer publicationsで検索するとまとめて出てくるので、全部落としたい時に便利ですよ。


 実は初めてiBookを使ったのですが、ちょっと動作が重いですね。こういう技術系の資料であれば、PDFのままでCroudReaderでさくさく使う読む方が向いていると思います。PDFは、iOS Reference Libraryに一杯あります。主要なドキュメントについては、日本語化もされていますよ。

iPhone4買ったら、これも買え。Case-Mate iPhone 4 Hybrid Tough Case

 永らくiPhone 3Gユーザだったのですが、遂にiPhone4デビューしました。
今までと格段に違う動作速度、初めて目にするマルチタスク。やっと時代に追いつきました。
それで暫く本体ままで使っていたのですが、やはりカバーがないと滑りやすいですし、
落とした時が心配なので買ってきました。
 選んだのが、Case-Mate iPhone 4 Hybrid Tough Case with Screen Protector, Black / Black ハイブリッド タフケース (液晶保護シート つき), ブラック / ブラック CM011660
長い名前ですが、店頭でずっと触って選んで厳選した結果です。
選考基準としては、以下3点。つまり、落とさない!!壊さない!!丈夫さが売りです。
・落とした時に、ある程度大丈夫そう
 →内部はシリコンケース(ソフトケース)で、外部はABS素材の強化プラスチック(ハードケース)の
  二重構造
・滑らない
 →裏面のグリップが効いています。
・分厚くない
 →2重構造の割には、結構薄いです


 ソフトケースはラバー製でペラペラのが多くて耐衝撃性に疑問があるのが多く、
またハードケースはただのプラスチックが多く、こちらも落としたら一発で壊れそうなのが多かったです。
ということで厳選した一品です。是非店頭でお確かめあれ。丈夫さという観点ではピカイチだと思います。


 ちなみにiOS4のマルチタスク機能を初めて見たのですが、アプリの作り方を
気をつけておかないと駄目ですね。今度研究してみます。


参考:
iPhone買ったら、これも買え


iPhone買ったら、これも買え

 なんだかんだといって、もう2年以上iPhoneを使っています。外出先での便利さを考えると、無かった時代が信じられないほどです。そんなiPhoneの弱点は、そう電波の弱ry。じゃなくてバッテリーの持続時間です。そんな訳で必須となるのが、予備バッテリー。何種類か試行錯誤しましたが、結局サンヨーのリチウムイオンバッテリーに落ち着いています。一つ前の世代のKBC-L2ASの場合は出力が5Wなので、公式にはiPadには対応していません。それに対して最新のKBC-L2BSは出力が10WでiPadにも対応でiPhoneの高速充電も可能です。
 どちらを選ぶかは好み次第ですが、iPadの電池容量には定評があるのでKBC-L2ASで充分なんじゃないかなと思います。また忘れてはいけないのが接続ケーブル。普通のケーブルをカバンに入れておくと絡まりやすいので、コンパクトに収納出来るのがありがたいです。後は予備の電源電源アダプタ。バッテリーの電源を持ち運ぶより使い勝手が良くてGoodです。iPhoneを直接充電することも出来るし、バッテリーも充電出来るし、コンパクトです。そんなこんなが2年間の結論です。


プロテック プッシャーリンク iPod専用USBケーブル PP-IWH ホワイト 【iPod nano 5G/iPhone 3G,3GS】
プロテック
売り上げランキング: 198
おすすめ度の平均: 4.0
5 使いやすい
3 使えないバッテリーがあります
3 まぁまぁです
4 白いから
5 省スペース
Apple Apple USB 電源アダプタ MB352J/B
アップル
売り上げランキング: 1201