iPhone/iPad アプリに Dropbox からファイルの読み込みがしたくて、Dropbox API を使ってみました。SDK が用意されていてそれを使えば簡単にアプリに組み込むことが可能です。

アプリの登録

Dropbox に自分が作成するアプリを登録して API Key などを取得します。まず下記 URL よりアプリを登録します。
https://www.dropbox.com/developers/apps

登録が終わると登録したアプリ一覧の右に Options というリンクがあり、そこから開いたページの一番下の App keys というところに “Key” と “Secret” があります。これはあとで SDK の組み込みで使用します。

SDK の準備

Dropbox API は REST でリクエストを出しても使えます。しかし iOS 用の SDK が用意されているのでこれを使えば簡単に組み込めます。認証も OAuth ですが、そんなこともまったく気にせずにサクサク使えるので余程のことがない限りは SDK を使うことをオススメします。

SDK は下記 URL よりダウンロードできます。
https://www.dropbox.com/developers/releases

SDK を使う

SDK をダウンロードして解凍すると中にサンプルプロジェクトが入っています。簡単な使い方はこれを参考にすると分かりやすいと思います。SDK をプロジェクトに組み込むには DropboxSDK というフォルダごと自分のプロジェクトに入れます。

Dropbox SDK は Security.framework が必要なのでプロジェクトに追加しておきます。

SDK を使う

AppDelegate の application:didFinishLaunchingWithOptions: メソッドに以下を追加します。アプリを登録した際に発行された Key と Secret をここで使います。DropboxSDK.h を import するのをお忘れなく。

DBSession* dbSession =
  [[[DBSession alloc]
    initWithConsumerKey:@"YOUR CONSUMER KEY"
    consumerSecret:@"YOUR CONSUMER SECRET"]
    autorelease];
[DBSession setSharedSession:dbSession];

で、適当なボタンを作って、押すと以下のメソッドを実行するようにします。

- (IBAction) tapDropbox:(id)sender {
  DBLoginController* controller = [[DBLoginController new] autorelease];
  controller.delegate = self;
  [controller presentFromController:self];
}

- (void)loginControllerDidLogin:(DBLoginController*)controller {
  // ログイン成功
}

- (void)loginControllerDidCancel:(DBLoginController*)controller {
 // ログイン失敗
}

ビルド&実行してボタンをタップすると下図のように Dropbox のログイン画面が表示されます。

これで Dropbox にログインすることができます。ログイン成功、失敗はデリゲートメソッドがそれぞれ呼ばれます。ただし、この段階でログインできるアカウントはアプリを登録したユーザアカウントだけです。

ログイン後に一覧を表示する

OAuth で認証後は次の起動後は再度ログインする必要がありませんが、上記の方法ではログイン画面がそのたびに表示されてしまいます。そこで以下のように修正することにより、一度ログインすると次からはログイン画面をスキップできます。

- (IBAction) tapDropbox:(id)sender {
  if ([[DBSession sharedSession] isLinked]) {
    [self loginControllerDidLogin:nil];
  } else {
    DBLoginController* controller = [[DBLoginController new] autorelease];
    controller.delegate = self;
    [controller presentFromController:self];
  }
}

そしてログイン後に Dropbox 内のファイル一覧を取得する方法です。

まず、DBRestClient をインスタンス変数として登録しておきます。

DBRestClient* restClient;

次に restClient の getter メソッドを作成します。

- (DBRestClient*)restClient {
  if (!restClient) {
    restClient = [[DBRestClient alloc] initWithSession:[DBSession sharedSession]];
    restClient.delegate = self;
  }
  return restClient;
}

そして、ログイン後に以下のようにして一覧を取得したいパスを指定すれば DBMetadata というクラスで一覧が取得できます。

- (void)loginControllerDidLogin:(DBLoginController*)controller {
  [[self restClient] loadMetadata:@"/"];
}

次にDBRestClient のデリゲートメソッドを作成します。これで上記で指定したパスから読み込みが終わると restClient:loadedMetadata: メソッドが呼ばれます。

- (void)restClient:(DBRestClient*)client loadedMetadata:(DBMetadata*)metadata {
  // ロード完了
  for (DBMetadata* child in metadata.contents) {
    NSLog(@"%@", child.path);
    if (child.isDirectory) NSLog(@"directory");
  }
}
- (void)restClient:(DBRestClient*)client loadMetadataFailedWithError:(NSError*)error {
  // エラー発生
  NSLog(@"Error loading metadata: %@", error);
}

ファイルの書き込み

Dropbox にファイルを書き込むこともできます。
“hoge” というファイル名でルートディレクトリに (NSString*)filePath にあるファイルを書き込む場合は次のようになります。

[[self restClient] uploadFile:@"hoge" toPath:@"/" fromPath:filePath];

ディレクトリの作成

“foo” というディレクトリをルートディレクトリに作成する場合は以下のようになります。

[[self restClient] createFolder:@"/foo"];

注意事項

途中でも書いたように初期の状態ではアプリを登録したアカウントでしかログインはできません。どうすればだれでもログインできるようになるかというとアプリのステータスを “Production” にしないといけません。Production にするには Dropbox の審査を通さなければいけません。しかし、Dropbox の審査を通すにはアプリをアップルの審査に通すか、AdHoc で送るかしなければいけない。どうすればいいのだろうと困ったのですが、Dropbox の審査に iPhone アプリなのでアップルの審査後でないと審査してもらえない。だから Production にしてほしいんだけどとメールしたら、翌日には “Production にしたよ。でもアップルの審査通ってリリースされたら教えてね、こっちでも審査するから” っていうようなメールがきました。

ですので、アップルの審査を通す前に Production ステータスにしてもらい、テストアカウントを用意してアップルの審査に出してください。

実はこれをしなくて一回リジェクトされましたw

関連する投稿