0

モバゲーオープンプラットフォーム開始

ついに始まりました。
モバゲーはmixi同様オープンソーシャルに参画してるので開発手法はmixiと非常に似たものになっています。
オープン初日にリリースされたゲームのほとんどがmixiで人気のあったアプリのモバゲー移植版でした。
3月には正式リリースということで今後が楽しみです。

mixiアプリモバイルはピコピコmixiと差し変わる形で登場したけど、モバゲーの場合既存ゲームにオープンプラットフォームのゲームが加わった形です。
ユーザーのことよく考えてるんが、サイトをみるとこの既存ゲームとオープンプラットフォームのゲームの境がユーザーからしたらほとんどわからいようになってます。
作り手のしては分けといてほしいと思うけど、確かにオープンプラットフォームのゲームをよりすぐって選びたいってのは非常にレアな話なんでこれは非常に素晴らしいこと。
確かに、M1F1層に「こちらのゲームはモバゲーオープンプラットフォームで動作するゲームですよ」とか言われても意味がわからないし、教える必要もないと思う。

どうでもいい事で、一つ気になったのが「モバゲーアプリ」とはいわないんですね。それどころか「アプリ」と呼ばない。「モバゲーオープンプラットフォームで動作するゲーム」という記述ばかりで「アプリ」とはどこにもなくモバゲーでは意識して使ってない感じ。
そういえばPC版では便利ツールや単純にページに貼り付けるだけのアプリはあるけどモバイル版はゲームしかない。
なるほどなーと思ったけどやっぱり短くて呼びやす呼称はほしいな。

0

mixiアプリモバイルのOAuth

mixiアプリモバイルのAPIへのアクセスはOAuth認証が必要です。
twitterやlastFM等が採用してるOAuthと少し違う2-legged OAuthというやつです。
簡単にいうとエンドユーザーによる承認のプロセスが省略されたバージョン。(たぶん)

ユーザー情報やマイミクの情報を取得したい場合はこの認証を突破して取得する必要があります。
以下phpのサンプルです。
require_once 'OAuth.php';
 
/**
* oAuthで認証後mixiAPIをたたく
*
* @param string $user ユーザー
* @param string $feed エンドポイント以降のURL
* @return object APIで取得したデータ 失敗時:false;
*/
function getMixiAPI($user, $option_feed)
{
define('CONFIG_API_ENDPOINT', 'http://api.mixi-platform.com/os/0.8');
 
$CONSUMER_KEY = 'xxxxxxxxxxxxxx';
$CONSUMER_SECRET = 'xxxxxxxxxxxxxxx';
$consumer = new OAuthConsumer($CONSUMER_KEY, $CONSUMER_SECRET, NULL);
 
$feed = CONFIG_API_ENDPOINT . $option_feed;
  // マイミク一覧取得の場合はここを変える
$params = array('xoauth_requestor_id' => $user, 'fields' => 'addresses,birthday,gender');
$request = OAuthRequest::from_consumer_and_token($consumer, NULL, 'GET', $feed, $params);
$request->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $consumer, NULL);
$url = $feed . '?' . implode_assoc('=', '&', $params);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FAILONERROR, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_ENCODING , "gzip");
 
$auth_header = $request->to_header();
if ($auth_header) {
curl_setopt($curl, CURLOPT_HTTPHEADER, array($auth_header));
}
 
$response = curl_exec($curl);
if (!$response) {
$response = curl_error($curl);
}
curl_close($curl);
 
$response = json_decode($response);
 
if (is_object($response)) {
return $response;
}
else {
return false;
}
}
 
function implode_assoc($inner_glue, $outer_glue, $array)
{
$output = array();
foreach($array as $key => $item) {
$output[] = $key . $inner_glue . urlencode($item);
}
return implode($outer_glue, $output);
}

$response = getMixiAPI($_REQUEST['opensocial_owner_id'], '/people/@me/@self');
利用には、OAuth.phpが必要です。
上記の例は単純にアクセスしたユーザーの情報を取得します。

mixiアプリは過度にAPIへのアクセスがあったり5秒以内にレスポンスを返せないことが多々あると
アプリ一覧から消されて新規ユーザーが取り込めない状態になります。
色々対策をとって負荷を軽減しレスポンスを速くすることに努めなければなりません。
APIのアクセスももちろんその対象です。
対策というほどでもないけど下記の3点くらいは守るべき。

