2011年12月18日日曜日

Titanium で Facebook連携

Titanium Mobileで作る! iPhone/Androidアプリ 第21回 Facebookとの連携
http://gihyo.jp/dev/serial/01/titanium/0021

大体は、ここに載っているとおりに書いて大丈夫なんだけど…
動かしてみるとエラーになる。

[Titanium Mobile]Facebook と連携するとエラー
http://d.hatena.ne.jp/oreflow/20110517/1305636612

ここにあるように、tiapp.xml を書き換えなきゃならないらしい。
というわけで、書き換えてみる。

んで、適当に技評さんの記事を基にログインしてみるが、

I/Database(  318): sqlite returned: error code = 14, msg = cannot open file at source line 25467

というエラーが発生して動かず。
ログイン関連の情報をSQLiteに保存しようとしてエラーが出ているのかな?
エミュレータだから出ているのかもしれないけど、
あとあと面倒くさそうなので、
自分でFacebook用にOAuth認証をこさえる。

こさえると言えても、以前にJSで動かすものは作っていたので、それを使えば良いだけの話である。
まぁ、SSLを超えられなかったりするから、当時は俺以外の人間に使わせられなかったのだけど、
アプリの中に埋め込むとなると、色々と制約も取れるので、良い感じ。

すげー長いしキモイけど、ザザザっと書いた。


var cid         = [your client id];
var aSec        = [your app secret];
var redirectUrl = [your redirect url]
var authUrl = "";
    authUrl += "http://www.facebook.com/dialog/oauth";
    authUrl += "?client_id=" + cid;
    authUrl += "&redirect_uri=" + redirectUrl;
    authUrl += "&scope=publish_stream";
var faceWin  = Ti.UI.createWindow({title:"faceBook認証"});
var faceView = Ti.UI.createWebView({url:authUrl,scalesPageToFit: true,touchEnabled: true});
faceWin.add(faceView);
faceWin.open({animated:true,fullscreen:true});
var loads = 0;
var cnt = 0;
var inc = 1;
faceView.addEventListener('load',function(e){
    loads++;
    if(loads==cnt){
        var t = setInterval(function(loads){if(loads==cnt + inc){clearInterval(t);return;}},100);
    }else if (loads==cnt + inc) {
        var pincode = faceView.evalJS('window.document.body.innerHTML');
        pincode     = pincode.replace(/\s|\r\n|\r|\n|\t/gi,"").replace(/.*.<code>|<\/code>.*./gi,"").replace(/\s|\r\n|\r|\n|\t/gi,"");
        if (pincode != "") {
            // my attempt at making sure the stupid webview dies
            faceView.stopLoading();
            faceWin.remove(faceView);
            var tknUrl  = "";
                tknUrl += "https://graph.facebook.com/oauth/access_token?";
                tknUrl += "client_id=" + cid + "&redirect_uri=" + redirectUrl + "&";
                tknUrl += "client_secret=" + aSec + "&code=" + pincode;
            var XHR = Ti.Network.createHTTPClient();
            XHR.onload = function() {
                var res  = XHR.responseText;
                var aTkn = res.replace("acccess_token=",""); // <- こいつを保存
            };
            XHR.onerror = function(e) {
                faceWin.close(); // <- 取得失敗
            }
            XHR.open("GET", tknUrl);
            XHR.send();
            setTimeout(function(){faceWin.close();},3000);
            return true; // we are done here
        }
    }
});
リダイレクトURL のやつは、こんな感じにしとけば、
内容を取得して PIN(じゃなくて、CODEか) を取得できます。
このまま使えば OAuth1.0 と兼用できますよ。
(PHP です。色々ザックリだけど、許して…)
<?php
    $rtkn = $_GET["oauth_token"];
    $pin  = (isset($_GET["oauth_verifier"])) ? $_GET["oauth_verifier"] : "";
    $pin  = (isset($_GET["code"])) ? $_GET["code"] : "";
?>
<!DOCTYPE html>
<html lang='ja'>
    <head>
        <meta charset='UTF-8'>
        <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;">
        <style>
        </style>
    </head>
    <body>
        PIN CODE ...<br>
        <code><?php print($pin); ?></code>
        このウィンドウは自動的に閉じられます。
    </body>
</html>

0 件のコメント:

コメントを投稿