ラベル Opensocial の投稿を表示しています。 すべての投稿を表示
ラベル Opensocial の投稿を表示しています。 すべての投稿を表示

2010年1月27日水曜日

OSDE がJavaScript をキャッシュしてくれる件について

OSDE で開発中に、外部 JavaScript をがっちりキャッシュしてくれてにっちもさっちも行かない状態に悩まされてました。色々なサイトを見て回りながら試してみたんだけど、どれもうまく行かない。そもそも昨日まではキャッシュが効いているようには思えなかったのにな。

あれやこれやと悩んでたら、JavaScript へのパスをURLで指定すると直った。

//

そもそも相対パスで書くことが間違いっぽい。mixiのよくある質問では、URLで書いてねとあった。相対パスで動いてたから気づかんかったです。

何にせよ良かった。

参考サイト
Content Rewriter Feature (0.9)
OSDEにおけるjavascriptファイルのキャッシュが強すぎる件

PC向けmixiアプリ課金がスタートしたそうです

PC向けの、mixi アプリ課金APIが公開されたようです。モバイル版はすでに存在していましたが、利用条件を読む限り、その延長上としてPC向けの課金APIが登場したという感じでしょうか。

利用条件

課金APIの利用に関しては、以下の条件があります。

モバイル版
  • mixiアプリモバイルにカテゴリ掲載されてから14日間以上経過し、かつ安定稼働しているアプリ
PC版
  • mixiアプリモバイルを公開しており、モバイルで既にmixiアプリペイメントプログラムを利用していること
  • 上記アプリのPC版で、mixiアプリPCにカテゴリ掲載されてから14日以上経過し、かつ安定稼動していること

ですので、PC版でアプリ課金APIを利用するにあたって、以下のようなことが考えられます。

サービス開始とともに利用出来るものではない
PC版とモバイル版を同時に公開したとしても、モバイル版アプリ課金を利用するまで14日、PC版アプリ課金を利用するまで14日の、系28日以上の待ち時間が必要になる(でいいのかな?並行して行えるんだろうか)。
モバイル版とPC版に課金機能が必要
モバイル版では、PC版のアプリのログを見るだけなど、機能制限をしている場合、モバイル版にアプリ課金に関する機能を追加する必要がある。

mixiアプリ課金を利用する新規サービスを考える際は、この辺りを気にしつつ開発ボリュームを考える必要がありそうです。

利用できるポイントの制限

また、一度に利用できるポイントが300ポイントから10ポイントと制限されており(100ポイント = 105円)、500円クジや、それ以上の高額課金は行えないようです。また、10%を決済手数料として差し引かれ、その金額の20%をシステム利用料として差し引かれます(71.5%くらい)。

実装方法

課金APIは OpenSocial Virtual Currency API という仕様に準拠して行われ、ガジェット向けの JavaScript API が策定されています。mixi ではさらに、安全性のための独自拡張がされているようです。

もう少しゆるい条件で利用できればいいのにな...。他のSNSもそういう感じなのかな。

参考サイト
PC向けmixiアプリ課金APIが登場しています
mixiペイメントプログラムのご案内
opensocial-virtual-currency

2009年12月22日火曜日

opensocial-actionscript-client を試してみた

mixiアプリ用に、いい感じにユーザ情報を取得してくれるAPIはないものかと探しまわって、opensocial-actionscript-clientというライブラリが見つかったので、試してみました。とはいえ、まだまだ頻繁に更新が入っていて、実用に耐える代物になるのかはよく分からないので、ほんとに試してみただけ。

ライブラリは、Google Code のページDownloads にありますが、12月18日(金)の時には、一部ファイルの中身が空っぽだったりと、不完全なものだったので、直接 Source から、SVNでダウンロードしました。


ファイルを取得できたら、src/org/ 以下を適切な場所に移動してあげてください。

JsWrapperClient クラスが、Externalinterface でもってJSとのやり取りをするんだと思います。このクラスを初期化して準備が完了するまで、利用することができない様子。

package {
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.text.TextField;
    
    import org.opensocial.client.base.Person;
    import org.opensocial.client.core.Feature;
    import org.opensocial.client.core.OpenSocialClientEvent;
    import org.opensocial.client.features.AsyncDataRequest;
    import org.opensocial.client.features.PeopleRequestOptions;
    import org.opensocial.client.features.ResponseItemEvent;
    import org.opensocial.client.jswrapper.JsWrapperClient;
    
    [SWF(width=210, height=130, backgroundColor=0xaaaaaa, frameRate=30)]
    
    public class Main extends Sprite
    {
        
        private var _client:JsWrapperClient;
        
        public function Main()
        {
            // ラッパークライアントの初期化とスタート
            // 完了してからリクエスト処理へ
            _client = new JsWrapperClient('opensocial.flash');
            _client.addEventListener(OpenSocialClientEvent.CLIENT_READY, 
                function(e:OpenSocialClientEvent):void {
                    _client.removeEventListener(OpenSocialClientEvent.CLIENT_READY, arguments.callee); 
                    request();
                }
            );
            _client.start();
        }
        
        private function request():void 
        {
            // リクエストオプションインスタンスを作成する
            var options:PeopleRequestOptions = new PeopleRequestOptions()
                                                    .setUserId('@me')
                                                    .setGroupId('@self');
            
            // 非同期データリクエストインスタンスを作成する
            var req:AsyncDataRequest = new AsyncDataRequest(Feature.PEOPLE_GET, options);
            
            // 完了時のイベントリスナーを追加する
            req.addEventListener(ResponseItemEvent.COMPLETE, 
                function(e:ResponseItemEvent):void {
                    req.removeEventListener(ResponseItemEvent.COMPLETE, arguments.callee);
                    
                    // 結果表示用
                    var loader:Loader = new Loader();
                    loader.x = loader.y = 5;
                    addChild(loader);
                    
                    var tf:TextField = new TextField();
                    tf.width = tf.height = 90;
                    tf.x = 100; tf.y = 10;
                    addChild(tf);
                    
                    // 取得したデータを取り出す
                    var person:Person = e.response.getData();
                    
                    // ニックネームを取得
                    var displayName:String = person.getDisplayName();
                    tf.appendText(displayName + "\n");
                    
                    // サムネイル画像を取得
                    try {
                        var urlRec:URLRequest = new URLRequest(person.getThumbnailUrl());
                        loader.load(urlRec);
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, 
                            function(event:Event):void {
                                trace('load complete');
                            }
                        );
                    } catch (e:Error) {
                        throw Error('load error');
                    }
                    
                }
            );
            
            // 呼び出しを行う
            req.send(_client);
        }
        
    }
}


本当に単純に表示だけ。

必要な機能があるかどうかは、Docs とにらめっこしないといけないです。そもそもどういう機能が必要なんだろう...。