1、必要な情報だけとる。
addresses,birthday,gender等は必要があれば取得する
$params = array('xoauth_requestor_id' => $user, 'fields' => 'addresses,birthday,gender');

2、圧縮して通信する。
curl_setopt($curl, CURLOPT_ENCODING , "gzip");

3、一度取得したら数時間はSAP側でキャッシュしておく。

0

mixiアプリのライフサイクルイベント

ライフサイクルイベント
ライフサイクルイベントは、OpenSocial 0.8.1 にて規定されている「コンテナ上で起こったアプリケーションに関する事象を、アプリケーションプロバイダに送信するための仕様」です。

mixiアプリでライフサイクルイベントが扱えるようになりました。
なんだか分かりにくい名前だけど、アプリのインストール、アンインストールがSAP(アプリ)側に通知されるようになりました。
今まではmixiアプリをインストール&アプリを使い出した時点で初めてSAP側はアプリユーザーとして認識してたのが、インストールした時点でアプリユーザーとして認識できるようになりました。
以前は、インストールしたものの一度もアプリを使ってないユーザーをmixi側ではアプリユーザーと認識してたけど、SAP側では認識してませんでした。
この差異がなくなることによってより正確なユーザー数を把握できます。

またアンインストール情報も通知されるのでSAP側で「退会」処理ができます。
今まで、アンインストールしてもSAP側に通知されなかったので一度インストールして使いだすと永遠にそのアプリのユーザーとしてSAP側は認識してました。アンインストールしたユーザーのデータもずっと持ち続ける状態。

一旦アンインストールして再度インストールしても以前のデータが残ってるという状況だったのもアンインストール情報の通知が開始されたことによって回避できるようになります。

mixiアプリネタがしばらく続きます。

0

mixiアプリで情報をjsonで永続的に保存する方法

opensocialのデータの保存方法は、Key-Valueペアの文字列情報になります。
非常に高速に単純明快で扱いやすいのですが、とたんに扱いにくくなりコードが冗長化しがちです。

mixiアプリはjavascriptなんでそんな時jsonで保存しとくとラクチンです。
幸いな事にopensocialにはjson化するメソッドが既に備わっています。
下記がarrと言う名前のJSONデータが作成を保存する方法です。

情報の永続化

var user_id = opensocial.IdSpec.PersonId.VIEWER;
 
var arr = {};
arr['title'] = "hoge";
arr['rank1'] = "rank1";
arr['rank2'] = "rank2";
arr['rank3'] = "rank3";
 
// エンコードしてjson化
var jsonvalue = gadgets.json.stringify(arr);
  
var req = opensocial.newDataRequest();
req.add(req.newUpdatePersonAppDataRequest(user_id, "jsonvalue", jsonvalue));

永続化された情報の取得

var user_id = opensocial.IdSpec.PersonId.VIEWER;
 
var req = opensocial.newDataRequest();
req.add(req.newFetchPersonRequest(user_id), "viewer");
var fields = [ "jsonvalue" ];
 
req.send(function(response) {
if (response.hadError()) {
alert(response.getErrorMessage());
} else {
var myId = response.get("viewer").getData().getId();
var data = response.get("viewer_data").getData();
 
var str = data[myId]["jsonvalue"];
str = gadgets.util.unescapeString(str);
var arr = gadgets.json.parse(str);
 
// hogeが出力される
alert(arr.title);
}
});

0

mixiアプリでのキャッシュの無効処理

無効処理と言う程でもないけど、mixiアプリはアプリ自体は自前のサーバーにアップします。
そのアプリをmixiから呼び出して実行する仕組みです。
毎回mixiから自前サーバーへの接続があるのも面倒な話なんで、アプリはmixiのキャッシュサーバーに取り込まれます。
これはこれでいいんだけど、開発時やデバッグ時にはかなり厄介です。
で、このキャッシュを除去するには、URLの後に下記のパラメーターを付与します。

&nocache=1

これで毎回修正を加えたアプリを取得しにいきます。

ただこれでもxmlの中に
<script type="text/javascript" src="http://hoge.com/mixiapp/opensocial-jquery.js"></script>
のように外部ファイルを読み込む記述があるとこれは引き続きキャッシュを読み込みます。

これを除去するのは、使い古されたやり方だけどURLの後ランダムな文字列(Math.random())を付与します。