这两天研究了一下ShareSDK,说实话挺好用的,但是还是有点坑的地方。那么雨松MOMO写下博文记录一下来我遇到的坑,嘿嘿。
大部分内容它的文档上已经说的很清楚了。
http://wiki.sharesdk.cn/Unity3D%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E6%8C%87%E5%8D%97
这里我直说文档上没说的部分。
分享图片的时候 它的例子写的是 网络图片。
content[“image”] = “http://img.baidu.com/img/image/zhenrenmeinv0207.jpg”;
但是实际游戏里一般的需求是 分享一张本地图片,或者分享一张截屏后的图片。
先说我遇到的坑,我把图片放在 StreamingAssets文件夹下面,写入下面的代码。
content[“image”] = Application.streamingAssetsPath+”/Share.png”;
打包在IOS上,分享微博,微信朋友圈都没问题。但是我在切换到android平台,这样的方法死活就会报错。理论上StreamingAssets 是一个应用程序只读的文件夹,技术上完全可以做到的,不知道为什么sharesdk做不到。后来我咨询了一个他们的技术。他给我的答案是:
既然原因知道了,那么就好办了,我需要在分享前把u3d里的图片拷贝到sdcard卡里面。
在Resources文件夹下放一个图片记住一定要PNG,在U3D里面把图片的格式修改成RGBA。
1 2 3 4 5 6 7 8 9 10 |
//读、写的路径 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()); } |
这样在分享图片的时候
1 2 3 4 5 6 7 8 |
//image的路径就可以直接写了。 string imagePath = Application.persistentDataPath + "/0.png"; if(System.IO.File.Exists(imagePath)) { content["image"] = imagePath; } |
这里再说一下,如果你想分享的是一张截屏图片,路径这样来写。
1 2 3 4 |
Application.CaptureScreenshot("screen.png"); content["image"] = Application.persistentDataPath + "/screen.png"; |
为了让安卓和iPhone的通用性,所以我只能把Resources一张需要分享的图片拷贝到Application.persistentDataPath 路径下面。
如下图所示, 微博 朋友圈都分享成功了,朋友圈的图我就不截了。
下面上完整代码 另外 appid和 appkey我都用了sharesdk自带的,最好自己申请一下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
using UnityEngine; using System.Collections; using cn.sharesdk.unity3d; using System; public class NewBehaviourScript : MonoBehaviour { void Awake () { ShareSDK.setCallbackObjectName("SDK"); ShareSDK.open ("api20"); //新浪微博 Hashtable sinaWeiboConf = new Hashtable(); sinaWeiboConf.Add("app_key", "568898243"); sinaWeiboConf.Add("app_secret", "38a4f8204cc784f81f9f0daaf31e02e3"); sinaWeiboConf.Add("redirect_uri", "http://www.sharesdk.cn"); ShareSDK.setPlatformConfig (PlatformType.SinaWeibo, sinaWeiboConf); //微信朋友圈 Hashtable weixinConf = new Hashtable(); weixinConf.Add("app_id", "wx4868b35061f87885"); ShareSDK.setPlatformConfig (PlatformType.WeChatTimeline, weixinConf); //拷贝图片 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()); } } void OnGUI() { //分享微信 if(GUILayout.Button("weixin",GUILayout.Width(100), GUILayout.Height(100))) { NewBehaviourScript.TryShareMessage(PlatformType.WeChatTimeline,"Unity3D接入shardSdk 看看能不能成功。",ShareResultHandler); } //分享微博 if(GUILayout.Button("weibo",GUILayout.Width(100), GUILayout.Height(100))) { NewBehaviourScript.TryShareMessage(PlatformType.SinaWeibo,"Unity3D接入shardSdk 看看能不能成功。",ShareResultHandler); } } void ShareResultHandler (ResponseState state, PlatformType type, Hashtable shareInfo, Hashtable error, bool end) { if (state == ResponseState.Success) { print ("分享成功"); print (MiniJSON.jsonEncode(shareInfo)); } else if (state == ResponseState.Fail) { print ("分享失败"); print ("fail! error code = " + error["error_code"] + "; error msg = " + error["error_msg"]); } else if (state == ResponseState.Cancel) { print ("cancel !"); } } public static void TryShareMessage(PlatformType type,string text,ShareResultEvent ShareResultHandler) { string imagePath = Application.persistentDataPath + "/0.png"; Hashtable content = new Hashtable(); content["content"] = text; if(System.IO.File.Exists(imagePath)) { content["image"] = imagePath; } content["title"] = "雨松MOMO程序研究院"; content["url"] = "http://xuanyusong.com"; content["type"] = Convert.ToString((int)ContentType.News); ShareResultEvent evt = new ShareResultEvent(ShareResultHandler); ShareSDK.shareContent (type, content, evt); } } |
最后我在上u3d工程的包 ,已经在IOS和Android上测试通过。
http://vdisk.weibo.com/s/qDm4IY-bo7eu
6月6日补充
这个例子前段时间做完了,因为我策划还没有确定完需求,所以一直没再项目上加这个东西。 今天加到我游戏里面才发现,真的是问题多多呀。。
主要是微信,安卓到没什么问题。
你必须要在ShareSDK上注册一个号 http://sharesdk.cn/ 然后创建你的游戏,分成安卓和IOS。
1 2 3 4 5 6 7 |
#if UNITY_IPHONE cn.sharesdk.unity3d.ShareSDK.open ("xxxxxx"); #else cn.sharesdk.unity3d.ShareSDK.open ("xxxxxx"); #endif |
xxxxxx就是你申请的ID,如果你不申请ID的话就只能用它的默认ID,即时你配了你自己申请的微信的APPID 那么还是会报错 :warning: 尚未配置微信URL Scheme:wx4868b35061f87885, 无法进行分享。 所以一定要在ShareSdk的官网上注册你自己的游戏。
还有就是我用微信分享,无论我点击分享或者点击取消分享。ShardSdk永远都给我返回一个 Cancel的状态,那么我就没办法获取用户是否分享成功的事件。。 我咨询了一下它们的客服。。他告诉我:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
打开AppController.mm文件,添加ShareSDK.h头文件: #import <ShareSDK/ShareSDK.h>新增handleOpenURL的处理方法,代码如下: - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [ShareSDK handleOpenURL:url wxDelegate:nil]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [ShareSDK handleOpenURL:url sourceApplication:sourceApplication annotation:annotation wxDelegate:nil]; } |
这样问题就来了,因为 AppController.mm文件 是Unity自动生成的,我不能随意修改因为他会打断我写的自动化批量打包工具。。
建议大家使用XUPorter 这样的话可以打完包以后自己用代码上面的代码写在AppController.mm里面。
- 本文固定链接: https://www.xuanyusong.com/archives/2620
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
之前不知道, 现在安卓的话, 图片不需要是png的了 jpg的也可以,我用的UGUI,把图片的read/write打开就可以了,不然调式的时候会有一个不可读的错误
松哥,好厉害,我喜欢~~~~~~~~~~~~~~~~~~~~
雨松~~~~最新的Unity 打包没有AppController.mm那些啊 能不能分享一些新版的ios与unity交互的教程。
松哥问个问题,为什么ShareSDK在OnGUI里面掉分享完成之后我自己的应用不会卡死,但是在我写的NGUI里去调用ShareSDK怎么就回卡死,就是分享完了以后返回我自己的应用的时候卡死了
hi,我用sharesdk做第三方登录,qq登录,返回的数据里面没有uid,请问是怎么取到这个uid呢
截屏的时候我截的有点大了。。然后项目就崩了,有没有什么图片优化的方法?我是用Texture2D去截屏的。
松哥!我们可以分享但是回调失败了。官网咨询的回复告诉我说要把wxapi那个微信包的名称改成package wxapi就能成功。可是我用的是unity 的demo直接下载下来不知道怎么改名字。另外我最后用eclipse改过名字了可是不知道那个jar要export到哪里。
松哥!我们可以分享但是回调失败了。官网咨询的回复告诉我说要把wxapi那个微信包的名称改成package+wxapi就能成功。可是我用的是unity 的demo直接下载下来不知道怎么改名字。另外我最后用eclipse改过名字了可是不知道那个jar要export到哪里。
松哥,我直接下你的工程,使用自己申请的app_key和app_secret,然后build过程中,提示说需要升级android sdk 到5.0版本(api level 21),这时候如果继续build,可以成功,安装到安卓机子(MX2)后,新浪微博可以分享成功,但是微信直接闪退,不知道这是什么原因?是不是一定要升级android sdk 到5.0版本(api level 21)呢?
shard sdk应该已经升级了。 我这个版本比较老了。。 新项目目前还没做到这块。到时候再看。
嗯,感谢,我试一下最新版的shard sdk·············
新版的怎么样?我的也是分享的时候分享界面闪退。
sharesdk打包的时候名字和图标都错了,这个你们怎么弄的呢?unity3d在Temp里面会自动生成AndroidManifest.xml。shareSDK里面自带的AndroidManifest.xml删掉了,打开应用却黑屏了QAQ~~
我自己试出来了,AndroidManifest.xml不能删掉,而是搜索下unity自动生成的AndroidManifest.xml把里面的节点复制到Android目录下的AndroidManifest.xml里面就成功了。
求助,我把unity工程导成xcode工程,参数都配置好了,但是导出到ipad上的时候GUI不能点击,是什么原因呢?
大神求助,我想把ShareSDK与Vuforia集成,应该怎么集成,AndroidManifest要怎么配置?
求同存异
本地图片只能是sdcard中的图片,人家这样设计很合情合理。用户随时截图难道图片保存于内存吗?你是写死了放在StreamingAssets,做实验就得根据实际情况,你的好多文章都是在偷懒
我没放在 StreamingAssets下面。我是把resources下的带分享的图拷贝到 Application.persistentDataPath 下面的。 后来我在项目里也没这么用了。 直接把要分享的图放到CDN上了。
我也遇到了这样的问题,微博的分享正常,可微信的点击之后只是黑屏闪一下,这是什么情况
同问,请问下你这个问题解决了吗?