
TwitPicのOAuthEcho対応 | iphoneアプリで稼げるのか
Twitter OAuth対応シリーズ。第三回目はTweetPhotoのOAuthEcho対応です。
前回のTwitPicのOAuthEcho対応をベースで話を進めます。
API Keyはここで取得しておきます。
TweetPhoto | Admin Site
続きを読む
だいぶ更新が滞っていました。
遅ればせながら明けましておめでとうございます。
今年もひとつよろしくお願いします。
早速ですが、iTaskTimer Liteリリースしました!
ダウンロードはこちらから


せっかくアプリを作っても使ってくれる人が少ないのは寂しいことです。なのでお気軽に使ってもらえるようにと去年リリースしたタイマーアプリiTaskTimerの無料版という位置づけでiTaskTimer Liteを用意しました。
アプリで何ができるかというと
- タスクの見積もり
- タスクの計測(バックグラウンドでもOK)
- 見積もりとの差違をレポートで確認
これにより
- やることを登録して気持ちよくお仕事できる!
- 計測することで集中力アップ!
- 振り返りで見積もり精度アップ!
気になる有料版との違いは
- Google Calendar連携なし
- Twitter連携なし
- アプリリンクがある
無料なので気軽にお試しください!→試してやるか
おまけ
去年の年末のAppleさんのクリスマス休暇以降、アプリ審査が爆速で行われているようです。このアプリも申請からReady for Saleまでたったの5時間という爆速っぷり。さすがに5時間は出来過ぎかなと思ってますが、1日や2日で審査が終わるというケースが多いようです。審査期間が長いことは開発者にとっても、ユーザにとってもネックになる部分だったので嬉しい改善ですね。今後もこれが続くとよいです。
最後に無料なので気軽にお試しください!→しつこいので試してやるか

iPhoneアプリ開発者なら一度はCoverflowを実装してみたいと思うはず。
coverflowの実現方法は、以前からエリカ様の書籍にて公開されていましたが、undocumentedなAPIを使っているため、おそらくあの方法では申請したところでAppleに蹴られて終わりでしょう。最近はundocumented API検出ツールのようなものをAppleが使って審査してるという話もあるので、審査の目は前よりも厳しくなってる気がします。
となると、自力で実装していくしかないのですが、ちょうどよいライブラリがあったので、早速試してみる。
続きを読む



実はFakeCameraはこのブログに書いていない提出も何度かしているので、もはや何度目の提出か覚えていませんが、懲りずにまた提出しました。
この間は、iPhoneのシステム音声をFake音に使って選択できるようにしたら、それはダメだよ、と怒られてしまったので、今回はFake音をフリー音源のみにしての再提出です。
Appleさん今度こそ!
ちなみに音源はMacに標準でついてくるGarage Bandのものが商用利用もOKらしいので、けっこう使えそうですよ。
商用に GarageBand で著作権無料のループを使用する
今回は審査に3週間という通常の3倍の期間をとられてしまい、だいぶリリースが遅れてしまいました。
今回のバージョンは、パスコードロック画面でパスコードを設定せずにキャンセルボタンを押してしまうと、パスコードが未設定の状態で、ロックがかかってしまい、アプリが利用できなくなるという致命的な不具合の修正版となります。
利用できなくなってしまった方はもちろんのこと、そうでない方も早急にバージョンアップすることをおすすめします。
ご迷惑をおかけしましたが、これからもよろしくお願いします。



