【iPhone】Objective-CでAtomPubを簡単に操作できるライブラリ公開してみた

Posted by: daichi  /  Category: 開発補助

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がやります。

?View Code OBJECTIVE-C
NSString *username = @"user";
NSString *password = @"pass";
DCAtomPubClient *atomClient = [[DCAtomPubClient alloc] initWithUsername:username password:password];

正確にはリクエストを投げるまでにユーザ名、パスワードがセットされていればリクエスト送信時にうまいことやってくれます。こんな形でもよいです。

?View Code OBJECTIVE-C
DCAtomPubClient *atomClient = [[DCAtomPubClient alloc] init];
atomClient.username = @"user";
atomClient.password = @"pass";

POST

AtomPubのPOSTメソッドはDCAtomPubClientクラスのpost:XMLString:メソッドで行います。
はてぶでは登録時にPOSTメソッドでXMLを投げます。
サンプルコードはこんな感じです。

?View Code OBJECTIVE-C
        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とコメントを渡してあげます。
サンプルはこんな感じです。

?View Code OBJECTIVE-C
	/** 
	 * はてなブックマーク用クライアントではてなブックマークを追加
	 */
	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を渡します。

?View Code OBJECTIVE-C
	DCHatenaClient *hatenaClient = [[DCHatenaClient alloc] initWithUsername:username password:password];
	[hatenaClient edit:@"15151515" title:@"変更後のタイトル" comment:nil];

すっきりですね。

ブックマークを削除する

ブックマーク削除は
- (void)delete:(NSString *)eid;
で行います。

?View Code OBJECTIVE-C
	DCHatenaClient *hatenaClient = [[DCHatenaClient alloc] initWithUsername:username password:password];
	[hatenaClient delete:@"15151515"];

もうAtomPub恐るるに足らずです。

その他

デリゲートとしてDCAtomPubDelegateを用意しています。呼べるものはNSURLConnection系を周到してます。こんな感じです。

?View Code OBJECTIVE-C
- (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のエンコード・デコード機能を追加する

iPhoneのPhotoアプリ再現どころではない神ライブラリ見つけた

Posted by: daichi  /  Category: 開発補助

以前見つけたphotoビューザサンプルコードを遥かに凌駕するオープンソースのライブラリを見つけてしまいました。

こんなことが簡単にできてしまう様子。

かっこいいラベルphotoビューアphotoライブラリタブコントローラyoutube的なあれインクリメンタルなあれ
続きを読む

iphoneアプリでHello WorldーPart 2

Posted by: daichi  /  Category: iphone開発

今回は前回のプロジェクト作成の続きです。

プロジェクト作成直後でコードを書く前の状態だと
当たり前ですがコンパイルエラーが発生しないので、
まずはまっさらな状態でビルドをして、先に
エミュレータで動かしてみます。

手順

  • ビルド構成/SDKの選択
  • ビルドする
続きを読む

iphoneアプリ開発に必要なもの

Posted by: daichi  /  Category: 開発準備

さっ!
というわけでね。

iphoneアプリを作って本当に稼げるのか?を検証するこのブログ。
始まってしまったわけですが、まずはiphoneアプリを開発するために
必要なもの、手順をまとめておきたいと思います。

僕は既にiphoneアプリ開発のチュートリアルを済ませているので
この準備までは整っていることになります。

必要なものを大きく分けると以下になります。

続きを読む

Get Adobe Flash playerPlugin by wpburn.com wordpress themes