お久しぶりです。
長いこと更新をさぼってしまいました。
気負わずゆるく更新していこうと思います。
さて。今回は他でもありません。
デザインど素人な僕がついにフォトショップに手を出すことにしました。
続きを読む
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のエンコード・デコード機能を追加する
いろいろカスタマイズして便利にします。
外観
デバッグコンソールなどを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
参考
まずはこちらをご覧ください。
【iPhone】iPhone 3GSは機種変更で買おう | iphoneアプリで稼げるのか
今日ソフトバンクショップでiPhone 3GS予約してきました。
そこでiPhone 3GSの機種変更時の価格について、再度聞いてきたのですが、どうも前回聞いた時点より、好条件になりそう。
続きを読む
Timberline: File Index
Aral Balkan – Private iPhone APIs in XCode for Dummies
エリカ様のサイトは何かある度に参考にさせてもらっているのだけど、肝心のOS3.0に対応した非公式APIはさすがに公開されていない。
NDAにひっかかるからだろうけど、このままではOS3.0での開発がなかなか進まないではないか。
特にカメラ系アプリは皆無といっていいほど、公式APIは公開されていないので、undocumentedなAPIが分からないことにはなかなか進まない。
ということで、自力でPrivate FrameworkのAPI一覧を作る方法を調べてみた。
NDAがあるので、さすがにAPI一覧までは公開しない。あくまで生成方法まで。
続きを読む
「iPhone 3G S」について | ソフトバンクモバイル株式会社
iPhone 3GS。ソフトバンクからも正式に発表されましたね。
iPhoneアプリ開発者たる者、新iPhoneが出れば黙って購入するのが筋というもの。
ただ、機種変するのと、新規で買い増し2本持ちするのとでどっちがよいのか、いまいち料金形態がよく分かってなかったので、ソフトバンクへ行って聞いてきた。
※「買い増し」表記が紛らわしいとの指摘をうけたので、定義を追記します。ここでの「買い増し」はsoftbankの定義する「Softbank 3GからiPhone3Gへの機種変更」ではなく、「iPhone 3G S用の新規契約を結ぶこと」を指しています。(2009/06/21 追記)
機種変更(買い増し・契約変更) | SoftBank
続きを読む
開発中のアプリを先行公開する時に使えそうなmac用ディスプレイ動画キャプチャフリーソフト。
Leopard専用に作成された動画キャプチャ・ソフトウェア『スクリン・クロラ』 | Macの手書き説明書
youtube用、iPhone用サイズなどのキャプチャサイズが用意されていて、サクッととれるのでよさげ。
iShowU | Macの手書き説明書
フリーでも使えるけど、画面にロゴが入ってしまうみたい。
ポッドキャストとけものみち「BONCHICAST Log」 – デスクトップを動画でキャプチャ「Jing」[Win&Mac]
だいぶ重くてカクカクしてしまう。
スクリンクロラがよさそう。
関連のあるアプリ
海外販売を狙うアプリを作っている場合は、全て画面に表示される全ての文字列を初めからNSLocalizableStringで実装すべき。
A-Liaison BLOG: iPhoneアプリをローカライズ(国際化対応)してみた
genstringsコマンドを使うとNSLocalizableStringを使っている部分をファイルに書き出してくれるので、ローカライズがとてもらくちん。
以下のコマンドをプロジェクトのROOTディレクトリで叩くとLocalizable.stringsができる。
genstrings -a $(find . -name "*.m") |
予めEnglish用とJapanese用のLocalizable.stringsをxcode上で作成しておいて、このコマンドで生成されたファイルの中身をコピペ。
あとは、日本語なり英語なり中身を書き換えれば終了。
注意はUTF-16でLocalizable.stringsを用意しておくことくらいかな。
関連のあるアプリ
iPhoneのPhotoアプリ再現どころではない神ライブラリ見つけた | iphoneアプリで稼げるのか

まだほとんどソースを見切れてないけど、とりあえず全体を流しみるためにも、doxygenを使ってドキュメント生成してみた。
Three20ドキュメント
(このドキュメント先、一時的に借りてるサーバなので後でURL変わるかも)
神ライブラリ。ソース見ればみるほどすごいっす。
Photoビューア部分とかUIScrollViewをうまく使っているのかなと始めは思っていたのですが、UIViewから独自のTTScrollViewを1から作り込んでいたのですね。ん〜なるほどです。
続きを読む

![]()
【デザイン】iPhoneアプリ用アイコンを外注してみた | iphoneアプリで稼げるのか
以前、Lancersに依頼していたiPhoneアプリ用アイコンですが、募集期間5日間、依頼金額3000円という内容で7つもの提案を頂き、本日上のアイコンを提案してくださったK_Megumiさんを当選とさせていただきました。
続きを読む

