Paradigm Shift Design

ISHITOYA Kentaro's blog.

ストレージサービスMinusのライブラリMinusConnectを作った

まぁ、人間追いつめられるととんでもない方向に飛んでいってしまうもので。


無料で容量10GBのオンラインストレージサービス「Minus」が便利*二十歳街道まっしぐらとかで紹介されていたMinusですが、なんとなくキャッチーっぽいのでtottepostに実装してみました。

せっかちな人向け

リポジトリkent013/MinusConnect · GitHub
全部実装してません。User情報、Folder/Flie一覧とFolder/File作るのだけサポートしてます。


とりあえず、何となく使えればいい人向け。
ただまぁ、tottepostには載っちゃってるんでそれくらいの実装はしてます。

はじめに

tottepostに載せるために、まずすること。SDKを探すことですね。
公式には…ない…と。
githubにも…あった!hechien/ObjectiveMinus · GitHub


ん、一年更新がない…MinusのAPIはどうも最近Version2になったようで、PythonRubyPHPC#に関しては公式のgitリポジトリでサポートされてるんだけど、iOS版がない…公式でiPhoneアプリ作ってるのに公開してないってことは、まぁ大人の事情かな。


で、まぁ、Minus.com API v2 Reference — Minus API 2.10 documentationを見るに、RESTでかつOAuth2.0ってことで、DropboxAPIとか簡単そうだったし、いけるだろってことで作りはじめました。

使い方

kent013/MinusConnect · GitHubからcloneしてください。

1, ソースをプロジェクトに追加

MinusConnectUtilディレクトリの中身を適当にプロジェクトの中に入れる。

2, ライブラリをプロジェクトに追加

MinusConnect/Libraries at master · kent013/MinusConnect · GitHubの中身を適当にプロジェクトの中に入れる。
(ASIHTTPClientとかヘビーすぎるので、そのうち変えます)

3,コードを書く

サンプルコードは、MainViewController.hMainViewController.mを見てください。


3.1, 宣言

#import "MinusConnect.h"
@interface MainViewController : UIViewController<MinusSessionDelegate, MinusRequestDelegate>{
    __strong MinusConnect *minus_;
}
@property (nonatomic, readonly) MinusConnect *minus; 
@end


3.2, 初期化

MinusConnectクラスを以下のように初期化する。MINUS_CLIENT_IDとMINUS_CLIENT_SECRETはMinusのコンタクトフォームで申請してください。メールでくれます。アナログです。Co-FounderのJohn Xieさんからメールがきます。

//create instance of MinusConnect
minus_ = [[MinusConnect alloc] 
              initWithClientId:MINUS_CLIENT_ID
              clientSecret:MINUS_CLIENT_SECRET 
              andDelegate:self];


3.3, ログイン

次のようにしてログインします。なんというかOAuth2.0の意味あんのかとか思っちゃいますが、ユーザー名とパスワードを生で渡します。EndpointはHTTPSなんで、まぁ...。使える権限のリストはScopesを見てください。

[minus_ loginWithUsername:MINUS_USERNAME 
                 password:MINUS_PASSWORD 
            andPermission:[NSArray arrayWithObjects:@"read_all", @"upload_new", nil]];

レスポンスはMinusSessionDelegateを実装すれば取得できます。基本通知です。


3.4, リクエスト送信

以下のような感じでリクエスト送れます。

[minus_ activeUserWithDelegate:self];
[minus_ userWithUserId:@"kent013" andDelegate:self];
    
[minus_ folderWithFolderId:@"bfTQDBcmP" andDelegate:self];
[minus_ foldersWithUsername:@"kent013" andDelegate:self];
[minus_ createFolderWithUsername:@"kent013" name:@"test" isPublic:NO andDelegate:self];

[minus_ filesWithFolderId:@"bfTQDBcmP" andDelegate:self];
[minus_ fileWithFileId:@"C4KkzgTMA2a9" andDelegate:self];
UIImage *image = [UIImage imageNamed:@"sample1.jpg"];
NSData *data = UIImageJPEGRepresentation(image, 1.0);
[minus_ createFileWithFolderId:@"bfTQDBcmP" 
                       caption:@"test image" 
                      filename:@"sample1-1.jpg" 
                          data:data 
               dataContentType:@"image/jpeg" 
                   andDelegate:self];


3.5, レスポンスの処理

MinusRequestDelegateを実装してください。request.tagsにkMinusRequestなんたらなNSStringが入っているので、それで処理分けしてくださいませ。

-(void)requestLoading:(MinusRequest *)request{
    NSLog(@"start request");
}
- (void)request:(MinusRequest *)request didReceiveResponse:(NSURLResponse *)response{
    NSLog(@"did received response");
}
- (void)request:(MinusRequest *)client 
              didSendBodyData:(NSInteger)bytesWritten 
            totalBytesWritten:(NSInteger)totalBytesWritten
    totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite{
        NSLog(@"progress:%f", (float)totalBytesWritten /
                              (float)totalBytesExpectedToWrite);
}
- (void)request:(MinusRequest *)request didFailWithError:(NSError *)error{
    NSLog(@"request failed with error:%@", error.description);
}
- (void)request:(MinusRequest *)request didLoad:(id)result{
    if([request.tag isEqualToString:kMinusRequestActiveUser]){
        NSLog(@"active! %@", result);
    }else{
        NSLog(@"did request loaded %@", result);
    }
}
- (void)request:(MinusRequest *)request didLoadRawResponse:(NSData *)data{
    NSLog(@"did request loaded(raw)");         
}


あとは、まぁ、適当実装なのでソースコード読んでください。

余談

サンプルプロジェクトをGumろうかとおもったけど、面倒いので止めましたw


機能が足りないな!実装ダセェな!っておもったらfolkお願いします。いや、むしろ別レポジトリで結構です...使いますから教えてください…