Google DocumentsにiPhoneアプリからアクセスしてみる

| 2 Comments | 0 TrackBacks
Google Documentsにあるドキュメントデータに、iPhoneアプリケーションからアクセスするには、Google Data APIs Objective-C Client Libraryを使用するのが便利であることを、これまでに説明してきました。

Google Data APIのObjective-Cクライアントを動かしてみる
iPhoneアプリケーションに、Google Data APIクライアントを組込む

前回までは、準備作業のみでしたが、今回は、具体的なプログラミングについて、見ていきたいと思います。とりあえず、ファーストステップとして、Google Documentsから、ドキュメントの一覧を取得する処理を例に説明します。

サービスオブジェクトの生成

このクライアントライブラリでは、すべてのリクエストのハンドリングを、「サービスオブジェクト」と呼ばれるオブジェクトを介して行います。まずは、そのオブジェクトを生成して、通信するための準備をする必要があります。
以下に、サービスオブジェクトを生成するためのコーディング例を示します。
/**
 * サービスオブジェクトを生成します。
 * @param username ユーザ名
 * @param password パスワード
 * @return サービスオブジェクト
 */
- (GDataServiceGoogleDocs *)docsServiceWithUserName:(NSString *)username password:(NSString *)password {
    
    // サービスオブジェクトの宣言
    // インスタンスは再利用できるよう、キャッシュしておきます。
    static GDataServiceGoogleDocs *service = nil;
    
    if (!service) {
        // 初回のみ、インスタンスを生成して、必要な初期設定を行います。
        service = [[GDataServiceGoogleDocs alloc] init];
        
        [service setUserAgent:@"MyCompany-SampleDocsApp-1.0"]; // 自分のアプリに固有な名称
        [service setShouldCacheDatedData:YES];
        [service setServiceShouldFollowNextLinks:YES];
    }
    
    if ([username length] && [password length]) {
      // ユーザ名/パスワードを設定します。
     [service setUserCredentialsWithUsername:username
                                       password:password];
    } else {
        [service setUserCredentialsWithUsername:nil
                                       password:nil];
    }
    
    return service;
}


ドキュメント一覧の取得

サービスオブジェクトを生成し、それを使ってドキュメント一覧フィードの取得リクエストを送信します。レスポンスの受信は非同期に処理されるため、アプリケーションでのハンドリングは、コールバックメソッドにて行います。

- (void)fetchDocList {
    
    // ユーザ名/パスワードを指定して、サービスオブジェクトを生成します。
    GDataServiceGoogleDocs *service = [self docsServiceWithUserName:@"foo@bar.com" password:@"foobarpassword"];
    
    // ドキュメントの一覧の、フィードを取得するためのURLを生成します。
    // GDataServiceGoogleDocs.hに、定数定義されています。
    NSURL *feedURL = [NSURL URLWithString:kGDataGoogleDocsDefaultPrivateFullFeed];
    
    // 一覧を取得するための条件を指定します。
    // デフォルトでは、25件ずつ分割して取得するところを、
    // 1000件まとめて取得するようにしています。
    GDataQueryDocs *query = [GDataQueryDocs documentQueryWithFeedURL:feedURL];
    [query setMaxResults:1000];
    [query setShouldShowFolders:YES];

    // フィードの取得要求を開始します。
    // didFinishSelectorで指定しているのが、レスポンスを処理するための
    // コールバックメソッドです。
    GDataServiceTicket *docListFetchTicket = [service fetchFeedWithQuery:query delegate:self didFinishSelector:@selector(docListFetchTicket:finishedWithFeed:error:)];

}

/**
 * フィード取得要求のレスポンスを処理するためのコールバックメソッド。
 * @param ticket サービスチケットオブジェクト(このサンプルでは使用しない)
 * @param feed レスポンスとして返されたフィード
 * @param error エラーオブジェクト
 */
- (void)docListFetchTicket:(GDataServiceTicket *)ticket
          finishedWithFeed:(GDataFeedDocList *)feed
                     error:(NSError *)error {
       
    if(error) {
        // エラーの場合、エラーオブジェクトが設定されている。
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[error localizedDescription] message:[[error userInfo] description] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
        [alertView show];
        [alertView release];
        
    }
    
    // エラーがなければ、受信したフィードオブジェクトを処理する。
    // この例では、オブジェクトの内容を文字列化して、TextViewに設定している。
    NSString *description = [feed description];
    NSArray *entries = [feed entries]; // 個々のエントリが格納されたNSArrayオブジェクト
    for (GDataEntryDocBase *doc in entries) {
        
        description = [description stringByAppendingFormat:@"\n----------\n%@", doc];

    }
    
    textView.text = description;
        
}

これで、Google Documentsに対する、最も基本的な操作である、ドキュメント一覧の取得ができるようになりました。実際のレスポンスデータはXMLですが、クライアントライブラリによって、GDataFeedDocListオブジェクトとして扱うことができるので、アプリ側ではかなり楽に処理することができます。
このように、便利なライブラリなのですが、ちょっと残念なのは、ここに含まれているクラス、メソッド、定数などの各要素について説明されているドキュメントが提供されていないことです。そのため、ソースコードを見るか、実際にやってみないとわからない部分があります。

次回は、実際のドキュメントデータのダウンロードについて、説明したいと思います。

No TrackBacks

TrackBack URL: http://www.fourmeisters.com/mt/mt-tb.cgi/327

2 Comments

とても丁寧な記述で読みやすく、要点を把握することができました。ありがとうございます。

Dustinさん、

コメントありがとうございます。
このあたりの記事は、Export for Google Documentsというアプリを作ったときに調べた内容をまとめたものですが、お役に立てたようで、うれしい限りです。
GData APIはちょっとクセがあって、意外とわかりにくい一面があると思ったので。。