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];リダイレクトURL のやつは、こんな感じにしとけば、
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
}
}
});
内容を取得して 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 件のコメント:
コメントを投稿