Paradigm Shift Design

ISHITOYA Kentaro's blog.

写真アップロードサービスの抽象化レイヤーPhotoSubmitter

tottepostを実装するために、写真を色々なサービスにアップロードする必要がありました。
で、色々検索してみたのですが、適当な物が見つからず、自分で作りました。
似たような物は、iOSSocialとかがあります。


簡単に言うと

[PhotoSubmitterManager submitPhoto:photo];

ってやると、あらかじめ設定したサービスに写真がアップロードされるライブラリです。


また、
https://github.com/kent013/tottepost/raw/master/AppStore/screenshot4_en.png:image:w200:left
https://github.com/kent013/tottepost/raw/master/AppStore/screenshot5_en.png:image:w200


のような設定を

PhotoSubmitterSettingTableViewController *settingViewController_ = 
  [[PhotoSubmitterSettingTableViewController alloc] init];
settingViewController_.delegate = self;
settingNavigationController_ = 
  [[UINavigationController alloc] 
    initWithRootViewController:settingViewController_];
[self presentModalViewController:settingNavigationController_ animated:YES];

というコードだけで出す事ができます。認証もこの画面からできるので、サービスのON/OFFや認証などのコードはほとんど書く必要がありません。

PhotoSubmitterについて

ソースコードは、
kent013/PhotoSubmitter · GitHub
にあります。


サンプルコードは、

です。tottepostはPhotoSubmitterの全機能を使っています。またPhotoSubmitterExampleは最小限の機能だけ使っています。


上記、リポジトリのREADME.mdに細かいことは書いてありますが、

[[PhotoSubmitterManager submitterForType:@"facebook"] login];

とすると、渡されたTypeに応じたログイン画面が表示されます。すでにログインされている場合には何もおきません。現在のところサポートしているのはFacebook/Twitter/Flickr/Dropbox/Picasa/Evernote/Minus/Mixi/Fotolifeの9つです。

[[PhotoSubmitterManager submitterForType:@"dropbox"] login];
[[PhotoSubmitterManager submitterForType:@"evernote"] login];

として、必要なサービスをONにしていく事ができます。サービスをONにしたあと、

PhotoSubmitterImageEntity *photo = 
    [[PhotoSubmitterImageEntity alloc] initWithData:data]; 
[PhotoSubmitterManager submitPhoto:photo];

のようにすると、ONにしたサービス全部に写真がアップロードされます。


できればtottepostから独立させてサービスをプラグイン化できるようにしたいのですが、いまいちうまい実装が思い浮かばないです…