拙作 iPhone 用 RSS リーダー iYKRSS、iPad 用 RSS リーダー iYKRSSHD 無料公開、 iOS 用 Twitter アプリ作成方法

ちょっと宣伝です。拙作 RSS リーダー iYKRSS を iPhone 5 スクリーンで表示できるようにしました。また、iPadRSS リーダー iYKRSSHD を Retina ディスプレイに対応しました。

あらかじめ登録された芸能人ブログリストから RSS フィードを簡単に選ぶことができるので、RSS リーダーを使ったことがない初心者にもお勧めです。

iYKRSS、iYKRSSHD 共に無料です。ただし、iYKRSSHD は、9月になると 85 円に戻ります。iPhoneiPod touchiPad を持ってる人は、良かったら試しにダウンロードしてみてください。

使い方がわからない人は、気軽にコメントに書き込んでください。返事は、遅れるかもしれないのでご了承ください。

iYKRSS version 1.0.4
http://appstore.com/yoshiakikoyama/iykrss

iYKRSSHD version 1.0.2
http://appstore.com/yoshiakikoyama/iykrsshd

随分遅れましたが、前回、予告した iOS 用 Twitter アプリ作成方法を説明したいと思います。私自身、良く理解していない部分もあるので、間違いもあるかもしれません。

基本的に、下記 URL の REST API v1.1 を

REST API v1.1 Resources | Twitter Developers
https://dev.twitter.com/docs/api/1.1

使って Twitter のタイムライン情報などを取得します。REST API v1.1 を前回説明した GET、POST で送信するのですが、

Authorizing a request | Twitter Developers
https://dev.twitter.com/docs/auth/authorizing-request

上記、URL の

POST /1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Authorization:
OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog",
oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1318622958",
oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
oauth_version="1.0"
Content-Length: 76
Host: api.twitter.com
status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21

のように、認証情報 (上の Authorization: OAuth の部分) が必要です。OAuth を使って取得する必要があります。

しかし、iOS の場合、

 Using Reverse Auth | Twitter Developers
https://dev.twitter.com/docs/ios/using-reverse-auth

Reverse Auth を使って OAuth の情報を取得できます。取得の仕方は、

 seancook/TWReverseAuthExample · GitHub
https://github.com/seancook/TWReverseAuthExample

を参考にした拙作サンプル

自作 iOS 用 Twitter アプリ サンプル TSTwitter
http://kyoshiaki.sakura.ne.jp/osx/Sample/Twitter.zip

に含まれています。 KeyDefines.h の

#define TWITTER_CONSUMER_KEY    @""
#define TWITTER_CONSUMER_SECRET @""

を設定してください。Consumer key、Consumer secret を使うには、

Twitter Developers
https://dev.twitter.com/

にログインして、自分のアイコンをクリックして表示されるメニューから ‘My applications’ を選び、’Create a new application’ ボタンをクリックして My application を作成する必要があります。

Sign in with your Twitter account | Twitter Developers
https://dev.twitter.com/apps

作成した application を選べば、Consumer key、Consumer secret は表示されます。

自作 iOS 用 Twitter アプリ サンプル TSTwitter
http://kyoshiaki.sakura.ne.jp/osx/Sample/Twitter.zip

の TSViewController.m の Reverse Auth を呼び出している部分は、

TSViewController.m

