2010/09/02

Dropbox SDKを利用したiPhoneアプリケーションの作成

記事タイトルが前回とあまり変わらないですが、今回ではDropbox SDKを用いたiPhoneサンプルアプリケーションの作成の手順と、Dropboxからメタデータを取得してテーブル(UITableView)で表示する方法を紹介します。なお、Xcode、iOS SDK、Dropbox SDKは導入済みであるとします。また、Dropbox for Developersでアプリケーションのディベロッパキーを取得済みであるとします。お持ちでない方はDropbox SDK for iOSサンプルアプリケーションのコンパイルの記事を参考にしてディベロッパキーを取得してください。

2012.05.21 追記 この記事は内容が古くなっていますので、次の記事も参照してください。

プロジェクトの新規作成と設定の変更

プロジェクトを新規作成します。テンプレートは[Navigation-based Application]を選択し、プロジェクト名はMyDropboxSampleとします。

DropboxSDKを追加するために、プロジェクトのルートを右クリックして、[Add]→[Existing Files...]を選択。

DropboxSDKのあるディレクトリを指定して[Add]をクリック。

そのまま[Add]をクリック。DropboxSDKのREADMEによると、[Copy items into destination group's folder]をチェックすべきだとありますが、個人的にはどちらでも構わないと思います(Dropbox SDKのバージョンが変更して、互換性がなくなるような場合もありますのでコピーするのが無難ではありますが)。

追加したDropboxSDKのフォルダの中にドットファイルが3つあり、それがあるとコンパイルに失敗するので、これらのファイルへの参照を削除します。この3ファイルを選択してDeleteキーを押します。

[Delete Reference]をクリック。

続いて[Framework]フォルダにSecurity.frameworkを追加するために、右クリックして[Add]→[Existing Frameworks…]を選択。

Security.frameworkを選択して[Add]をクリック。

これでビルドできるようになるはずです。

ログイン機能の追加

DropEditorAppDelegate.mのapplication:didFinishLaunchingWithOptions:にコードを追加して、Dropboxのセッションを作成します。KeyとSecretには取得したディベロッパキーを用いてください。また、#import "DropboxSDK.h"を追加しておきましょう。

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      // Override point for customization after application launch.
+     DBSession* dbSession = [[[DBSession alloc]
+           initWithConsumerKey:@"アプリケーションのKey"
+           consumerSecret:@"アプリケーションのSecret"]
+           autorelease];
+     [DBSession setSharedSession:dbSession];
      // Add the navigation controller's view to the window and display.
      [window addSubview:navigationController.view];
      [window makeKeyAndVisible];
      return YES;
  }

起動時にログインコントローラが起動できるようにします。そのためには、コメントアウトしてあるviewDidAppear:animatedのコメントを外して次のように修正します。

  - (void)viewDidAppear:(BOOL)animated {
+     [super viewDidAppear:animated];
+     if (![[DBSession sharedSession] isLinked]) {
+         DBLoginController* controller = [[DBLoginController new] autorelease];
+         [controller presentFromController:self];
+     }
  }

コンパイルして実行したら、ログインができるようになるはずです。1回ログインに成功すればそれ以降はログイン操作が不要になります。また、[Cancel]をクリックしても何回もダイアログが表示されるようになります。ただし、ログインしても空のテーブルしか表示されません。

RESTクライアントの準備

DBRestClientを利用してテーブルにファイルの一覧を表示できるようにします。RootViewController.hを次のように修正して、RootViewController内でRESTクライアントが利用できるようにします。

@interface RootViewController : UITableViewController {
     DBRestClient* restClient;
}

RootViewController.mに次のメソッドを追加します。

