Dropbox

Dropbox APIが新しくなったというニュースを見かけて、とあるアプリケーションに使ってみようと重い腰を上げテストしてみました。

iOS v1.0にはドキュメントが用意されていません。SDKに添付されているサンプル・プロジェクトが動くことを確認した後はtutorialに従って基本的に動作確認です。ところがファイルをアップロードしようとしたらupLoadFileがdeprecatedであると言われてしまいました。

ChagelogやDBRestClient.hを読めば事情は把握できるので良しとしましょう。せっかくのtutorialなので最新のAPIに変更しておいて欲しいものです。

新しいupLoadFileは、

- (void)uploadFile:(NSString *)filename toPath:(NSString *)path withParentRev:(NSString *)parentRev
    fromPath:(NSString *)sourcePath;

という形式です。parentRevと言うパラメータが増えています。ここにnilを指定してアップロードすることも出来ます。その場合、同じファイル名がサーバー上に存在する場合上書きをせずファイル名の後に(1)などと付加されて新しいファイルとして保管されます。現行ファイルを上書きする場合はloadMetadataにて現在のファイルのrevを取得しなければなりません。

ものすごく単純なコード例を書いておきます。
前提としてdocDirはアプリのDocumentフォルダーを指し、そこにファイルtest.txtが存在するものとします。またTutorial通りの手順でrestClientは初期化されているものとします。

- (void)uploadFile1
{
    [[self restClient] loadMetadata:@"/test.txt"];
}

-(void)uploadFile2:(DBMetadata*)meta
{
    NSString *testfile = [docDir stringByAppendingPathComponent:@"test.txt"];
    [[self restClient] uploadFile:@"test.txt" toPath:@"/" withParentRev:meta.rev fromPath:testfile];
}

// DBRestCleintDelegte
- (void)restClient:(DBRestClient*)client loadedMetadata:(DBMetadata*)metadata
{
    [self uploadFile2:metadata];
}

- (void)restClient:(DBRestClient*)client loadMetadataFailedWithError:(NSError*)error
{
    [self uploadFile2:nil];
}

revは元々、古いバージョンのファイルをリストアしたりするためのものと思います。詳しくは考えていませんが(ぉぃ、とりあえず動いてはいるようです。

Trackback

5 comments untill now

  1. 記事を拝見させて頂きました。

    私も、最近Dropboxを利用したアプリを開発しようとしているのですが、上手くいかず困っています。

    よろしければ、最新のバージョンでのDropbox SDKを利用したアプリ開発の環境作りに関する記事を書いて頂けないでしょうか。

    よろしくお願いします。

  2. コザック @ 2012-05-15 07:20

    ゆうさま、
    最新のSDKをまだ触ってはいませんが、おそらく追加のAPIがあるだけで基本は変わっていないように思えます。
    環境設定についてはiOSではSDK Setupのページで問題なく設定できました。どこか具体的に問題点を教えていただければ何かお答え出来るかも知れません。

  3. コザック様、お返事ありがとうございます。
    その後、問題は解決し無事、Dropbox SDKを利用したアプリ開発の環境を整えることが出来ました。

    こちらの記事の内容に関して質問させてください。
    まず、前提としてdocDirはアプリのDocumentフォルダーを指すとのことですが、これは、NSString型の変数docDirにDocumentフォルダーのパスが入っているという認識でよろしいでしょうか。

    また、utorial通りの手順でrestClientは初期化されているというのは、以下の通りでよろしいでしょうか。

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

    よろしくお願い致します。

  4. コザック @ 2012-05-21 10:59

    ゆうさま、
    返事が遅れまして申し訳ないです。どちらも、その通りです。

  5. 分かりました、ありがとうございます!

Add your comment now