mixiアプリで、OWNERの永続化がまだサポートされてなかった・・・。
mixi アプリを作ろうと思って、色々苦心している。
とりあえず、HTML表示や、jsでアラート表示なんかはできようになった。
あと、友達一覧とかも出せた。
OWNERの情報を永続化したい・・。
OWNERが入力した情報を、訪れたマイミクに公開するようなものを作りたかった。
そのためには、OWNERの情報として永続化したかったのだが、それがなぜかできない・・。
VIEWERの情報として永続化保存&取得
保存
var request = opensocial.newDataRequest(); var data = "test"; request.add(request.newUpdatePersonAppDataRequest( opensocial.IdSpec.PersonId.VIEWER, "key", data)); request.send();
取得
var request = opensocial.newDataRequest(); request.add(request.newFetchPersonRequest( opensocial.IdSpec.PersonId.VIEWER), "viewer"); var param = {}; param[opensocial.IdSpec.Field.USER_ID] = opensocial.IdSpec.PersonId.VIEWER; var idSpec = opensocial.newIdSpec(param); request.add(request.newFetchPersonAppDataRequest(idSpec, "key"), "viewer_data"); request.send(function (response) { if (response.hadError()) { // エラー処理 alert("エラー"); return; } var viewer = response.get("viewer").getData(); var viewer_data = data[viewer.getId()]; alert(viewer_data["key"]); });
これはできる。
OWNERの情報として永続化保存&取得
保存
var request = opensocial.newDataRequest(); var data = "test"; request.add(request.newUpdatePersonAppDataRequest( opensocial.IdSpec.PersonId.OWNER, "key", data)); request.send();
取得
var request = opensocial.newDataRequest(); request.add(request.newFetchPersonRequest( opensocial.IdSpec.PersonId.OWNER), "owner"); var param = {}; param[opensocial.IdSpec.Field.USER_ID] = opensocial.IdSpec.PersonId.OWNER; var idSpec = opensocial.newIdSpec(param); request.add(request.newFetchPersonAppDataRequest(idSpec, "key"), "owner_data"); request.send(function (response) { if (response.hadError()) { // エラー処理 alert("エラー"); return; } var owner= response.get("owner").getData(); var owner_data = data[owner.getId()]; alert(owner_data["key"]); });
これがなぜかできない・・・。
なぜだ〜〜。と思って調べた。
サポートされてないらしい
参考にさせていただいたのは、
ウェブ開発の次なる主戦場、Open Social
とか
OpenSocial-Japan
とか。
OpenSocialでOwnner毎 or Owner*アプリ毎の永続化方法
ここ。
結論から言うと、OWNERの永続化はサポート外らしいです。
現在のOpenSocialにて考えられているPersistence APIでの権限モデルは、ソーシャルグラフを強く意識したものです。その結果として、Friend間での共有、そしてViewerに対してのみの書き込み、という仕様となっています。加えて、アプリケーション間での共有は、それこそ何の保護もなければ、わかりやすいセキュリティホールになりますので、現状では仕様に含まれていません。
もし上記の制限を超えた実装を行いたい場合は、お察しの通り、gadgets.io.makeRequest()による外部サーバとのやり取りを行う必要があります。残念ながら、現状のOpenSocialの仕様は、「余計なことを考えなくても、永続化された情報に関して一定の保護を受けることができる」という理解をすることになるでしょう。厳しい制限と捉えるか、その厳しさ故に安全であると捉えるか、といったところでしょうか。
う〜〜ん。他の方法を考えよう。