なかじまの開発ブログ

アプリ開発における備忘録などなど。

MENU

DropBox Core APIを使おう【Objective-C】

データを同期するのに使えます!

アプリの登録

下記URLからサインインをしてください。
Dropbox - Sign in

『My Apps』の『Create app』から登録します。

1.Choose an API
 Dropbox APIを選択します。

2.Choose the type of accsess you need
 全てのアクセスを許可するならばFull Dropboxを選択します。
 アプリ固有のフォルダのみアクセスを許可するならばApp folderを選択します

3.Name your app
 アプリケーションの名前を入力します。(別に実際に使うアプリと名前をあわせる必要はないけど、わかりやすいほうがいい)

SDKの準備

下記URLの iOS 『Install SDK』からダウンロードしてください。
Dropbox - Core API

ダウンロード終了後、解凍してプロジェクトにドラッグしてください。

さらに『QuartzCore.framework』と『Security.framework』を追加してください。

f:id:s_nakajima:20160311173451p:plain

アプリの認証

『AppDelegate.m』

#import <DropboxSDK/DropboxSDK.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // DropBox初期設定 『Full Dropbox』を選択したならkDBRootDropbox 『App folder』を選択したならkDBRootAppFolder
  // App key と App secret は先ほど登録したアプリケーションから確認することができます。
  DBSession *session = [[DBSession alloc] initWithAppKey:@"App key" appSecret:@"App secret" root:kDBRootAppFolder];
  [DBSession setSharedSession:session];

  return YES;
}

// 認証完了
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url sourceApplication:(NSString *)source annotation:(id)annotation {
  if ([[DBSession sharedSession] handleOpenURL:url]) {
    if ([[DBSession sharedSession] isLinked]) {
      NSLog(@"認証成功");
    }
    return YES;
  }
  return NO;
}

プロジェクト→TAGETSのプロジェクト→info→URL Typesの『URL Schemes』に『db-登録したアプリケーションのApp key』を入力してください。
f:id:s_nakajima:20160311175932p:plain


『.m』
ボタンの押下処理などで

// DropBoxログイン画面を出す
if (![[DBSession sharedSession] isLinked]) {
  [[DBSession sharedSession] linkFromController:self];
}

押下処理などでログイン画面がでたらOKです。
f:id:s_nakajima:20160311180719p:plain


DBRestClientを準備

『ViewController.m』

#import <DropboxSDK/DropboxSDK.h>

@interface ViewController () <DBRestClientDelegate>
@property (nonatomic, strong) DBRestClient *restClient;
@end

- (void)viewDidLoad {
  // DBRestClientを準備
  self.restClient = [[DBRestClient alloc] initWithSession:[DBSession sharedSession]];
  self.restClient.delegate = self;
}

ファイル取得・一覧取得

// ファイル取得 ファイル名の前に / をつけて指定
[self.restClient loadMetadata:@"/test.txt"];

// ファイル一覧取得
[self.restClient loadMetadata:@"/"];
- (void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata {
  NSLog(@"取得成功");
  NSLog(@"ファイル名:%@", metadata.filename);
}

- (void)restClient:(DBRestClient *)client loadedMetadataFailedWithError:(NSError *)error {
  NSLog(@"取得失敗");
}

アップロード(新規・上書き)

// ファイル取得
[self.restClient loadMetadata:@"/test.txt"];
- (void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata {
  NSLog(@"指定ファイルが存在していたので、上書き"); 

  NSString *sendText = @"あいうえお";
  NSString *localDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
  NSString *localPath = [localDirectory stringByAppendingPathComponent:filename];
  [sendText writeToFile:localPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
  // 上書きアップロード
  [self.restClient uploadFile:metadata.filename toPath:@"/" withParentRev:metadata.rev fromPath:localPath];
}

- (void)restClient:(DBRestClient *)client loadedMetadataFailedWithError:(NSError *)error {
  NSLog(@"指定ファイルが存在しないので、新規");

  NSString *sendText = @"あいうえお";
  NSString *filename = @"test.txt";  // ファイル名(拡張子がtxtなので、テキストファイルをアップロードします)
  NSString *localDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
  NSString *localPath = [localDirectory stringByAppendingPathComponent:filename];
  [sendText writeToFile:localPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
  // 新規アップロード
  [self.restClient uploadFile:filename toPath:@"/" withParentRev:metadata.rev fromPath:localPath];
}

- (void)restClient:(DBRestClient *)client uploadedFile:(NSString *)destPath from:(NSString *)srcPath metadata:(DBMetadata *)metadata {
  NSLog(@"アップロード成功");
}

- (void)restClient:(DBRestClient *)client uploadedFileFailedWithError:(NSError *)error {
  NSLog(@"アップロード失敗");
}

ダウンロード

// ファイル取得
[self.restClient loadMetadata:@"/test.txt"];
- (void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata {
  NSLog(@"指定ファイルが存在していたので、ダウンロード"); 

  NSString *localDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
  NSString *localPath = [localDirectory stringByAppendingPathComponent:filename];
  // ダウンロード
  [self.restClient loadFile:metadata.path intoPath:localPath];
}

- (void)restClient:(DBRestClient *)client loadedMetadataFailedWithError:(NSError *)error {
  NSLog(@"指定ファイルが存在しません");
}

- (void)restClient:(DBRestClient *)client loadedFile:(NSString *)destPath contentType:(NSString *)contentType metadata:(DBMetadata *)metadata {
  NSLog(@"ダウンロード成功");

  // データを表示する
  NSError *error = nil;
  NSString *text = [NSString stringWithContentsOfFile:destPath encoding:NSUTF8StringEncoding error:&error];
  NSLog(@"%@", text);
}

- (void)restClient:(DBRestClient *)client loadedFileFailedWithError:(NSError *)error {
  NSLog(@"ダウンロード失敗");
}

ファイルの削除

// ファイル取得
[self.restClient loadMetadata:@"/test.txt"];
- (void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata {
  NSLog(@"指定ファイルが存在していたので、削除"); 

  // 削除
  [self.restClient deletePath:metadata.path];
}

- (void)restClient:(DBRestClient *)client loadedMetadataFailedWithError:(NSError *)error {
  NSLog(@"指定ファイルが存在しません");
}