- (DBRestClient*)restClient {
    if (!restClient) {
        restClient = [[DBRestClient alloc] initWithSession:[DBSession sharedSession]];
        restClient.delegate = self;
    }
    return restClient;
}
- (void)restClient:(DBRestClient*)client loadedMetadata:(DBMetadata*)metadata {
    NSLog(@"Loaded metadata!");
}
- (void)restClient:(DBRestClient*)client metadataUnchangedAtPath:(NSString*)path {
    NSLog(@"Metadata unchanged!");
}
- (void)restClient:(DBRestClient*)client loadMetadataFailedWithError:(NSError*)error {
    NSLog(@"Error loading metadata: %@", error);
}

メソッドviewDidAppear:animatedの末尾に次のステートメントを追加します。

[[self restClient] loadMetadata:@"/"];

この時点でシミュレータを実行すれば、Dropboxログインをした後にDebugger Console上に次のように表示されるはずです。

Dropboxでのファイル一覧取得

Dropboxのファイル一覧のための配列を作成します。RootViewController.mの@implementation RootViewControllerの直後に次のコードを追加します。

NSMutableArray *filesArray;

viewDidLoadのコメントアウトを外して、末尾に配列初期化用コードを追加します。

filesArray = [[NSMutableArray alloc] init];

先ほど追加したメソッドrestClient:loadedMetadata:に次のコードを追加します。これでfilesArrayにDropbox内のルートにあるファイルやディレクトリの一覧を文字列で取得できるようになります。

  - (void)restClient:(DBRestClient*)client loadedMetadata:(DBMetadata*)metadata {
      NSLog(@"Loaded metadata!");
+     NSArray* contents = metadata.contents;
+     for (NSInteger i = 0; i < contents.count; ++i) {
+         DBMetadata* data = [contents objectAtIndex: i];
+         BOOL isdir = data.isDirectory;
+         NSString* text = [NSString stringWithFormat:@"%@%@\n", isdir? @"D ": @"  ", data.path];
+         [filesArray addObject:text];
+     }
  }

ファイル一覧の表示

配列の内容をテーブルに表示させるようにします。tableView:numberOfRowsInSection:を次のように修正します。

  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
-     return 0;
+     return [filesArray count];
  }
そして、tableView:cellForRowAtIndexPath:を次のように修正します。
      // Configure the cell.
+     cell.textLabel.text = [filesArray objectAtIndex:indexPath.row];
      return cell;
  }

最後にrestClient:loadedMetadata:の末尾に次のコードを追加します。

[self.tableView reloadData];    
これで実行すればファイル一覧が取得できているはずです。先頭にDがついているのがディレクトリです。

おまけ

終了処理用のコードを追加するのを忘れないようにしましょう。

  - (void)dealloc {
+     [filesArray dealloc];
      [super dealloc];
  }

警告を抑えるには、@implementation RootViewControllerの直前に次のコードを追加する必要があります。

@interface RootViewController () 
@property (nonatomic, readonly) DBRestClient* restClient;
@end

メタデータ取得時にエラーが発生したら、DBRestClientDelegate#restClient:loadMetadataFailedWithError:が呼ばれます。エラーコードはHTTPに従っているのでわかりやすいでしょう。例えば、File Not Foundなら404を返します。

if (error.code == 404) {
    NSLog(@"file not found %@", [error.userInfo objectForKey:@"path"]);
}

まとめ

Dropbox SDKを用いたiPhoneアプリケーションの作成の手順を紹介しました。実際に使用できるようにするには、ディレクトリをドリルダウンできるようにしなければならないでしょう。また、エラー処理も適切に行う必要があります。

関連項目

2 件のコメント:

  1. こんにちは。
    このサイトで勉強を行い、アプリを開発を行おうとしているのですが、バージョンの違いのせいか、所々上手くいきません。
    申し訳ないのですが、最新のバージョンでの解説をお願いできないでしょうか。
    よろしくお願いします。

    返信削除
  2. コメントありがとうございます。
    最新版ではないですが、新しめのバージョンの記事がありますのでまずこちらを参照していただけると幸いです。
    http://safx-dev.blogspot.jp/2011/12/xcode42dropbox-sdk-v1.html

    返信削除

注: コメントを投稿できるのは、このブログのメンバーだけです。