新作でTwitter,はてな,Google Readerから横断的に情報収集し、マルチポストするアプリを作っているのですが、そこでTwitterのリプライPush機能を実装したので、Push Notificationを実装する方法をまとめてみます。
Push Notificationの流れ
Push Notificationに関する登場人物は、- iPhone
- Apple Push Notification Service(APNs)
- Provider
iPhoneはいわずもがな、みんなの手元にあるiPhone。APNsはAppleが用意しているPushしてくれるやつです。Providerは、開発者が用意するもので、こいつがPushしたい情報を送る役割を持ちます。
この3者間でのデータの流れは大きくデバイス登録とPush通知の2つのフェーズに分かれます。
デバイス登録
デバイス登録フェーズではAPNsへPush通知するiPhoneを登録します。このときAPNsから一意なデバイストークンが発行され、これをProviderが保持することで、Push通知を送りたいiPhoneをProviderが特定できるようになります。流れはこんな感じ。
- iPhoneにアプリをインストール
- アプリ起動時にiPhoneからAPNsへデバイスの認証通知をする
- APNsから認証されると、デバイストークンを受け取る
- iPhoneからデバイストークンをProviderへ送る
Push通知
Push通知フェーズでは、ProviderからAPNsへPush情報と共に認証情報を送ります。APNsから認証されると、送信先iPhone宛にPush通知が送られ、晴れてiPhone上であのAlertが表示されるようになります。流れはこんな感じ。
- 任意のタイミングでProviderからPush情報と認証情報をAPNsへ送る
- APNsから認証されるとiPhoneへPush通知が送られる
- iPhone上でポップアップ!
鍵を作る
デバイス登録手順1のアプリインストールは飛ばすとして、2のiPhoneからAPNsへデバイス認証通知をするためには、鍵が必要です。なのでApple Developer Connection – iPhone Dev Center – Overviewへ行って鍵を作りましょう。
手順はこんな感じです。
- 左メニューApp IDsからNew App ID
- Descriptionには自分のわかりやすい説明を
- Bundle Seed IDはGenerate NewでOK
- Bundle Identiferは*は使えません。net.longearth.earth等、一意な値となるようにドメイン名を逆から綴ったものにしておく
- 以上を入力してsubmit
- App IDsのManage画面で登録したApp IDのConfigureリンクを押す
- ひとまず開発用の設定をするため、Development Push SSL CertificateのConfigureを押す
- Lightbox風に鍵作れといわれるのでキーチェインを起動
- キーチェーンアクセス→証明書アシスタント→認証局に証明書を要求…
- ユーザのメールアドレスは登録したメールアドレスを
- コモンネームは他の証明書の時と同じ名前を
- ディスクに保存をチェック→続ける→保存
- ブラウザに戻りContinueを押す
- さっき作った証明書を選択してGenerate
- 認証されたらContinue
- Downloadなうして、Done
- Lightbox風が終わるので画面上でステータスがenabledになっていることを確認
- ダウンロードした証明書をダブルクリックしてキーチェーンに保存
- キーチェーンの「自分の証明書」分類にあるApple Development Push Servicesを選択して、メニュー→ファイル→書き出す…→保存(apns-dev-cert.p12)
- 同様にキーチェーン画面からApple Development Push Services横の三角を開き、秘密鍵を選択→メニュー→ファイル→書き出す…→保存(apns-dev-key.p12)
ここまでがApple上のドキュメントに書いてあるのですが、p12ファイルとやらをどう使えばよいのかよくわからないので、pemフォーマットに変換(正直この部分はわかってない。男は黙って以下のコマンド群を打ち込む。)
- openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
-
openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
- openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem
-
cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem
鍵ができたら、ここで作成したApp IDを指定したProvisioningファイルを作成して、Xcodeにインストール。code signに設定しておくことも忘れずに。
デバイス認証通知
認証通知は簡単です。UIApplicationのregisterForRemoteNotificationTypes:で通知処理を設定します。これだけでcode signされた内容でデバイス認証しに行く様子。アプリ起動直後あたりに仕込んでおきます。ちなみにここでPush時にバッヂ表示させるか、音をならすか、アラート画面を出すかを選択できます。以下はすべてを通知させるような例。- (void)applicationDidFinishLaunching:(UIApplication *)application {
[[UIApplication sharedApplication]
registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge|
UIRemoteNotificationTypeSound|
UIRemoteNotificationTypeAlert)];
// 他の処理...
} |
デバイストークンを受け取る
APNsから認証されるとデバイストークンを受け取ることができます。認証後はUIApplicationのapplication:didRegisterForRemoteNotificationsWithDeviceToken:メソッドが呼ばれるのでここで受け取ります。- (void)application:(UIApplication*)app
didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)devToken{
NSLog(@"deviceToken: %@", devToken);
self.devToken;
[self sendProviderDeviceToken:devToken];
} |
sendProviderDeviceToken:メソッド内でProviderへデバイストークンを送る処理をしています。NSLogで送られてきたdevTokenをログ出力してますが、このとき表示される32バイトの値がデバイストークンです。後のproviderでのテストのために控えておきます。
認証エラー時は以下のメソッドが呼ばれます。
- (void)application:(UIApplication*)app
didFailToRegisterForRemoteNotificationsWithError:(NSError*)err{
NSLog(@"Errorinregistration.Error:%@",err);
} |
code signが間違っている等、分かりやすい日本語で表示してくれているので助かります。
Providerへデバイストークンを送る
ここは好きなようにProvider宛にデバイストークンをPostしてあげてください。ちなみにこんな感じでポストできるはずです。
- (void)sendProviderDeviceToken:(NSData *)token {
NSMutableData *data = [NSMutableData data];
[data appendData:[@"device=" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:token];
self.request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"ホスト名"]];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:data];
[NSURLConnection connectionWithRequest:request delegate:self];
} |
サーバ側では、このデバイストークンを控えておきます。実用的な所でいうと、このデバイストークンと何かしらのユーザを識別するIDをサーバへ送ることになると思います。
ここまでで、デバイスの登録が完了です。
ProviderからAPNsへPush通知を送る
ProviderからAPNsへの通知は以下のようなフォーマットで送る必要があります。
始めの3バイトは固定で、0,0,32。16進では0×00,0×00,0×20です。その後デバイストークンと続き、0×00,送信データサイズ、送信データという流れです。
このあたりはバイナリにまとめたものをファイルに書き出し、ターミナルから
xxd ファイル名
として中身を確認することをおすすめします。アプリ側のNSLogで出力したデバイストークンは16進表記なので、その値がきれいに上のデバイストークンの場所に収まっていればだいじょぶだと思います。
送信処理をrubyで書くとこんな感じです。以下のスクリプトを実行する時は、作成した証明書と秘密鍵を同じディレクトリに置いておいてください。
#!/usr/bin/ruby require 'openssl' require 'socket' device = ['デバイストークンのバイナリ値'] socket = TCPSocket.new('gateway.sandbox.push.apple.com',2195) context = OpenSSL::SSL::SSLContext.new('SSLv3') context.cert = OpenSSL::X509::Certificate.new(File.read('apns-dev.pem')) context.key = OpenSSL::PKey::RSA.new(File.read('apns-dev-key-noenc.pem')) ssl = OpenSSL::SSL::SSLSocket.new(socket, context) ssl.connect payload = <<-EOS { "aps":{ "alert":"New Message!", "badge":1, "sound":"default" } } EOS (message = []) << ['0'].pack('H') << [32].pack('n') << device.pack('H*') << [payload.size].pack('n') << payload ssl.write(message.join('')) ssl.close socket.close |
上の例では、Alert表示に”New Message!”を出して、アプリアイコンバッヂに1を表示させ、デフォルトの音をならすような通知設定をしています。設定方法の詳細はApple Push Notificationサービス プログラミングガイドにあります。
証明書と鍵さえ正しいものを使っていれば、ローカルのmacからでもPushすることができるので、ローカルでごにょごにょ確認するのがいいと思います。ここまでくれば、送る相手のデバイストークンさえ分かればPushできるので、登録されたデバイストークンを全取得する方法を用意しておけば、ローカルから最新情報告知なんていう使い方もできそうです。
特に気の知れた相手のデバイストークンが分かっていれば、「うんこ」なんて通知もできてしまいそうです。もちろん自重します。絶対。
これから
あとはアプリの任意のタイミングで上記のように送りたい相手のデバイストークンを取得して、メッセージを送信することでPushすることができます。麻雀アプリなら上家がパイを切った後に、Providerへ通知させて、次の相手のデバイストークンを引っ張ってきてPushという形になるでしょう。
Twitterのリプライ通知をどのようにしようかすごく悩んでいたのですが、Stream APIが使えそうです。
Twitter API Wiki / Streaming API Documentation
試してみた所、まだアルファテスト版ということでだいぶ不安定な気もします。Twit Pushとかどうやっているのか気になります。
長いことおつかれさまでした。
しかし、めんどくさい。
もうちょっと楽にできないかな。
参考
後で気づいたけど日本語のドキュメントがあった。iPhone Dev Center
cocoa*life – Apple Push Notification Serviceを利用した、iPhone クライアントと、Rubyによるサーバの作成。
How to build an Apple Push Notification provider server (tutorial) « Boxed Ice Blog
先日アップデートされたiSlot Pro、iPachiにパスコード設定画面でパスコードを設定せずにキャンセルボタンから画面を閉じると、設定してもいないパスコードロックが効いてしまい、アプリが使えなくなってしまう不具合がありました。
修正版を先ほどAppleへ申請しました。
審査が通るまでの間、いましばらくお待ち下さい。
修正版がアップデートされるまで現バージョンではパスコードロック画面からキャンセルボタンはおさないようお願いします。
ご迷惑をおかけしました。
daichi1128’s DCAtomPub at master – GitHub
はてなブックマークの登録をiPhoneアプリから行うにははてなのAtomPub APIを叩く必要がありますが、WSSE認証やらsha1やらbase64エンコードやらISO8061やらXMLポストやらでハマリ倒してしまったので、二度とつまずかないためにもライブラリ化してみた。
ライブラリというほど大げさなものでもないのですが、ソースコード公開デビューということで大目にみてやってください。
Objective-CでAtomPubを簡単に操作するライブラリDCAtomPubをgithubに公開しました。
ライセンスは修正BSDライセンスです。
AtomPubに関する情報はこちらから。
日本語訳はこれ。ソフトウェア分野の研究開発 / RFC 5023 Atom Publishing Protocol 日本語訳 | Ricoh Japan
はてなブックマークAPIはこちらから。
はてなブックマークAtomAPIとは – はてなキーワード
セットアップ
ターミナルから以下のコマンドでダウンロード(要gitクライアント)git clone git://github.com/daichi1128/DCAtomPub.git |
githubからダウンロードしたら、Xcodeで起動し、DCAtomPubグループ内のファイル群を自分のプロジェクトにコピー。はてな用クライアントも必要ならHatenaExample内のファイルもコピー。
使い方
WSSE認証
DCAtomPubClinetの初期化メソッドの引数にユーザ名、パスワードを渡してあげれば面倒なWSSE認証の準備は勝手にDCAtomPubClientがやります。NSString *username = @"user"; NSString *password = @"pass"; DCAtomPubClient *atomClient = [[DCAtomPubClient alloc] initWithUsername:username password:password]; |
正確にはリクエストを投げるまでにユーザ名、パスワードがセットされていればリクエスト送信時にうまいことやってくれます。こんな形でもよいです。
DCAtomPubClient *atomClient = [[DCAtomPubClient alloc] init]; atomClient.username = @"user"; atomClient.password = @"pass"; |
POST
AtomPubのPOSTメソッドはDCAtomPubClientクラスのpost:XMLString:メソッドで行います。はてぶでは登録時にPOSTメソッドでXMLを投げます。
サンプルコードはこんな感じです。
NSString *username = @"user";
NSString *password = @"pass";
/**
*AtomPubクライアントではてなブックマークを追加
*/
DCAtomPubClient *atomClient = [[DCAtomPubClient alloc] initWithUsername:username password:password];
atomClient.delegate = [[DummyDelegate alloc] init];
NSString *hatenaPostURL = @"http://b.hatena.ne.jp/atom/post";
NSString *postXMLTemplate =
@"<entry xmlns=\"http://purl.org/atom/ns#\">"
@"<link rel=\"related\" type=\"text/html\" href=\"%@\" />"
@"<summary type=\"text/plain\">%@</summary>"
@"</entry>";
// POSTメソッドでXMLを送信
[atomClient post:hatenaPostURL XMLString:[NSString stringWithFormat:
postXMLTemplate,
@"http://iphone.longearth.net/itasktimer/",@"DCAtomPubから" ]]; |
PUT
はてなブックマークの編集時にAtomPubのPUTメソッドを使います。使い方はPOST時と同じように、DCAtomPubClientのput:XMLString:を呼べばOKです。DELETE
はてなブックマークの削除時にAtomPubのDELETEメソッドを使います。使い方はPOST、PUTと同じです。DCAtomPubClientのdelete:XMLStringを呼びます。はてなブックマークの場合はXMLStringはnilでOKです。はてなクライアントの使い方
AtomPubの扱いは上のDCAtomPubClientでだいぶ簡略化できたけど、いちいちXMLを調べて組み立てるのが面倒だ。なのではてな用AtomPubクライアントも作りました。DCHatenaClient。DCAtomPubClientを継承してます。
ブックマークを追加する
DCHatenaClientを使ってブックマークを登録するには、DCHatenaClientの- (void)post:(NSString *)bookmarkURL comment:(NSString *)comment;
メソッドで行います。
引数にはブックマークするURLとコメントを渡してあげます。
サンプルはこんな感じです。
/** * はてなブックマーク用クライアントではてなブックマークを追加 */ DCHatenaClient *hatenaClient = [[DCHatenaClient alloc] initWithUsername:username password:password]; [hatenaClient post:@"http://iphone.longearth.net" comment:@"DCHatenaClientから"]; |
だいぶすっきりします。
ブックマークを編集する
ブックマーク編集は- (void)edit:(NSString *)eid title:(NSString *)title comment:(NSString *)comment;
で行います。
引数に編集するエントリID、変更後のタイトル、変更後のコメントを渡します。はてぶAPI的にタイトルとコメントいずれか必須らしいのでそうしてください。変更したくないものはnilを渡します。
DCHatenaClient *hatenaClient = [[DCHatenaClient alloc] initWithUsername:username password:password]; [hatenaClient edit:@"15151515" title:@"変更後のタイトル" comment:nil]; |
すっきりですね。
ブックマークを削除する
ブックマーク削除は- (void)delete:(NSString *)eid;
で行います。
DCHatenaClient *hatenaClient = [[DCHatenaClient alloc] initWithUsername:username password:password]; [hatenaClient delete:@"15151515"]; |
もうAtomPub恐るるに足らずです。
その他
デリゲートとしてDCAtomPubDelegateを用意しています。呼べるものはNSURLConnection系を周到してます。こんな感じです。- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; - (void)connectionDidFinishLoading:(NSURLConnection *)connection data:(NSData *)data; - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; |
リクエストを投げる前に
dcAtomPubClinet.delegate = self;
などとしてセットしてあげればNSURLConnectionと同じ感覚で使えるはずです。
mixiの隠しAPIもAtomPubらしいので、うまくいけば使えるかもしれません。まだ試してない。
※本来ならAtomPubのルートエンドポイントからアクセス可能なURLを引っ張ってくるのがAtomPub的に正しいことらしいのですが、面倒なので今回はそこまでしてません。
参考
はてなブックマークAtomAPIとは – はてなキーワードCocoaでWSSE認証 – 24/7 twenty-four seven
cocoa_crypto_hashing: Summary
NSDataにBase64のエンコード・デコード機能を追加する
Web APIを使うiPhoneアプリにはXMLのパースは必要不可欠。アプリ開発者のみなさんはXMLのパースはどのようにしているのでしょう。NSXMLParser、libxml、TouchXML、KissXMLいろいろ方法はありますが、今回使ってみて結構使い勝手がよかったKissXMLの使い方を書いてみます。
続きを読む
いろいろカスタマイズして便利にします。
外観
デバッグコンソールなどを1つのウィンドウに統合する
シミュレータでアプリを起動すると、デバッガコンソールがXcodeの後ろに隠れてしまい、いちいちフォーカスを切り替えるのが面倒。そんなときはこの設定を。Xcode→環境設定→全般→レイアウト→オールインワン
アプリ実行時にデバッガを自動的に表示する
Xcode→環境設定→デバッグ→開始時→コンソールとデバッガを表示__MY_COMPANYNAME__を変更する
ファイルを新規に作成する時にファイル作成者の情報等が自動生成されるが__MY_COMPANYNAME__が気持ち悪い。そんな時は、コンソールから以下のコマンドを叩く。YourNameHereを表示したい名前に置き換えて。defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions
'{ORGANIZATIONNAME="YourNameHere";}' |
プリプロセッサ
デバッグ用マクロ
デバッグ時はNSLogメソッドをよく使うが、リリースビルドにはNSLogを使いたくない。そんな時はプリプロセッサでDebugモードの時だけ、NSLogを吐くマクロを定義すればいい。Global.h
#ifdef DEBUG #define LOG(...) NSLog(__VA_ARGS__) #else #define LOG(...) #endif |
info.plistでDebug構成時のみ、GCC_PREPROCESSOR_DEFINITIONS項目にDEBUG文字列を設定する。
すると、LOG(@”hogehoge”)でDebug構成時のみ、NSLogを吐けるようになる。
テンプレート
IBを使わないテンプレートを作成する
Interface Builderは最近は使わなくなったので、新しいプロジェクトを作る場合に、いちいち削除したりするのが面倒。そんな時はプロジェクトテンプレートをカスタマイズする。Xcodeのプロジェクトテンプレートは、以下の場所においてある。
/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application
ユーザ定義のテンプレートは以下の場所に置くとXcodeに認識される。
~/Library/Application Support/Developer/Shared/Xcode/Project Templates/Application/
Windowベースのアプリケーションをベースにカスタマイズする。オリジナルのWindow-based Applicationをユーザ定義の方にコピーしてWindow-based-non-IB Applicationにリネーム。
ディレクトリ内の___PROJECTNAME___はすべてプロジェクト名に置き換えられる。
変更するのは以下。
- info.plistのMain nib file base name→空に
- main.m内のUIApplicationMainメソッドの第4匹数に@”___PROJECTNAME___AppDelegateを”
- MainWindow.xib→削除
- ___PROJECTNAME___.xcodeproj/project.pbxproj→MainWindow.xibに関する部分をすべて削除
個人的に___PROJECTNAME___AppDelegateという名前が長ったらしくてあまり好きではないので、これをAppDelegateにした。
この時の変更箇所は以下。
- main.m→@”___PROJECT_NAME___AppDelegate”を@”AppDelegate”へ
- ___PROJECT_NAME___AppDelegate.h→ファイル名をAppDelegate.hへ。中身も該当箇所を修正
- ___PROJECT_NAME___AppDelegate.m→ファイル名をAppDelegate.mへ。中身も該当箇所を修正
- ___PROJECT_NAME___.xcodeproj/project.pbxproj→___PROJECT_NAME___AppDelegate部分をすべてAppDelegateへ修正
.gitignore、.gitattributeをテンプレートに含める
gitを使いだすとgitの設定ファイルである.gitignoreでXcode用ファイル達を除外したくなるが、これを毎回プロジェクトを作る度にコピーしてくるのは面倒なので、テンプレートに含めてしまう。やり方は上のテンプレートディレクトリに.gitignore、.gitattributeファイルを入れるだけ。.gitignoreは
# xcode noise build/* *.pbxuser *.mode1v3 # old skool .svn # osx noise .DS_Store profile |
.gitattributesは
*.pbxproj -crlf -diff -merge |
ここまでのテンプレート設定ディレクトリをいちおのせておく。これをダウンロードして、ローカルの
~/Library/Application Support/Developer/Shared/Xcode/Project Templates/Application/
に置けば、使えると思う。
Window-based-non-IB Application
これには次のログマクロテンプレートも含まれている。
ログマクロをテンプレートに含める
さきほど作ったログマクロをテンプレートに含めるのは、テンプレートディレクトリ内にログマクロを記述したファイルを追加すればOKだが、ファイルを開発時にファイルを新規作成するたびに、#import “Global.h”
とするのは面倒だ。
なので、ファイル作成時に既に#import “Global.h”を追記されているファイルテンプレートを作成する。
オリジナルのファイルテンプレートは以下に置いてある。
/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/File Templates/Cocoa Touch
このCocoa Touchディレクトリをユーザ定義用ファイルテンプレートディレクトリである
~/Library/Application Support/Developer/Shared/Xcode/File Templates/
へコピー。
あとはファイルを好きなように変更すればそれがテンプレートになる。
Cocoa Touchのすべてのファイル作成時にGlobal.hを含むように設定したファイルテンプレートはこれ。
Cocoa Touch Class
これを
~/Library/Application Support/Developer/Shared/Xcode/File Templates/
へ入れれば、ユーザ定義ファイルとして使える。
よく使うフレームワークをテンプレートに含める
例えば、Three20だったり、JSONフレームワークだったり、GTMだったり、こういうよく使うフレームワークはあらかじめ使える準備の整ったプロジェクトテンプレートが欲しくなる。これも上のやり方同様、コピーしたローカルのテンプレート周りをいじくり倒して設定できる。マクロ
よく使うメソッドをマクロとして登録する
Xcodeでは、Ctrl+.でマクロを呼び出せる。例えばinitと打って、Ctrl+.を押すと、NSObjectのinitメソッドが挿入される。他にもlog、deallocなどが予めマクロとして登録されている。
が、ViewController周りのメソッド達は登録されていないので、いちいちviewWillAppear〜などとよく使うメソッドを入力しなければならない。これは面倒だ。ということでマクロを登録する。
オリジナルのマクロ定義ファイルは以下にある。
/Developer/Applications/Xcode.app/Contents/PlugIns/TextMacros.xctxtmacro/Contents/Resources/ObjectiveC.xctxtmacro
これをユーザ定義のマクロファイル置き場である以下にコピーする。
~/Library/Application Support/Developer/Shared/Xcode/Specifications
マクロとして
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
を追加する場合は、ファイル内に以下のような記述を追加する。
{
Identifier = objc.didselect;
BasedOn = objc;
IsMenuItem = NO;
Name = "didSelectRowAtIndexPath";
TextString = "- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {¥n¥t<#statements#>¥n}";
CompletionPrefix = didselect;
}, |
内容の説明
- Identifier→ユニークな識別ID。
- Name→Xcodeで編集→テキストマクロを挿入→Objective Cと行った時に表示される名称
- TextString→マクロ実行時に挿入される文字列
- CompletionPrefix→マクロ発動文字列。例の場合、didselectと入力してCtrl+.を押すとマクロが実行される
ひとまず
viewWillAppear, viewDidAppear, viewDidLoad, viewWillDisappear, viewDidDisappear, cellForRowAtIndexPath, didSelectRowAtIndexPathなどを登録してみた。なかなか悪くない。
vwaと入力してCtrl+.でviewWillAppear発動。他もvda、vdl、vwd、vdd、cellfor、didselectで発動するのでいい感じ。
この設定済みマクロはこちらから。
ObjectiveC.xctxtmacro
