这两天研究了一下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
//读、写的路径
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
//image的路径就可以直接写了。
string imagePath = Application.persistentDataPath + "/0.png";
if(System.IO.File.Exists(imagePath))
{
     content["image"] = imagePath;
}

 这里再说一下,如果你想分享的是一张截屏图片,路径这样来写。

1
2
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
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
#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
打开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里面。

【转载】Unity3D研究院之IOS&Andoird使用Sharesdk遇到的坑的更多相关文章

  1. 【转载】Unity3D研究院之IOS触摸屏手势控制镜头旋转与缩放

    前几篇文章介绍了很多Unity3D引擎自身的一些问题, 今天我们在回到IOS设备上讨论一些触摸屏幕手势,本章的目标是通过触摸iPhone屏幕手势 实现模型左右的旋转,与模型的缩放. 大家想一想模型的旋 ...

  2. 【转载】Unity3D研究院之IOS自定义游戏摇杆与飞机平滑的移动

    移动开发游戏中使用到的触摸游戏摇杆在iPhone上是非常普遍的,毕竟是全触摸屏手机,今天MOMO 通过一个小例子和大家讨论Unity3D 中如何自定义一个漂亮的全触摸游戏摇杆.        值得高兴 ...

  3. Unity3D研究院之IOS全自动打包生成ipa

    接着上一篇文章, 自动生成framework,这篇文章我把shell自动化打包ipa整理了一下,希望大家喜欢,嘿嘿.. 建议大家先看一下上一篇文章.http://www.xuanyusong.com/ ...

  4. (转)Unity3D研究院之IOS&Android收集Log文件

    转自:http://www.xuanyusong.com/archives/2477 有段时间没有写过文章了,不知道大伙儿还记得雨松MOMO吗? 嘿嘿. 开发项目的时候尤其在处理与服务器交互这块,如果 ...

  5. Unity3D研究院之IOS本地消息通知LocalNotification的使用(六十七)

    http://www.xuanyusong.com/archives/2632    现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力.这种东西没必要服务器去推送 ...

  6. Unity3D研究院之IOS Android支持中文与本地文件的读取写

       前几天有个朋友问我为什么在IOS平台中可以正常的读写文件可是在Android平台中就无法正常的读写.当时因为在上班所以我没时间来帮他解决,晚上回家后我就拿起安卓手机真机调试很快就定位问题所在,原 ...

  7. Unity3D研究院之IOS全自动编辑framework、plist、oc代码

    Unity打IOS时会先生成一个Xcode工程,如果你需要增加一些第三方的framework那么需要手动一条一条的添加,这太烦了..而且可能你还需要修改Plist文件,甚至还可能要修改unity自动生 ...

  8. Unity3D研究院之IOS本地消息通知LocalNotification的使用

    原地址:http://www.xuanyusong.com/archives/2632   现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力.这种东西没必要服务器 ...

  9. Unity3D研究院之IOS&Android收集Log文件(六十二)

    开发项目的时候尤其在处理与服务器交互这块,如果服务端程序看不到客户端请求的Log信息,那么无法修改BUG.在Windows上Unity会自动讲Log文件写入本地,但是在IOS和Android上确没有这 ...

随机推荐

  1. 简单的Nodejs模块

    说千遍,道万遍,不如动手做一遍,我们实现一个node所谓的模块 看下上面的图,了解一下模块自始至终的一个流程,首先是创建模块,也就是一个入口的js文件,里面加了一些特定的功能,然后导出这个模块, ex ...

  2. PHP精度问题

    PHP 为任意精度数学计算提供了二进制计算器(Binary Calculator),它支持任意大小和精度的数字,以字符串形式描述 bcadd — 加法bccomp — 比较bcdiv — 相除bcmo ...

  3. jQuery UI datepicker z-index默认为1 怎么处理

    最近在维护一个后台系统的时候遇到这样的一个坑:后台系统中日期控件使用的是jQuery UI datepicker. 这个控件生成的日期选择框的z-index = 1.问题来了.页面上有不少z-inde ...

  4. File类,递归

    File类 File文件和目录路径名的抽象表示形式.即,Java中把文件或者目录(文件夹)都封装成File对象. File类包含     路径    path E:\...     目录 direct ...

  5. 控制元素的div属性

    1.需求分析 改变元素的宽.高.颜色.显示.重置等属性. 2.技术分析 基础的css.html.js 3.详细分析 如图,单击按钮,改变元素属性: 3.1 HTML部分 根据视图不难发现,内容分两大不 ...

  6. angular2中一种换肤实现方案

    思路:整体思路是准备多套不同主题的css样式.在anguar项目启动时,首先加载的index.html中先引入一套默认的样式.当我们页面有动作时再切换css.  可以通过url传参触发,也可以通过bu ...

  7. LeetCode297. Serialize and Deserialize Binary Tree

    题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来实 ...

  8. Delphi 编写DLL动态链接库文件的知识

    一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...

  9. Oracle字符集的查看查询和Oracle字符集的设置修改(转载)

    本文主要讨论以下几个部分:如何查看查询oracle字符集. 修改设置字符集以及常见的Oracle UTF8字符集和Oracle exp 字符集问题. 一.什么是Oracle字符集 Oracle字符集是 ...

  10. cordforce 495 补题 <未完>

    题目链接: http://codeforces.com/contest/1004/my A. Sonya and Hotels 分类讨论 看第一个样例解释的时候没看到后面第二行还有一个19,想了半天为 ...