iOS 4 で 1 click のラウンチャーを作る
iOS Developer Program に参加してほやほやです。やったことのまとめ。
作りたいもの
メーラーの起動
アプリケーション間の通信の手段として、カスタム URL スキーマを使う仕組みがある。メーラーならば mailto: を開けば起動できる。to, subject, body が指定できる。自分のアプリにも URL スキーマは定義できるらしい。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto:?to=宛先&subject=題名"]];
アプリケーションの終了
- openURL は別プロセス起動に相当するので、自分のプロセスは残る
- ライフサイクルとしては、OS からの終了では applicationWillTerminate() が呼ばれるが、自発的に終了できるのか?
- exit() で無理矢理終了できるが、iPhone Human Interface Guideline で禁止されている
- Don’t Quit Programmatically
- http://developer.apple.com/library/ios/#qa/qa1561/_index.html
アプリケーションライフサイクル
- プロセスは残るのは仕方がないとして、初回起動以外でもアイコンをタップしたら呼ばれる関数は何か?
- applicationDidBecomeActive()
- ライフサイクルは下記のページがとてもわかりやすかった
ビューを作らない最低限の構成
- 新規プロジェクトの Window-based Application や View-based Application のテンプレートの差分を見て試行錯誤したが、まとまっている記事を発見した
- main とあとはデリゲート先さえはっきりしていれば、アプリケーションライフサイクルを実現する最低限の要件は満たしているようだ
main.m
- NSAutoreleasePool は Cocoa のリファレンスカウント式のメモリプールらしいが、厳密にどういう時に必要なのか(どういう前提なら要らないのか)はちょっとはっきりせず
- 試しにコメントアウトしても動いてしまった
- UIApplicationMain() は UIApplication.h のコメントを見ると Info.plist と連動している→nil ではなく具体的にかけば、MainWindow.xib は削除可能
int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, @"MailButtonAppDelegate"); [pool release]; return retVal; }
MailButtonAppDelegate.h
- View だけじゃなく、Window も削除
@interface MailButtonAppDelegate : NSObject <UIApplicationDelegate> { } @end
MailButtonAppDelegate.m
- 以下、主要部分のみ
#import "MailButtonAppDelegate.h" @implementation MailButtonAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return YES; } - (void)applicationDidBecomeActive:(UIApplication *)application { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto:?to=foo@bar.com&subject=NEW%20TASK"]]; } - (void)dealloc { [super dealloc]; } @end