在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平台就完成了。 剩下的,就努力的推广应用吧! :)