- (void)awakeFromNib {
__unsafe_unretained TSViewController *me = self;
_accountStore = [[ACAccountStore alloc] init];
_apiManager = [[TWAPIManager alloc] init];
ACAccountType *twitterType = [_accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
_accounts = [_accountStore accountsWithAccountType:twitterType];
_account = [_accounts objectAtIndex:0];
NSLog(@"%@", _account);
NSLog(@"identifier: %@", _account.identifier);
NSLog(@"username: %@", _account.username);
if ([TWITTER_CONSUMER_KEY isEqualToString:@""]) {
NSLog(@"TWITTER_CONSUMER_KEY=\"\"");
[self requestApiTimeline:self];
//        [self requestApi:me];
} else {
[_apiManager performReverseAuthForAccount:_account withHandler:^(NSData *responseData, NSError *error) {
if (responseData) {
NSString *responseStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSArray *parts = [responseStr componentsSeparatedByString:@"&"];
me.reverseAuth = [NSMutableDictionary dictionary];
//            NSLog(@"%@", responseStr);
for (NSString *line in parts) {
NSArray *array = [line componentsSeparatedByString:@"="];
[me.reverseAuth setObject:array[1] forKey:array[0]];
}
//            NSLog(@"%@", me.reverseAuth);
//
[me requestApi:me];
//                [me requestRawApi:me];
}
}];
}
}

[_apiManager performReverseAuthForAccount:_account withHandler:^(NSData *responseData, NSError *error) { です。

_apiManager に引数、ACAccount *account と最終的に呼ばれるブロックを渡し、performReverseAuthForAccount: withHandler: メソッドを呼ぶと

Using Reverse Auth | Twitter Developers
https://dev.twitter.com/docs/ios/using-reverse-auth

の最後にある下部

oauth_token=2311112785-EXKeLV5ezo3HHIaIf1T3ffeww0mR5dfYXKZjjRy0&oauth_token_secret=KYxxxxx3U4Fxrxva3BGD92--12ehEzFwQ&user_id=38895958&screen_name=theseancook

のような、oauth_token、oauth_token_secret、user_id、screen_name を NSData *responseData で返してくれます。ここで重要なのは、user_id を返してくれることです。実は、Reverse Auth を使わなくても、タイムラインを表示することができます。

    if ([TWITTER_CONSUMER_KEY isEqualToString:@""]) {
NSLog(@"TWITTER_CONSUMER_KEY=\"\"");
[self requestApiTimeline:self];
//        [self requestApi:me];

上の部分が TWITTER_CONSUMER_KEY が設定されていない場合、Reverse Auth を使わないでタイムラインを表示しています。

ただし、他の REST API v1.1 を使用するためには user_id が必要になってきます。

後は、簡単です。アップルが用意したフレームワークの SLReuest を使って Twitter API v1.1 を呼び出す汎用 API

- (void)performTwitterRequestAccount:(ACAccount *)account Method:(SLRequestMethod)method URL:(NSURL *)url parameters:(NSDictionary *)dict completion:(TwitterRequestHandler)completion

です。

- (void)requestApi:(id)sender {
//    url = [NSURL URLWithString:@"http://192.168.1.6:9090/1.1/lists/list.json"];
url = [NSURL URLWithString:@"https://api.twitter.com/1.1/lists/list.json"];
//    dict = @{@"user_id" : @"00000000"}; // user_id を設定してください
dict = @{@"user_id" : [self.reverseAuth objectForKey:@"user_id"]}; // TWITTER_CONSUMER_KEY を設定していないと使えません。
[self performTwitterRequestAccount:_account Method:SLRequestMethodGET URL:url parameters:dict completion:^(NSArray *json, NSURLResponse *response, NSError *error) {
NSLog(@"===< List >===");
//      NSLog(@"%@", json);
for (NSDictionary *list in json) {
NSString *text = [NSString stringWithFormat:@"<%@>\n  list_id:%@\n  slug:%@",[list  objectForKey:@"uri"],[list  objectForKey:@"id"],[list  objectForKey:@"slug"]];
NSLog(@"%@", text);
}
}];

で、- (void)performTwitterRequestAccount:(ACAccount *)account Method:(SLRequestMethod)method URL:(NSURL *)url parameters:(NSDictionary *)dict completion:(TwitterRequestHandler)completion を呼び出しているのがわかると思います。この場合、自分のリストを表示しています。

 url = [NSURL URLWithString:@"http://192.168.1.6:9090/1.1/lists/list.json"];

を有効にして、前回の GET、POST のように SLRequest がどんなデータをサーバーに送信しているのか確認することができます。

まず、ターミナルで

自作 iOS 用 Twitter アプリ サンプル TSTwitter
http://kyoshiaki.sakura.ne.jp/osx/Sample/Twitter.zip

に含まれる server.rb を実行します。その後、TSTwitter.xcodeproj を開き、ツールバー上 Run ボタンをクリックします。画面が現れプログラムが起動し終えたら、Stop ボタンを押します。ターミナル上に実際の SLRequst がサーバーに送るデータが下図のように表示されます。

上図より、

Authorizing a request | Twitter Developers
https://dev.twitter.com/docs/auth/authorizing-request

上記 URL の

POST /1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Authorization:
OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog",
oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1318622958",
oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
oauth_version="1.0"
Content-Length: 76
Host: api.twitter.com
status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21

と似ているのが理解できると思います。SLRequest を使わずに NSMutableURLRequest で実現したのが

自作 iOS 用 Twitter アプリ サンプル TSTwitter
http://kyoshiaki.sakura.ne.jp/osx/Sample/Twitter.zip

に含まれているソース

TSSignedRequest.h
TSSignedRequest.m

の TSSignedRequest

- (void)performTSTwitterRequestMethod:(TSSignedRequestMethod)method URL:(NSURL *)url parameters:(NSDictionary *)dict completion:(TSTwitterRequestHandler)completion {
- (void)requestRawApi:(id)sender {
- (void)performTSTwitterRequestMethod:(TSSignedRequestMethod)method URL:(NSURL *)url parameters:(NSDictionary *)dict completion:(TSTwitterRequestHandler)completion {

です。SLRequest と似ているので注意してください。TSSignedRequest を通常使う必要はありません。Twitter API の動作を確認するために、実験的に作ってみただけです。SLRequest を使ってください。

SLRequest を使うだけなら、Reverse Auth が必要ないと思うかもしれません。以前は ACAccount *account から user_id を取り出すことができたのですが、現在、Reverse Auth を使って user_id を取り出すしか方法がありません。

Twitter API v1.1 を試すには、Mac App StoreTwitter、ターミナル上で curl を使う方法があります。

Mac 上で動作する本家 Twitter アプリは、Mac App Store にあります。

Twitter
http://appstore.com/mac/twitterinc/twitter

上記 URL をクリックすれば表示されます。

Twitter をクリックして実行し、メニュー/Twitter/環境設定… を選び、ツールバーから ‘開発者’ を選択します。コンシュマーキー、アクセストークンを入力し、認証ボタンをクリックすると開発者メニューが有効になります。

試しに、メニュー/開発/コンソール を選び、ホームタイムラインを表示してみたのが下図です。

curl を使って試す方法は、まず、

Twitter Developers
https://dev.twitter.com/

にログインします。

REST API v1.1 Resources | Twitter Developers
https://dev.twitter.com/docs/api/1.1

を開き、呼びたい REST Api をクリックします。ここでは、GET statuses/home_timeline にします。
右側、OAuth tool で ‘Select one of your Apps’ から自分のアプリケーションを選びます。その後、Generate OAuth signature ボタンをクリックします。

表示されたページの Request URI: が正しく設定されているか確かめます。 Request query: に設定したいパラメーターを入力します。ここでは、count=2 と入力します。

この後、ページの一番下の See Oauth signature for this request ボタンをクリックします。

表示されたページの OAuth Signing Results に cURL command と名前の項目があります。右横にパラメーターがセットされた curl コマンドが表示されています。それをコピーして、ターミナルにペーストし実行すれば、生の JSON データを取得することができます。

自作 iOS 用 Twitter アプリ サンプル TSTwitter 公開、シンプルな Ruby 製 HTTP サーバーを使った GET、POST 解析。

iOS 用 Twitter アプリの作成方法について書こうと思っていたのですが、あまり時間がとれなかったので次回にしたいと思います。サンプルは、先に公開しておきます。

自作 iOS 用 Twitter アプリ サンプル TSTwitter
http://kyoshiaki.sakura.ne.jp/osx/Sample/Twitter.zip

Twitter REST v1.1 API をコールし、結果を Xcode のコンソールに表示する簡単なプログラムです。( Social.framework を使用しているので iOS 6.0 以上で動作します。 )

xAuth、Apple 純正ソーシャルネットワークフレームワークの SLRequest、NSURLRequest で直接呼び出す TSSignedRequest など Twitter REST API をいろいろな方法で呼び出せるので便利です。初心者にも実用的なプログラムが組めるので、楽しめると思います。UITableView を使って本格的な Twitter アプリに仕立てるのも面白いと思います。

詳細は、次回に。

今回は、手始めとして REST の動作を学ぶため、 GET、POST の違いを解説します。

Ruby で簡単な HTTP サーバーを作り、Safari でアクセスし、表示されたフォームから GET と POST を使ってサーバーにデータを送信します。送られてきた生のデーターを表示してみます。

自作 iOS 用 Twitter アプリ サンプル TSTwitter
http://kyoshiaki.sakura.ne.jp/osx/Sample/Twitter.zip

GET、POST を使用する HTTP サーバーは、上記サンプルに含まれている server_get.rb、server_post.rb です。
server_get.rb は、Safari がアクセスすると HTML書式

<form method="get" action=".">
<p>Name:<br><input type="text" name="name" size="50"></p>
<p>Message:<br>
<textarea name="message" cols="50" rows="5"></textarea></p>
<p><input type="submit" value="Send"></p>
</form>

を送信します。

<form method="get" action=".">

の method を下記のように post に変更したものが

<form method="post" action=".">

server_post.rb です。

server_get.rb と server_post.rb の使用方法は、同じなので server_get.rb で説明します。

まず最初に、メニュー/アップルマーク/システム環境設定… を選び、’システム環境設定’ を開きます。
インターネットとワイヤレス/ネットワークをクリックします。

IP アドレスを確認します。ここでは、192.168.1.6 に設定されています。

テキストエディタXcode で server_get.rb ファイルを開きます。(Finder 上、またはドッグの中の Xcode アイコンにファイルをドラッグ・ドロップすれば開くことができます。)

# 5行目の
server = TCPServer.new('192.168.1.6', 9090);

上の ‘192.168.1.6’ の部分を確認した IP アドレスに置き換えてください。IP アドレスが 192.168.1.2 なら

server = TCPServer.new('192.168.1.2', 9090);

です。

/アプリケーション/ユーティリティ/ターミナル.app を起動し、server_get.rb があるパスまで移動し、./server_get.rb を実行して、HTTP サーバーを起動します。

~ $ cd Desktop/Twitter/
~/Desktop/Twitter $ ls
TSTwitter	server.rb	server_get.rb	server_post.rb
~/Desktop/Twitter $ ./server_get.rb
GET
Listening on port 9090

Safari で先程指定した IP アドレス、http://192.168.1.6:9090 にアクセスします。下図のように表示されます。フォームに Name: Yoshiaki、Message: Hello! と入力して ‘Send’ ボタンをクリックします。

Safari 実行画面

サーバーからの返答がないので、送信が止まりません。それで Safari の URL フィールド右端の ‘x’ ボタンをクリックして中止します。すると、ターミナル側に Safari から送信された生データーが次のように表示されます。(実際のデータには、文字列両端のダブルクォーテーション ( ” ) は含まれていません。)

~/Desktop/Twitter $ ./server_get.rb
GET
Listening on port 9090
"GET /?name=Yoshiaki&message=Hello%21 HTTP/1.1\r\n"
"Host: 192.168.1.6:9090\r\n"
"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.29.13 (KHTML, like Gecko) Version/6.0.4 Safari/536.29.13\r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
"Referer: http://192.168.1.6:9090/\r\n"
"Accept-Language: ja-jp\r\n"
"Accept-Encoding: gzip, deflate\r\n"
"Connection: keep-alive\r\n"
"\r\n"

Listening on port 9090 の次の行、 GET に表示されるのが URL とパラメーターです。? はパラメーターの開始を表し、& は区切り文字です。

"GET /?name=Yoshiaki&message=Hello%21 HTTP/1.1\r\n"

上部分より、 Safari のフォームで入力された値、name が Yoshiaki、message が Hello%21 というパラメーターで送信されたことがわかります。%21は ! 文字の URL エンコードです。 HTML の

<input type="text" name="name" size="50"></p>
<textarea name="message" cols="50" rows="5"></textarea></p>

より、input の name=”name” と textarea の name=”message” が入力された値の名前です。

フォームを Safari が解釈して、サーバーにデータを送っています。フォームは複雑な表記ですが、送信するデータは name=Yoshiaki&message=Hello%21と単純です。
server_get.rb を終了するには、ターミナル上で CTRL + C キーを押してください。

POST を利用した server_post.rb で同じように試してみると

~/Desktop/Twitter $ ./server_post.rb
POST
Listening on port 9090
"POST / HTTP/1.1\r\n"
"Host: 192.168.1.6:9090\r\n"
"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.29.13 (KHTML, like Gecko) Version/6.0.4 Safari/536.29.13\r\n"
"Content-Length: 30\r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
"Origin: http://192.168.1.6:9090\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
"Referer: http://192.168.1.6:9090/\r\n"
"Accept-Language: ja-jp\r\n"
"Accept-Encoding: gzip, deflate\r\n"
"Connection: keep-alive\r\n"
"\r\n"
"name=Yoshiaki&message=Hello%21"

上のように表示されます。GET と違ってパラメーターは、ヘッダの後、ボディーに付加されます。

"name=Yoshiaki&message=Hello%21"

の部分です。GET、POST の違いがはっきりわかると思います。サーバーに送られるパラメーターは同じです。

次回、紹介しますが、同封の server.rb を使って、Apple 純正ソーシャルネットワークフレームワークの SLRequest がどんなデーターをサーバーに送信するか、覗き見ると面白いかもしれません。

iOS 5 iCloud プログラミング

ニンテンドーDSi ウェア ‘プチコンmkII’ で、もう一つ取り組んでいるプログラムがあります。しかし、ちょっと一段落して iOS の iCloud について調べてみました。

最初に、新しくなった Xcode 4 の復習のため

Start Developing iOS Apps Today: Introduction
https://developer.apple.com/library/ios/#referencelibrary/GettingStarted/RoadMapiOS/Introduction/Introduction.html
Your Second iOS App: Storyboards: About Creating Your Second iOS App
https://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/SecondiOSAppTutorial/Introduction/Introduction.html
Your Third iOS App: iCloud: About Your Third iOS App
https://developer.apple.com/library/ios/#documentation/General/Conceptual/iCloud101/Introduction/Introduction.html

の3つの例題を試してみました。最終目的の iCloud プログラミングの理解に、3番目の Your Third iOS App が一番参考になります。iCloud は Simulator では動作しないので注意してください。

私自身、あくまでも趣味の範囲なので、iCloud の理解も UIDocument を基準にすることにしました。

iCloud に、どんなファイルが保存されているか調べるには OS X 上では

OS X (iCloud)
~/Library/Mobile Docunents

の上記フォルダで確認することができます。このフォルダの中身を変更すると問題が起こる確率が高いので、やめたほうがいいと思います。

また、iPhoneiPadiPod touch 上の

設定.app
iCloud  > ストレージとバックアップ > ストレージを管理 > 書類およびデータ

から、アプリを選択すると iCloud 内のファイルが表示されます。

右上に ‘編集’ ボタンがあるので iCloud 内のファイルを削除する時は、こちらを使うと良いと思います。

後、OS X、iOS 開発書籍の著者として有名な木下誠さんの iOS 技術情報誌アプリ

HMDT BOOKS
カテゴリ: ブック
販売業者: HMDT Co., Ltd.
http://itunes.apple.com/jp/app/hmdt-books/id500860946?mt=8
HMDT
http://hmdt.jp/

HMDT JOURNAL Vol.001
第1回 iCoud(1) iCoud とは
\170
HMDT JOURNAL Vol.002
第2回 iCoud(2) NSUbiquitousKeyValueStore
\170
HMDT JOURNAL Vol.003
第3回 iCoud(3) ファイルベースの同期
\170
HMDT JOURNAL Vol.004
第4回 iCoud(4) ドキュメントベースの同期
\170

も参考になると思います。貴重な情報源で、書籍のように邪魔にならないので、毎回購入しています。

まず最初に、Document-Based App を理解しないといけないので

Document-Based App Programming Guide for iOS: Creating a Custom Document Object
http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/DocumentBasedAppPGiOS/CreateCustomDocument/CreateCustomDocument.html#//apple_ref/doc/uid/TP40011149-CH8-SW1
▼Creating a Custom Document Object
Loading Document Data
Supplying a Snapshot of Document Data
Storing Document Data in a File Package

上の説明に出てくるソースから、Document-Based App を作りました。

また、ドキュメントデータをそれぞれ NSData、NSFileWrapper のどちらかで保存する方法も学びました。

NSURL の

+ URLWithString:
+ fileURLWithPath:

の違いに注意してください。

また、Document Type の宣言方法は、

Document-Based App Programming Guide for iOS: Document-Based Application Preflight
http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/DocumentBasedAppPGiOS/DocumentImplPreflight/DocumentImplPreflight.html#//apple_ref/doc/uid/TP40011149-CH3-SW2
▼Document-Based Application Preflight
▼Creating and Configuring the Project
Declare a Document Type

上記 URL のページが参考になります。

UTI の種類は

Uniform Type Identifiers Reference: Introduction to Uniform Type Identifiers Reference
http://developer.apple.com/library/ios/#documentation/Miscellaneous/Reference/UTIRef/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009258-SW1

を参照してください。

ここまで、Document-Based App の理解が進むと iCloud に取り掛かるのに充分だと思います。

iCloud について

Document-Based App Programming Guide for iOS: Designing a Document-Based Application
http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/DocumentBasedAppPGiOS/DocumentArchitectureiniOS/DocumentArchitectureiniOS.html#//apple_ref/doc/uid/TP40011149-CH2-SW7
▼Designing a Document-Based Application
▼A Document in iOS
 		A Document in iCloud Storage

を読んでから、もう一度

Your Third iOS App: iCloud: About Your Third iOS App
https://developer.apple.com/library/ios/#documentation/General/Conceptual/iCloud101/Introduction/Introduction.html

のソースと

Document-Based App Programming Guide for iOS: Managing the Life Cycle of a Document
http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/DocumentBasedAppPGiOS/ManageDocumentLifeCycle/ManageDocumentLifeCycle.html#//apple_ref/doc/uid/TP40011149-CH4-SW1
▼Managing the Life Cycle of a Document
▼Creating a New Document
▼Opening and Closing a Document

を参考に理解を深めると良いと思います。

Version Conflicts については

iiOS App Programming Guide: iCloud Storage
https://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/iCloud/iCloud.html#//apple_ref/doc/uid/TP40007072-CH5-SW1
▼iCloud Storage
▼Using iCloud Document Storage
Choosing a Strategy to Respond to Version Conflicts

が参考になります。

また、iCoud と Local 間の Documents の移動は

Document-Based App Programming Guide for iOS: Managing the Life Cycle of a Document
http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/DocumentBasedAppPGiOS/ManageDocumentLifeCycle/ManageDocumentLifeCycle.html#//apple_ref/doc/uid/TP40011149-CH4-SW1
▼Managing the Life Cycle of a Document
▼Moving Documents to and from iCloud Storage

に説明されています。HMDT JOURNAL Vol.001 ~ Vol.004 も参考になります。

Your Third iOS App: iCloud: About Your Third iOS App
https://developer.apple.com/library/ios/#documentation/General/Conceptual/iCloud101/Introduction/Introduction.html

のソースを読んでいると Blocks

Blocks Programming Topics: Introduction
https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html
A Short Practical Guide to Blocks
https://developer.apple.com/library/ios/#featuredarticles/Short_Practical_Guide_Blocks/_index.html
Building with Blocks in C and Objective-C
https://developer.apple.com/library/mac/#featuredarticles/BuildingWithBlocks/_index.html

や GCD

Concurrency Programming Guide: Introduction
https://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html

の理解も必要になってくると思います。

手っ取り早く理解したい場合は

Introducing Blocks and Grand Central Dispatch
https://developer.apple.com/library/mac/#featuredarticles/BlocksGCD/_index.html

が参考になります。

私自身、なかなか理解できない部分もあるので 、書籍

Creating iOS 5 Apps: Develop and Design

Creating iOS 5 Apps: Develop and Design

Creating iOS 5 Apps: Develop and Design [Kindle Edition]
Rich Warren (Author)
Kindle Price:
$21.99

を Amazon で購入し、iPadKindle で読んでいる途中です。iOS 5 になって変わった基本的な Objective-C の機能についての説明もあるので、今まで iOS 開発を行ってきた人にもお勧めの本です。

アップル 2010年秋 スペシャルイベント、Twitter 用ライブラリ XAuthTwitterEngine に機能を追加して公開

アップル 2010年秋 スペシャルイベントが 9月1日 (September. 1, 2010 at 10 a.m. Pacific Time : 日本時間9月2日深夜午前2時) に Yerba Buena Center で開かれました。スペシャルイベントのストリーミング動画は

Apple - Apple Events - Apple Special Event September 2010
http://events.apple.com.edgesuite.net/1009qpeijrfn/event/index.html

で見ることができます。iTunes Podcast

Apple Keynotes - Apple Special Event, September 2010
http://itunes.apple.com/jp/podcast/apple-keynotes/id275834665

でも配信されています。

今回のイベントで発表されたのは新 iPod ラインナップ、iOSプレビュー、新 iTunes とサービス、新 Apple TV でした。

iPod nanoiPod shuffle には興味がありませんが、新 iPod touch は、拙作 iYKRSS を Retina ディスプレイには対応させるために購入しようか悩んでいます。カメラ機能も購買意欲をそそられます。

以前 id:KYoshiaki:20100627、紹介したように自作した iPadRSSリーダー iYKRSSHD と Twitter アプリ iYKTwitter は毎日使用しています。ところが、Twitter の認証方式が OAuth 認証必須になり、Basic 認証が廃止されました。それで iYKTwitter を OAuth 認証に対応させる必要が生じました。

ネットで調べてみると OAuth 対応は難しそうなので OAuth 認証の簡易版 xAuth が良さそうです。

xAuth を使うために以下のサイトを

xAuthを使うための手続き - タイトルは未定
http://d.hatena.ne.jp/nakaji999/20100623/1277306203
xAuthの申請をしてみた « Today’s Replay
http://tmokita.sakura.ne.jp/wpress/2010/06/28/xauth%E3%81%AE%E7%94%B3%E8%AB%8B%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/

を参考にしました。

Create cool applications! | dev.twitter.com
http://dev.twitter.com/

まず、最初に上の URL で Twitter アカウントでサインインし、2. Register an app をクリックするとアプリケーション登録申請ページが開きます。自作アプリを登録します。ただし、アプリケーション名で Twitter という文字を含んでいるとエラーになります。私の場合、iYKTwitter では登録できませんでした。それでアプリケーション名を iYKTweetHD に変更しました。これで OAuth 認証が使えるようになりました。

OAuth 認証の簡易版 xAuth を利用するためには api@twitter.com にメールを送って、有効にしてもらう必要があります。メールに送る内容については、先ほど紹介した下記 2つのページが参考になります。

xAuthを使うための手続き - タイトルは未定
http://d.hatena.ne.jp/nakaji999/20100623/1277306203
xAuthの申請をしてみた « Today’s Replay
http://tmokita.sakura.ne.jp/wpress/2010/06/28/xauth%E3%81%AE%E7%94%B3%E8%AB%8B%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/

それぞれ申請するアプリの platform に合わせて送信する内容を置き換えてください。私の場合は iPadiOS 3.2 です。また、下記本家サイトを確認すると

Using xAuth | dev.twitter.com
http://dev.twitter.com/pages/xauth
xAuth access is restricted to approved applications. If your application is a
desktop or mobile application and the standard web OAuth flow or PIN-code
out-of-band flow is not right for you, send a detailed message to api@twitter.com
to request xAuth privileges. Include the name of your application,
the consumer key, the application ID (if available), and a summary of how xAuth
is best-suited for your application.

consumer key も必要そうなのでメールで送りました。スクリーンショットについては、私は MobileMe に加入しているので、Sites フォルダにスクリーンショットファイルを置いて下記 URL をメールに書いて送りました。

http://homepage.mac.com/'メンバー名'/'スクリーンショットファイル'

次の日にメールで xAuth が使用可能になったと返事が届きました。

xAuth を自力で実装するのは無理なので、参考になるライブラリを探しました。XAuthTwitterEngine が良さそうです。

最初に見つけた XAuthTwitterEngine ライブラリは

aral's XAuthTwitterEngine at master - GitHub
http://github.com/aral/XAuthTwitterEngine

です。さらにフォークを探してみるとリストに対応した

penso's XAuthTwitterEngine at master - GitHub
http://github.com/penso/XAuthTwitterEngine

を発見しました。ところがファイルがすべて揃っていません。仕方がないので自分で作成しました。また statuses/home_timeline や retweeted_status も実装されていないようなので追加しました。私が個人的に利用するために作成したものなので status の id が文字列に変更されています。注意してください。それにしてもきれいなソースには驚かされました。大変勉強になります。

github の使い方がよく分からないので、はてなのファイルアップロード機能利用して機能を追加した XAuthTwitterEngine Zip ファイルをアップロードしておきます。下記リンクからダウンロードできます。ただし、下記リンクのファイル名をクリックするとダウンロードされたファイル名が変化しますので、横の矢印↓をクリックしてダウンロードしてください。

Yoshiaki-XAuthTwitterEngine.zip 直

Yoshiaki-XAuthTwitterEngine.zip
http://kyoshiaki.sakura.ne.jp/osx/Hatena/Yoshiaki-XAuthTwitterEngine.zip

簡単な説明は、Zipファイルに同封された ReadMe-j.rtf に記載しておきました。公開に問題があったら、取り消しするかもしれません。質問についてはコメントを利用してください。返事は遅くなるかもしれません。

最後に XAuthTwitterEngine を利用して作った自作 Twitter アプリ iYKTweetHD の実行画面を添付しておきます。



私的利用、自作 Twitter アプリ < iYKTwitter >

@iphone_dev_jp [ http://twitter.com/iphone_dev_jp ] 閲覧目的で、遅ればせながら Twitter @KYoshiaki [ http://twitter.com/KYoshiaki ] を始めてみました。とりあえず、次のアプリをダウンロードしてみました。

iPhone
カテゴリ/ソーシャルネットワーク
Twittelator Pro
\600
http://itunes.apple.com/jp/app/twittelator-pro/id288963578?mt=8
リスト対応
Tweetie 2
\350
http://itunes.apple.com/jp/app/tweetie-2/id333903271?mt=8
リスト対応
TwitBird Premium
¥230
http://itunes.apple.com/jp/app/twitbird-premium/id307876729?mt=8
リスト対応
Tweetery
\230
http://itunes.apple.com/jp/app/tweetery-twitter-made-easy/id334303843?mt=8
Twitterrific
無料
http://itunes.apple.com/jp/app/twitterrific/id284540316?mt=8
有料版もある
Echofon for Twiiter
無料
http://itunes.apple.com/jp/app/echofon-for-twitter/id286756410?mt=8
NatsuLion for iPhone
無料
http://itunes.apple.com/jp/app/natsulion-for-iphone/id289977677?mt=8
TweetDeck for iPhone
無料
http://itunes.apple.com/jp/app/tweetdeck-for-iphone/id318518757?mt=8

私自身、Twitter についてよく理解していません。時間的余裕もないので、発言もしていません。そのため、ホームとリストの閲覧が、私の Twitter の利用目的なっています。リストに対応した Twitter アプリを探すと、次の3つが対応していました。

Twittelator Pro
Tweetie 2
TwitBird Premium

一番使いやすかったのが Twittelator Pro でした。ただし、最新の発言が20個までしか読むことができません。1日に1,2回しか起動しない私には物足りません。

Twitter API Wiki / API Overview
http://apiwiki.twitter.com/API-Overview

それで Twitter API が REST を使用しているので、試しに自分専用の Twitter アプリを作ってみることにしました。私専用なので、リストとホームが見れるようにし、発言の仕組みは省くことにしました。

Twitter API Wiki / Twitter API Documentation
http://apiwiki.twitter.com/Twitter-API-Documentation

の statuses/home_timeline を確認しました。

Twitter API Wiki / Twitter REST API Method: statuses home_timeline
http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-statuses-home_timeline
http://api.twitter.com/1/statuses/home_timeline.format

format は、拙作 iYKRSS [ http://itunes.com/apps/iYKRSS ] のソースが再利用できるので xml を選びました。

また、Requires Authentication で OAuth は難しそうなので Basic Auth を利用することにしました。

Basic access authentication - Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/Basic_authentication
2010/11/14(Sun) 現在 Twitter の認証方式で Basic 認証 (Basic Auth) は、廃止になりました。OAuth 認証の簡易版 xAuth を利用した記事を [  id:KYoshiaki:20100919 ] で公開しています。

最初 Basic Auth は、

Uniform Resource Locators (URL)
http://www.ietf.org/rfc/rfc1738.txt?number=1738
3.1. Common Internet Scheme Syntax
//:@:/

で大丈夫なのかと思いましたが、非公開リストのデータの取得に失敗するので、MGTwitterEngine を参考にしました。MGTwitterEngine のソースは Terminal 上で

svn checkout http://svn.cocoasourcecode.com/MGTemplateEngine

を実行するすればダウンロードできます。

since_id で指定すれば、簡単に発言を遡ってダウンロードできるものと思っていたのですが、最新20個しかダウンロードしてくれません。

仕方のないので、パラメーター count を使って 最新の発言 200 個をダウンロードし、前回の最新発言 id 以降のデータを探し、追加するようにしました。結局、未読の発言を最大 200 個まで遡ることができるようになりました。

また、リストの取得には

Twitter API Wiki / Twitter REST API Method: GET lists
http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-GET-lists

を利用し、follow しているリストは GET list subscriptions

Twitter API Wiki / Twitter REST API Method: GET list subscriptions
http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-GET-list-subscriptions

で取得できるようです。

簡単にテキストから URL 抽出をしたかってので、

iPhoneアプリ正規表現を使う - 24/7 twenty-four seven
http://d.hatena.ne.jp/KishikawaKatsumi/20081031/1225463896

を参考に正規表現を利用しました。RegexKitLite を使用するには libicucore.dylib をリンクする必要があります。

一番簡単なリンク方法は Xcode でターゲット名を選択し、

‘メニュー/ファイル/情報を見る’ か Option キーを押したまま、’メニュー/ファイル/インスペクタを表示’ を選びます。

ターゲット “iYKTwitter” の情報というウインドウが表示されるはずです。

‘一般’ タブをクリックし、リンク済みライブラリの下の ‘+’ ボタンを押し、スクロールして libicucore.dylib を追加してください。

libicucore.dylib を Frameworks のフォルダに移動しておくと良いかもしれません。

何とか、動作できるようになりました。プロフィール画像や日付の表示には対応していませんが、私的に利用するには十分です。最後にスクリンキャプチャーを付けておきます。



 Mac OS X 10.6 Snow Leopard、Apple Special Event September 2009、QuickTime Player の新規画面収録

Mac OS X 10.6 Snow Leopard 発売、Apple Special Event September 2009 と大変慌ただしい時期でした。

まず、 Mac OS X 10.6 Snow Leopard から、Apple Store (Japan) で 2009/08/26(Wed) に Mac OS X 10.6 Snow Leopard シングルユーザーを予約しました。発売日 2009/08/28(Fri) に届きました。

インストールする前に、念のため iPhone SDK 3.0 (Leopard) を ‘/Developer’ フォルダにあるファイル ‘About Xcode and iPhone SDK.pdf’ を参考にアンインストールしました。

私の場合、ターミナル上で

sudo /Developer/Library/uninstall-devtools --mode=all

を実行しただけです。

Mac OS X 10.6 Snow Leopard ファミリーパックの一部の人で、メディア不良によりインストールに失敗する人もいたようですが、Mac OS X 10.6 Snow Leopard シングルユーザー版のインストールには成功しました。

最初の起動時に実行される ‘/System/Library/CoreServices/設定アシスタント.app’ が設定途中で終了してしまったのですが、実害がないので、そのままにしています。(MobileMe などの設定は、既に登録してあります。)

数日利用して問題がないので Time Machine で使用される Time Capsule のハードディスクを消去して作り直しました。

‘アプリケーション/ユーティリティ/AirMac ユーティリティ.app’ で Time Capsule を選択し、’手動設定’ ボタンを押し、ツールバーの ‘ディスク’ をクリック、’ディスク’ タブを選択、左中央にリスト表示されている ‘Time Capsule ディスク’ をクリックすると、右側に ‘アーカイブ…’ ‘消去… ボタン’ が現れるはずです。リスト ’Data’ をクリックすると右側の表示内容が変わるので、注意してください。後は ‘消去…’ ボタンを押すだけです。

Apple Special Event September 2009 で iPhone OS 3.1 が公開されたので

iPhone Dev Center - Apple Developer Connection
http://developer.apple.com/iphone/

から

iPhone SDK 3.1 with Xcode 3.2 (Snow Leopard)

をダウンロードしインストールしました。

iTunes を使って iPod touch の OS を 3.1.1 にアップデートし、拙作 iYKRSS をビルドして iPod touch に転送してみました。キーチェーンなども問題なく iYKRSS は正しく動作しているようでです。

最初、Xcode のオーガナイザで iPod touch の認識に失敗し、エラーが出たのですが、iPod touch の電源を切って再起動すれば認識されました。

また iTunes 9 の Genius Mixes などの設定に

iTunes 9 Tips and Tricks - Solve the Mysteries of the New iTunes | Mac|Life
http://www.maclife.com/article/howtos/itunes_9_tips_and_tricks_solve_mysteries_new_itunes

上記 URL を参考にしました。

Mac OS X 10.6 Snow Leopard をインストールした直後、サービスを利用しているフリーウェアのショートカットキーが無効になっていました。システム環境設定のキーボード、’キーボードショートカットキー’ タブを選び、左側のリストから ‘サービス’ を選択し、ショートカットキーを有効にしてください。利用している人がいるとは思えませんが、拙作 NSService [ http://kyoshiaki.sakura.ne.jp/osx/panther.html#nsse11 ] を Universal Binary でビルド [ id:KYoshiaki:20071209 ]し直している人は、テキスト/’Today dot’、’Today Slash’ が該当します。

Apple Special Event September 2009 について

Apple - QuickTime - Apple Special Event September 2009
http://events.apple.com.edgesuite.net/0909oijasdv/event/index.html?internal=ijalrmacu
Apple Keynotes (iTunes Podcasts)
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=275834665

ビデオ撮影、FMチューナー搭載の第5世代 iPod nanoiPod touch (late 2009) が発売されました。

私自身、iPod nano にはあまり興味がないので、iPod touch (late 2009) になるのですが、カメラ機能が搭載されなかったので、購入するのか悩みました。iPod touch 8GB はハードウェアに変更がないので、論外ですが、iPod touch 32GB、64GB は高速化されています。

結局 iPod touch 32GB を Apple Store (Japan) で注文してしまいました。その後、カメラ搭載の iPod touch が近々発売されるという、うわさもあるので失敗したかと思っています。下記 URL のようにジョブス氏が発言しているので、どこまでが本当かわかりませんが!

iPod touchにカメラがないのは「ゲーム機だから」(ジョブズ談)
http://japanese.engadget.com/2009/09/10/ipod-touch/

最後に ‘/アプリケーション/QuickTime Player.app’ のメニュー ‘ファイル/新規画面収録’ を利用して ‘iPhone シュミレータ’ 上の iYKRSS


iYKRSS
無料
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=321871985&mt=8

の実行画面を録画してものを付けておきます。

動画編集には iMovie を利用しました。QuickTime Player はデスクトップ全体しか録画できないので、iMovie の起動画面中央のマイク、i マーク間の格子(切り取り・回転)をクリックし、右上画面で画像を回転させ、切り取る範囲を選び、デスクトップ全体から iPhone シュミレータの画面を切り取りました。(実際は、表示エリアを指定してあるだけで、保存時に切り取られます。)

iYKRSS バ−ジョン 1.0.0 の米国のカスタマレビューにあった発言のように、 RSS フィードの未読判別が難しいので、インジケーターを付けてみました。意外と便利です。画像を添付しておきます。iTunes App Store の公開は、まだまだ先になりそうですが!

iYKRSS Q&A / Tips

iTunes StoreApp Store に拙作


iYKRSS
無料
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=321871985&mt=8

が公開されました。シンプルな RSS リーダーです。レーティングが高いのは URL を入力するアプリは レーティング 17+ が必要だからです。

個人的に利用していたものですが、折角なので公開してみました。無料です。ダウンロード数も少ないので、良かったらダウンロードしてください。

あらかじめサンプルとなる RSS フィード URL も含まれているので、RSS リーダーがどんなものか理解していない人でも楽しめると思います。最近、話題の芸能人ブログも男女別にリストに含まれています。宮川大輔さん、男性には出川哲朗さんのブログがおすすめです。

また 中川翔子さんの RSS フィード URL が変更になっているので、次回に修正したいと思います。何か問題となる箇所がありましたら、コメント欄にお願いします。

iPhone でアプリを利用している方なら、理解しやすい動作だと思います。若干、理解しにくい部分があるので補足しておきます。

■ とにかく、芸能人ブログを登録して、RSS フィードを読み込みたい。

Top 画面右下の ボタン をタップすると RSS フィード入力画面に移ります。右下の ‘URL’ ボタンを選択し、表示される RSS フィードのリストをスクロールして、登録したい芸能人の RSS フィードをタップしてください。すると、入力画面に変わり、URL、タイトルなどが入力されているはずです。左下の ボタンを押して RSS フィードを読み込んでください。

■ 内蔵ブラウザを表示する時に便利な動作。

通常、 ボタンを押すと内蔵ブラウザが表示されますが、赤枠部分のタイトルをタップしても内蔵ブラウザが表示されます。

ボタンの動作の違い。

ボタンをタップしない状態で、 ボタンをタップすると RSS フィールドのアイテムが読み込まれますが、その後、RSS フィード設定画面で設定した保存期間を過ぎたアイテムは削除されます。

ボタンをタップした状態で、 ボタンをタップすると RSS フィールドのすべてのアイテムを読み込みます。

RSS フィードで、配信されているすべてのアイテムを読み込みたい。とにかく、初期状態に戻したい。

Top 画面の ボタンをタップしてから、URL を直接入力か、’URL’ ボタンをタップして RSS フィードを選び、 ボタンをタップすると配信されている RSS フィードをすべて読み込みます。

一度 RSS フィードを登録した場合、Top 画面の右上 ボタンを選び、RSS フィードのタイトルをタップしてから、 ボタンを押すと配信されているすべてのアイテムが読み込まれます。

RSS フィードの設定画面

追加した RSS フィードごとに設定画面があります。Top 画面で RSS フィードのタイトルをタップし、次に表示された画面、右下のギアマークをタップすることで RSS フィードの設定画面を表示することができます。

すなわち、RSS フィードごとに違う設定、保存期間などを割り当てることができます。

■ 日付ソートで ‘なし’ を選んでも並び順が元に戻らない。

読み込み動作を行った後、ソートしないという意味で ‘なし’ を選択しても、並び順は元に戻りません。初期状態に戻した場合は、’■ RSS フィードで、配信されているすべてのアイテムを読み込みたい。とにかく、初期状態に戻したい’ を参照してください。

■ Description オン/オフ の意味がわからない。

Description をオフにすると RSS フィードのアイテムをタップした時に下のような画面を表示せず、すぐに内蔵ブラウザで表示します。RSS フィードに全文が掲載されていない時に便利です。

RSS フィードリストの ‘はてなアンテナ – あいふぉんてな’ をうまく利用したい。

RSS フィード設定画面で

リセット: 有効
Description 表示: オフ

に設定してください。これでリロードする度に、すべてのアイテムを削除してから、アイテムを読み込みます。

■ iYKRSS が起動しない。

残り電池残量が少ない場合、起動しない場合があります。充電してください。
ネットワークに問題がある可能性があります。Safari でウェブページを開くことができるか、確認してください。
また RSS フィードの数が多すぎて、メモリが足りない可能性があります。iYKRSS を再インストールしてください。