iOS 4 で 1 click のラウンチャーを作る

iOS Developer Program に参加してほやほやです。やったことのまとめ。

作りたいもの

  • 目標
    • 特定メールアドレスへメールを出すためのショートカットボタンを作りたい
  • 動機
    • iPhone のアドレス帳の選択が面倒くさい
    • 思いついたメモを自分宛に出す習慣があるので、ガラケーみたいなショートカット機能が欲しい
  • 最初のアイデア
    • アプリが起動したら内蔵メーラを起動する。そのまま終了する

メーラーの起動

アプリケーション間の通信の手段として、カスタム URL スキーマを使う仕組みがある。メーラーならば mailto: を開けば起動できる。to, subject, body が指定できる。自分のアプリにも URL スキーマは定義できるらしい。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto:?to=宛先&subject=題名"]];

アプリケーションの終了

アプリケーションライフサイクル

  • プロセスは残るのは仕方がないとして、初回起動以外でもアイコンをタップしたら呼ばれる関数は何か?
    • 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

スクリーンショットw

そもそも特定サイトへのリンクはホーム画面に置けるのだから、mailto: も置けそうな気がしますが・・・。