最近研究了一下ShareSDK,说实话挺好用的,不过也有人觉得挺坑的地方。下面具体总结一下这个如何用和该注意的地方。
很多游戏里有排行榜之类的分享啊之类的这个到底怎么做的呢?
第一步去 官网http://dashboard.mob.com去注册一下,点击头像进入后台,点分享传播的创建信息,获取自己的App Key和App Secret,下载sdk,这个sdk名是ShareSDK for Unity3d。
第二步 解压将里面的工程中的Unity3dDemo/Assets/Plugins目录拷贝到您的项目的Assets目录中。
第三步 挂接ShareSDK脚本。打开Plugins目录,将ShareSDK.cs脚本文件拖动到Main Camera对象中进行脚本挂接。
注意:如果ShareSDK.cs并非挂载在Main Camera对象或者Main Camera对象修改为其他名字时,需要调用ShareSDK. setCallbackObjectName设置回调对象名称。否则会导致需要回调的接口无法正常回调。
第四步 挂一个我们自己的测试脚本这里起名test.cs
脚本要求这些回调方法
//用户用户授权调用SDK中的authorize方法可进行用户授权回调方法
void AuthResultHandler(ResponseState state, PlatformType type, Hashtable error)
{
print(" =============== AuthResultHandler");
if (state == ResponseState.Success)
{
print("success !");
}
else if (state == ResponseState.Fail)
{
print("fail! error code = " + error["error_code"] + "; error msg = " + error["error_msg"]);
}
else if (state == ResponseState.Cancel)
{
print("cancel !");
}
}
//获取用户资料,调用SDK中的getUserInfo方法可获取授权用户信息的回调方法
void GetUserInfoResultHandler(ResponseState state, PlatformType type, Hashtable user, Hashtable error)
{
print(" =============== GetUserInfoResultHandler");
if (state == ResponseState.Success)
{
print("get user result :");
print(MiniJSON.jsonEncode(user));
}
else if (state == ResponseState.Fail)
{
print("fail! error code = " + error["error_code"] + "; error msg = " + error["error_msg"]);
}
else if (state == ResponseState.Cancel)
{
print("cancel !");
}
}
//将内容传入分享接口回调方法
/// <summary>
/// 处理分享结果
/// </summary>
/// <param name="state">结果的状态</param>
/// <param name="type">平台</param>
/// <param name="shareInfo">分享信息</param>
/// <param name="error">错误</param>
/// <param name="end">是否成功</param>
void ShareResultHandler(ResponseState state, PlatformType type, Hashtable shareInfo, Hashtable error, bool end)
{
print(" =============== ShareResultHandler");
if (state == ResponseState.Success)
{
print("share result :");
print(MiniJSON.jsonEncode(shareInfo));
}
else if (state == ResponseState.Fail)
{
print("fail! error code = " + error["error_code"] + "; error msg = " + error["error_msg"]);
}
else if (state == ResponseState.Cancel)
{
print("cancel !");
}
}
void GetFriendsResultHandler(ResponseState state, PlatformType type, ArrayList friends, Hashtable error)
{
print(" =============== GetFriendsResultHandler");
if (state == ResponseState.Success)
{
print("share result :");
print(MiniJSON.jsonEncode(friends));
}
else if (state == ResponseState.Fail)
{
print("fail! error code = " + error["error_code"] + "; error msg = " + error["error_msg"]);
}
else if (state == ResponseState.Cancel)
{
print("cancel !");
}
}
void GetTokenResultHandler(ResponseState state, PlatformType type, Hashtable credential, Hashtable error)
{
print(" =============== GetTokenResultHandler");
if (state == ResponseState.Success)
{
print("share result :");
print(MiniJSON.jsonEncode(credential));
}
else if (state == ResponseState.Fail)
{
print("fail! error code = " + error["error_code"] + "; error msg = " + error["error_msg"]);
}
else if (state == ResponseState.Cancel)
{
print("cancel !");
}
}
这些都完事后我们的代码才刚刚开始。
首先引入头文件
using System;
using System.Collections.Generic;
using cn.sharesdk.unity3d;
在Start()里进行一下初始化,这里我就以新浪微博为例:
//初始化SDK,设置回掉的游戏对象,这里写的是主相机,如果主相机改名了,请填写改名后的名字
ShareSDK.setCallbackObjectName("Main Camera");
ShareSDK.open("api20");
//初始化社交平台,这里的app_key和app_secret因为是测试所以就用官方发例子,这里就不去申请了
//iOS
//Sina Weibo
Hashtable sinaWeiboConf = new Hashtable();
sinaWeiboConf.Add("app_key", "3135616650");
sinaWeiboConf.Add("app_secret", "214976cdc97560b5571e9132bf6ae760");
sinaWeiboConf.Add("redirect_uri", "http://www.sharesdk.cn");
ShareSDK.setPlatformConfig(PlatformType.SinaWeibo, sinaWeiboConf);
这里的api20要换成在官网上注册的App Key,
设置调用方法
public void ShareWeibo() {
test.TryShareMessage(PlatformType.SinaWeibo,"Unity3D接入shardSdk 看看能不能成功。",ShareResultHandler);
}
//定义一个分享方法
public static void TryShareMessage(PlatformType type, string text, ShareResultEvent ShareResultHandler)
{
//string imagePath = Application.persistentDataPath + "/0.png";
Hashtable content = new Hashtable();
content["content"] = text;
Application.CaptureScreenshot("screen.png");//截屏
content["image"] = Application.persistentDataPath + "/screen.png";
content["title"] = "华辉测试";
content["url"] = "http://jinghuizhiye.com";
content["type"] = Convert.ToString((int)ContentType.News);
//用于获得结果的事件,不想获得,可以不写
ShareResultEvent evt = new ShareResultEvent(ShareResultHandler);
ShareSDK.shareContent(type, content, evt);
}
创建一个Button,将脚本挂上去。这样就可以分享了。。。
如果要是点分享分享到多个平台,代码就有例子里的
public void shareMenu() {
Hashtable content = new Hashtable();
content["content"] = "this is a test string.";
Application.CaptureScreenshot("screen.png");
content["image"] = Application.persistentDataPath + "/screen.png";
content["title"] = "test title";
content["description"] = "test description";
content["url"] = "http://www.mob.com";
content["type"] = Convert.ToString((int)ContentType.News);
content["siteUrl"] = "http://www.mob.com";
content["site"] = "ShareSDK";
content["musicUrl"] = "http://mp3.mwap8.com/destdir/Music/2009/20090601/ZuiXuanMinZuFeng20090601119.mp3";
//开启,调用客户端授权 (only in android)
content["disableSSOWhenAuthorize"] = true;
content["shareTheme"] = "classic";//ShareTheme has only two value which are skyblue and classic
ShareResultEvent evt = new ShareResultEvent(ShareResultHandler);
ShareSDK.showShareMenu(null, content, 100, 100, MenuArrowDirection.Up, evt);
}
这里会把Share的所有的能分享的平台都提供链接,如果有的平台不想要怎么办?
在工程的lib文件里对应的平台的jar包给删除就可以了。
这里也出现了很多问题:
问题一如下
这个问题我咨询了一下客服,客服的解释是:
一、新浪sso授权报错sso package or sign error
1、 新浪微博开放平台应用没有审核通过,不能用sso登陆,否则报错
关闭sso登陆
Platform platform = ShareSDK.getPlatform(this, SinaWeibo.NAME);
platform.SSOSetting(true);
2、审核过了,然后再打包签名apk,
确保apk的MD5码要跟新浪审核时,提交的MD5码一致,才能调用sso登陆; 也就是说在新浪微博上填写的包名和签名要与您工程的包名和实际签名要一致;
什么意思呢?怎么能够测试成功呢?
其实就是应用没有通过审核,客户端走不了。将客户端卸载了,这样客户端就不走了走浏览器,这样就可以分享到微博了。
所以要去各个平台审核,审核通过后将key和需要secret替换掉。
问题二,我上面的图片是截屏分享的,要是分享一张本地图片就会有问题。这里有博客也说到了。
咨询一下技术客服,得出的解释就是 本地图片只能是sdcard中的图片地址。
如何解决?
//读、写的路径
string imagePath = Application.persistentDataPath + "/0.png";
//如果文件不存在,把它拷贝进去。
if(!System.IO.File.Exists(imagePath))
{
Texture2D o = Resources.Load("0") as Texture2D;
System.IO.File.WriteAllBytes(imagePath, o.EncodeToPNG());
}
分享的代码
//image的路径就可以直接写了。
string imagePath = Application.persistentDataPath + "/0.png";
if(System.IO.File.Exists(imagePath))
{
content["image"] = imagePath;
}
在Resource文件夹下放一个图片一定要PNG,这里在unity3d里图片格式改成RGBA。我是用的是截屏
Application.CaptureScreenshot("screen.png");
content["image"] = Application.persistentDataPath + "/screen.png";
问题三:关于微信的问题
这里对于微信的问题具体的解决有个链接http://bbs.mob.com/thread-36-1-1.html?fromuid=23921,就不多提了,注意一下绕过审核的问题。
问题四:ios打包问题这里要麻烦一点,ios打包后要用Xcode打开引入依赖库,具体看一下这个http://wiki.mob.com/快速集成指南/
客观的说,这里虽然有一些问题,但是还是挺好用的。
文档参考http://wiki.mob.com/Unity3D快速集成指南/
http://www.xuanyusong.com/?p=2620&preview=true