写在前面
想一款免费的Unity中能使用的分享与登录为主要功能的插件, ShareSDK 并不是唯一选择,毕竟微信和QQ官方都是有提供IOS与Android端的接入相关资料的。
这篇文章中,我会介绍微信登录、分享 和QQ分享的接入方式
我为什么用
我想着如果单独去接入一套Android和IOS的Unity端代码,工时不少,以我的聪明才智我保证两周内无缝接入到Unity中,但是,我的时间并不是太丰富;
再加上ShareSDK还提供了:新浪、易信、支付宝、百度、FaceBook等等差不多十几个平台的支持,开发者的选择就更多了,话是这么说,但是这些平台对我的项目来说一点luan用都没有,甚至还影响了代码引用的纯洁性,搞不好最终包多出来的那十几M就是这里面的。
关于使用
1、后台的申请
QQ的申请:https://connect.qq.com —- 文档中心
微信的申请:https://open.weixin.qq.com — 文档中心
两个网站对开发者均有资质相关的认证,如果开发者在这一步遇到困难,可以联系你们的商务去申请,开发阶段我们可以使用ShareSDK Demo里面自带的进行开发调试工作。平台的技术支持还是很到位的,一般情况你后台注册留了QQ,那边平台就会主动来加上,拉QQ讨论组,技术支持,然后不懂的在组里问,如果有需要直接上嘴。
2、Unity的接入
ShareSDK官方Git地址请点击这一整段,在官方网址也可以找到下载,在官方的开发文档可以查询到接入的大致流程。
IOS:ShareSDKIOSAutoPackage文件夹的ShareSDKPostProcessBuild.cs这个文件中,配置Xcode工程的UrlScheme:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//URL Scheme 添加 string PlistAdd = @" <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>QQXXXXX</string> <string>wxXXXX</string> <string>tencentXXXX</string> </array> </dict> </array>"; |
- QQ+appID(注意:appID原本是10进制的,需要先转换16进制,网址:点击转换16进制),不足8位的前面补0。
- 微信appid
- tencent+appID
另外在你场景中的ShareSDK.cs里面设置微信和QQ的App的id和Secret,值得注意的是里面有个WeChatSeries,也得填上微信的,我X它大爷,我在上面吃过细节亏。加上朋友圈和收藏,这尼玛有4处地方要填一样的参数,F**k。QQ也同理
另外工程下的ShareSDKUnity3DBridge.m文件:把不要的都注了。
1 2 3 4 5 6 7 8 9 10 |
#define __SHARESDK_WECHAT__ #define __SHARESDK_QQ__ // #define __SHARESDK_SINA_WEIBO__ // #define __SHARESDK_RENREN__ //#define __SHARESDK_KAKAO__ // #define __SHARESDK_YIXIN__ // #define __SHARESDK_FACEBOOK_MSG__ //#define __SHARESDK_ALISOCIAL__ //#define __SHARESDK_DINGTALK__ //#define __SHARESDK_MEIPAI__ |
ManagePlatforms.cs这个文件选择启用的平台,它会影响到Xcode里面库引用。
Android:按照文档上的做就行。
打完包后,不需要在Xcode或者Android工程上做任务操作了,说明你就接好了。
3、回调
登录和分享什么的可以直接调,也会直接有回调函数。帖出一点ShareSDK.cs代码
1 2 3 4 5 6 7 8 9 |
//Share通知事件的定义 public delegate void EventHandler (int reqID, ResponseState state, PlatformType type, Hashtable data); //登录回调的方法 public EventHandler authHandler; //分享回调的方法 public EventHandler shareHandler; //登录方法 public int Authorize (PlatformType platform) //分享方法,分享方法有点多,请去看源码 |
登录回调的内容:ssdk 是我场景中引用的ShareSDK
1 2 3 4 5 6 7 8 9 |
void Start() { ssdk.authHandler = AuthResultHandler;} void AuthResultHandler(int reqID, ResponseState state, PlatformType type, Hashtable result) { if (state == ResponseState.Success) { Debug.Log("User---- authorize success !result:\n" + MiniJSON.jsonEncode(result)); } } |
打印的内容
User—- authorize success !result:
{“access_token”:”8_tzoJDezL1nlbsUP2y1TcT0okD5pMlM7NlGq83dbXQdkmsltgFmeYQpZNn_fyUQLES8qF3Iu7f7ArCiRXdz8IR6AvXYcZfNsEs4T-_X4Rixs”, “openid”:”ooc5r1j_h3pf9F_iQNZOGNUt7EL0″, “scope”:”snsapi_userinfo”, “refresh_token”:”8_bZTP7HgJ86UbrB6g7tpPn7EAWa4ku4Z9uGRkkVNj4_aNuYE66TqQ7y-RY4G7Plez7g5HK-i_yg4kRfc6JrKp9a7R6KptPM0opM_YPwEk5Yc”, “expires_in”:7200, “unionid”:”omobmw7E3Xn7LoxDhL3Gzybw17bs”}
我在获取用户唯一标识时遇到了困惑,这里openid和unionid在网上已经存有很多解释:知乎、博客、博客2、其它。等等,我在这里使用了2个微信appid来进行实验,上面是第1个,下面是第2个,见Log:
User—- authorize success !result:
{“access_token”:”8_a7wtJUUjIPRyBGTHu2R1l6B8Jvo1Vn0D_xIWcHPhIuqfuKnzjyqshBswAJx0eTmJBcobZvzJqgu2eJk-Pnyw6YQB7ZddZPYpjV8p30rl4Rs”, “openid”:”o3LILj8tT4pK9bQrwoGosYOnSZ_k”, “scope”:”snsapi_userinfo”, “refresh_token”:”8_-BfOmpnB1YBufMsJUcWTPb8sCvC7euwWQXUBVIQwb2s3WBILRdSFzkskMZAgqYLrIgoS-4bBG4b40d6-cihmNqhfZWb26trQTYbXmF4G4Ro”, “expires_in”:7200, “unionid”:”oHRAHuIIc8ft8T6WoQhOrTlU1ZkQ”}
发现openid和unionid都变了,完全没有参考价值,如果看了官文文档对两个参数的解释的话,会发现文档的矛盾之处,以下是我去摘录的(手动换行):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
获取用户个人信息(UnionID机制) 接口说明 此接口用于获取用户个人信息。开发者可通过OpenID来获取用户基本信息。 特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号, 可通过获取用户基本信息中的unionid来区分用户的唯一性, 因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号, 用户的unionid是唯一的。 换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。 请注意,在用户修改微信头像后,旧的微信头像URL将会失效,因此开发者应该自己在获取用户信息后, 将头像图片保存下来,避免微信头像URL失效后的异常情况。 请求说明 http请求方式: GET https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID 建议: 开发者最好保存unionID信息,以便以后在不同应用之间进行用户信息互通。 |
我使用了下面的这个网址去手动获取(同一个微信号),仍然得出了不同的unionid,我X它大爷。退而求其次的情况下,只要保证用户在当前这个应用授权的唯一标识也行,你MB我要求很简单了,我删了包在看看Log?或者明天再看看Log?哪个一样就用哪个呗。
次日更新—-:我决定使用unionid,别问我为什么。
N天后更新:使用unionId在两个不同的App上互通了。之前打的包不知道出了什么问题。
能发现回调并没有用户相关的信息,因为ShareSDK提供了单独的方法去获取用户的一系列信息,比如 sex 为性别,1是男性 headimgurl 是头像的地址 province 和 city 是城市 country 是国家等等。这里不一一列举。
QQ的我只使用到分享功能,大部分游戏或者应用,主流的都只接上了微信,为了不必要的工作量,我觉得只用微信的比较好。
4、其它问题
我在一次下载了Demo后,打IOS包时编译错误,说是易信的SDK没有引用到,提示中包含了BitEnable,结果把BitEnable设置成No就OK了。