在opensocial 规范的平台,一个xml文件就是一个应用,所以,如果你想要发布一个opensocial的应用,首先,你得编写好你的xml(the gadget spec xml),下面是一个简单的范例:
   <Module>
   <ModulePrefs title="Your gadget name"
         description="xxxx"
         height="200"
    screenshot="http://xxxx/x.jpg"
    thumbnail="http://xxxx/x.jpg"
        author="your name or developer name"
         author_email="your email or developer email">
      <Require feature="dynamic-height"/>
      <Require feature="opensocial-0.8" />
      <Optional feature="content-rewrite">
       <Param name="expires">86400</Param>
       <Param name="include-url">.*</Param>
       <Param name="exclude-url"></Param>      
       <Param name="minify-css">true</Param>
       <Param name="minify-js">true</Param>
       <Param name="minify-html">true</Param>
      </Optional>    
    </ModulePrefs>
      <Content type="html" view="canvas">
    <![CDATA[
        //your code
    ]]>
      </Content>
      <Content type="html" view="profile">
    <![CDATA[
        //your code
    ]]>
      </Content>
      </Module>
下面来解释一下上面的代码, <ModulePrefs>...</ModulePrefs>,这里面指定了应用的特征。比如应用的名字,应用的描述等,有些特征并不是必须的,比如,你可以只要title,其他的都不要,那么其他的默认就是空的,当然,并不是所有的opensocial平台都一样,具体的情况因平台而异。
<Require>和<Optional>,他们用来声明应用要依赖的特征,比如<Require feature="opensocial-0.8" />,这句就表示,你要用到的是opensocial 0.8的标准,那么你使用的接口规范就应该是在0.8的规范之下运行,而且这个是必须的,同时<Require>和<Optional>必须的在<ModulePrefs>的节点之下。上面的代码里,我写了个<Optional feature="content-rewrite">,这个特征是非常的有用,你想,如果你能因他而大量的减少对你服务器静态资源的请求,你说它好吗? 想详细的了解它,请看这个文旦http://wiki.opensocial.org/index.php?title=Content_Rewriter_Feature
接下来,就是<Content>急节点,<Content>里面有5个属性可以设置,type,view,href,prefferred_height,prefferred_width,他们分别用来设置内容的类型(可以设置成html或者url,默认为html),内容显示的地方,你可以设置canvas,profile,home。这个很可能会用到,比如说你想让<content>下的内容在profile里面显示,那么就的得设置type="profile",同理,如果你想在canvas里面显示,你就的设置成canvas.有的朋友可能对下面的<![CDATA[ ...  ]]>不明白,其实很简单, 这句就是用来告诉解析xml的工具,不要解析<![CDATA[ ...  ]]>里面的东西,所以,你可以在里面写任何的js代码或者html代码,当平台读取你的xml后,这里面的代码就会以网页的形式显示在你设定好的地方(profile或者canvas或者home)。同样,你可以为不同的view显示不同的内容,很简单,为其他的view再写一个content.  
到此,一个正确的gadget就创建好了。
但是,如果你没有在content里面写任何内容,那么在添加上你的应用后,你的显示页面就是一个空白。
既然是用来做平台接入的,那总要从平台取一点信息吧。ok.下面就简单介绍以下如果从平台获取用户的信息。
先看代码:
<Content type="html" view="canvas">
<![CDATA[
    function getOwner() {
      var req = opensocial.newDataRequest();
      req.add(req.newFetchPersonRequest("OWNER"), "get_owner");
      req.send(function (data) {
        if(data.hadError()) {
            output(data.getErrorMessage()});    
        } else {
            person = data.get("get_owner").getData();
            //var uid = person.getId();
            //var name = person.getDisplayName();
            return person;
        }
      }
    }
    function getViewFriends() {
        var req = opensocial.newDataRequest();
        var idSpec = opensocial.newIdSpec({'userId' : 'VIEWER', 'groupId' : 'FRIENDS'});
        var params = {};
        
        var index = 0;  //如果你想一次取75个,但却有76个好友,那么,你可以取两此,第一次设定index=0,第二次设定为75.这个主要是为了在一些一次不能取得全部好友的平台使用。
        var max = 75;  //每次最多取多少个
        params[opensocial.DataRequest.PeopleRequestFields.FIRST] = index;
        params[opensocial.DataRequest.PeopleRequestFields.MAX] = max;
        req.add(req.newFetchPeopleRequest(idSpec, params), 'viewerFriends');
        req.send(function(data){
            if(data.hadError()) {
                output(data.getErrorMessage());
            }else {
                window.friends_list = new Array();    // storage all of viewer friends' info
                var friends_info = new Array();
                data.get('viewerFriends').getData().each(function(person) {
                    friends_info[0] = person.getId();
                    friends_info[1] = person.getDisplayName();
                    friends_info[2] = person.getField('profileUrl');
                    friends_info[3] = person.getField(opensocial.Person.Field.THUMBNAIL_URL);
                    window.friends_list.push(friends_info);
                })
            }
        }
    }
]]
</Content>
上面的两个例子很简单。这里注意,output这个函数是opensocial的sandbox里面实现的一个方法,所以,如果你不是在sandbox里面运行上面的代码的话,请注释调。 另外介绍另外一个sandbox里面经常要用的方法cls(),它的作用就是清除你用output输出来的内容。
接下来介绍对推广应用非常有用的三个功能,activities和message和invite friends看代码:
//send message
function sendEmail(title, body) {
  var params = [];
  params[opensocial.Message.Field.TITLE] = title;
  params[opensocial.Message.Field.TYPE] =
      opensocial.Message.Type.EMAIL;

 

  var message = opensocial.newMessage(body, params);
  var recipient = "VIEWER";
  opensocial.requestSendMessage(recipient, message, callback);
};

function callback(data) {
  if (data.hadError()) {
    alert("There was a problem:" + data.getErrorCode());
  } else {
    output("Ok");
  }
};

sendEmail("This is a test email", "How are you doing?");
//send activities
function onActivityPosted(data) {
  if (data.hadError()) {
    alert("There was a problem: " + data.getErrorMessage());
  } else {
    output("The activity was posted successfully.");
  }
};

function postActivity(title, body) {
  var data = {};
  data[opensocial.Activity.Field.TITLE] = title;
  data[opensocial.Activity.Field.BODY] = body;
  var activity = opensocial.newActivity(data);
  opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH, onActivityPosted);
};

