2012年11月28日水曜日

Instagramへ画像をポストするモジュールを作ったよー


Titanium mobile "early" Advent Calender 28日目です。 

Titanium Mobileの最新事情に追いつけておらず、時代に取り残されていってる感が否めないのですが、相変わらずモジュールを書く機会だけはなんだかんだとありまして、最近書いたモジュールをご紹介したいと思います。

何を今更という感じなんですが、自分のアプリから画像とキャプションをInstagramへ渡してInstagramの投稿画面へ遷移するというモジュールです。

Androidであればインテントで済む話なんでしょうけど、iOSの場合はそうもいかずUIDocumentInteractionControllerを使ってモジュールを書いてあげる必要があります。

詳細については、下記URLを。
http://instagram.com/developer/iphone-hooks/


*使い方

モジュールには、isInstalledというプロパティとopenPhotoという関数しかありません。

isInstalledでInstagramがインストールされているか確認でき、openPhoto()で画像(blob)とキャプション(string)を渡してInstagramの投稿画面を開きます。



コードはこんな感じ。
var instagramUtil = require('jp.msmc.tiinstagramutil');
var window = Ti.UI.createWindow({});

var caption = Ti.UI.createTextField({
 top:50,
 width:240,
 height:40,
 hintText:'Enter caption here',
 borderStyle:Ti.UI.INPUT_BORDERSTYLE_ROUNDED,
});
window.add(caption);

var button = Ti.UI.createButton({
 title:'Open photo gallery',
 width:Ti.UI.SIZE,
 height:32
});
window.add(button);

button.addEventListener('click', function(e){
 Ti.Media.openPhotoGallery({
  allowEditing:true,
  mediaTypes:[Ti.Media.MEDIA_TYPE_PHOTO],
  success:function(e){
   if(instagramUtil.isInstalled){
    instagramUtil.openPhoto({
     media:e.media,
     caption:caption.value
    });
   } else {
    alert("Instagram is not installed!");
   }
  },
 });
});

window.open();
もちろん実機じゃないとInstagramがインストールされていないので確認できません。


*ソースファイル

https://github.com/atsusy/TiInstagramUtil

MIT Licenseです。
Instagramじゃなく、他のアプリと連携したい場合の参考にでもなれば。


*作るのにかかった時間とハマったポイント

約3時間です。

openPhoto()をメインスレッドで動かすのをすっかり忘れてて全く動かず、なんでだなんでだあーと悩んでました。(よくあること)

ENSURE_UI_THREAD_1_ARGというマクロを使えば簡単にメインスレッドで動かせますよ。


以上です!質問等あれば @atsusy まで!