postActivity("This is a sample activity", "This is an activity body");

//invite friends
opensocial.requestShareApp('USER_FRIENDS');   //注意,有的平台可能并不支持这个方法。
有了他们,你就可以让你的应用病毒式的传播起来了。
好了,看到这里,如果你想为你的应用接入到opensocial平台上来,相应应该很容易了吧。
最后再介绍一个使用的东西, 因为所有的xml都会被平台缓存24个小时,也就是说,你在修改了xml里面的内容后,可能不会马上生效,这是你就需要手动的清除平台对xml缓存。那么怎么做呢?
不同的平台,清除缓存的方法不一样。下面列举几个平台清除缓存的方法
1.Orkut.  
如果您的应用的地址是http://xxxxx/xxx/xxx, 那么你只需要输入http://xxxxx/xxx/xxx&bpc=1.之后,你的修改就生效了
2.netlog
如果您的应用的地址是http://xxxxx/xxx/xxx, 那么你只需要输入http://xxxxx/xxx/xxx/flushXML=1.之后,你的修改就生效了
其他的平台,有的可能是http://xxxxx/xxx/xxx&nocache=1.  如果还是不对的话,最好找找他们的开发文旦,一般都有的。

 

OK.在完成以后的步骤后,基本上把一个social game接入到opensocial平台就完成了。  剩下的,就努力的推广应用吧!  :)

posted on 2010-04-02 21:47  Junw_china  阅读(993)  评论(0编辑  收藏  举报