一、引子
一般在游戏进行对外测试的时候都会有一个玩家QQ群,方便玩家反馈问题、交流游戏心得等。那么为了增加玩家加QQ群的欲望,可能会在游戏里面设计一个小功能,点击一下可以直接拉起手Q加群的操作,加了QQ群以后,也会自动下发一些小奖励刺激玩家。原本我以为要拉起手Q加QQ群的操作一定要接入相关平台的SDK才行,直到我详细地阅读了下腾讯官网的QQ群官方主页,我才了解到在游戏内拉起手Q发起加群的操作是如此的简单,根本不需要接入任何第三方SDK,只需短短几行代码即可轻松实现。闲言少叙,书归正文,咱们马上就开始实际操作一下。
二、解决方案
1.Android端的工作
在腾讯官网的QQ群官方主页,我们可以直接看到官方已经为我们提供好了Android相关的代码,直接复制出来并集成到我们游戏项目对应的Android工程中就可以使用了。如果是使用Internal打包方式的话,可以在Eclispe编写Java的相关代码,然后打成jar包供Unity端调用。如果是使用Gradle方式的话,可以在项目导出AndroidStudio工程的过程中,自动化添加进这一段代码。关于使用Gradle方式进行非侵入式SDK接入打包,马三有在工作中有了一些新的心得体会,会在以后博客中讲解一下。(妈的这小子又挖坑,不会过段时间又太监了吧)
图1:QQ群官网Android端代码
在你的Java代码中添加以下代码即可,key不要写死在Java代码中,最好由Unity调用端传入:
1 /**************** 2 * 3 * 发起添加群流程。群号:ColaFramework交流群(421527940) 的 key 为: xxxxxxxxx 4 * 调用 joinQQGroup(xxxxxxxxx) 即可发起手Q客户端申请加群 ColaFramework交流群(421527940) 5 * 6 * @param key 由官网生成的key 7 * @return 返回true表示呼起手Q成功,返回fals表示呼起失败 8 ******************/ 9 public boolean joinQQGroup(String key) { 10 Intent intent = new Intent(); 11 intent.setData(Uri.parse("mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26k%3D" + key)); 12 // 此Flag可根据具体产品需要自定义,如设置,则在加群界面按返回,返回手Q主界面,不设置,按返回会返回到呼起产品界面 //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 13 try { 14 startActivity(intent); 15 return true; 16 } catch (Exception e) { 17 // 未安装手Q或安装的版本不支持 18 return false; 19 } 20 }
至此我们Android端所需要做的工作就完成了,是不是超级方便哈~几乎啥也没干,蛤蛤。
2.iOS端的工作
再来看看我们需要在iOS端做些什么?其实跟Android端的工作大同小异,主要还是提供一个接口给Unity端调用。在腾讯官网的QQ群官方主页,官方也同样为我们提供好了iOS相关的代码,不过这些代码要在Unity上使用的话,还需要小小地改造和封装一下。轻轻点亮一个赞,咱们下面马上就现场教学,教大家怎么处理一下:
图2:QQ群官网 iOS端代码
在Unity工程对应的iOS工程中的UnityAppController.mm中添加以下的代码就可以了。相较于Android,iOS上面还需要多传入一个uid参数。而且Unity端这边传过来的是const char *类型的字符串指针,我们需要将其转换成 NSString 以便供API调用。
1 extern "C" BOOL iOSJoinQQGroup(const char* rawKey,const char* rawUid){ 2 NSString * key = [NSString stringWithUTF8String:rawKey]; 3 NSString * uid = [NSString stringWithUTF8String:rawUid]; 4 NSString *urlStr = [NSString stringWithFormat:@"mqqapi://card/show_pslcard?src_type=internal&version=1&uin=%@&key=%@&card_type=group&source=external", uid,key]; 5 NSURL *url = [NSURL URLWithString:urlStr]; 6 if([[UIApplication sharedApplication] canOpenURL:url]){ 7 [[UIApplication sharedApplication] openURL:url]; 8 return YES; 9 } 10 else return NO; 11 }
至此,我们在iOS端需要做的工作也完成了,下一步就是在Unity中去调用这些接口了。
3.Unity端的工作
简单地搭建一个模拟游戏中加群的界面,有一个二维码和一键加群按钮,我们期待的是玩家在游戏里面点击按钮就可以直接加入QQ群。
图3:游戏界面示意图
对应的C#代码如下,就是一些简单的封装与Unity和Android、iOS端通信交互的基本操作,如果对这块不太了解的话,可以看马三之前的博客《【Unity游戏开发】SDK接入与集成——小白入门篇》。值得注意的是,我们需要处理好不同平台下调用的问题,加入必要的平台宏判断,在Unity编辑器下运行的这种情况也要考虑进去。
1 using System.Collections; 2 using System.Collections.Generic; 3 using System.Runtime.InteropServices; 4 using UnityEngine; 5 using UnityEngine.UI; 6 7 public class MyScript : MonoBehaviour 8 { 9 10 private static readonly string AndroidKey = "YouAndroidQQGroupKey"; 11 12 private static readonly string iOSUid = "YouiOSUid"; 13 private static readonly string iOSKey = "YouiOSQQGroupKey"; 14 15 private AndroidJavaClass _jc; 16 private AndroidJavaObject _jo; 17 18 // Use this for initialization 19 void Start() 20 { 21 _jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 22 _jo = _jc.GetStatic<AndroidJavaObject>("currentActivity"); 23 24 var btnObj = this.transform.Find("BtnQQ"); 25 var button = btnObj.GetComponent<Button>(); 26 button.onClick.AddListener(OnClick); 27 } 28 29 private void OnClick() 30 { 31 bool result = JoinQQGroup(); 32 if (result) 33 { 34 //TODO 你的业务逻辑 35 } 36 else 37 { 38 Debug.LogWarning("未安装手Q或者版本不支持!"); 39 } 40 } 41 42 /// <summary> 43 /// 加入QQ群的方法,有返回值,代表成功或者失败 44 /// </summary> 45 /// <returns></returns> 46 private bool JoinQQGroup() 47 { 48 #if !UNITY_EDITOR && UNITY_ANDROID 49 return CallAndroidMethod<bool>("joinQQGroup", AndroidKey); 50 #elif !UNITY_EIDTOR && UNITY_IOS 51 return iOSJoinQQGroup(iOSKey, iOSUid); 52 #else 53 return false; 54 #endif 55 } 56 57 /// <summary> 58 /// 调用一个带有返回值的原生Android方法 59 /// </summary> 60 /// <typeparam name="ReturnType"></typeparam> 61 /// <param name="method"></param> 62 /// <param name="args"></param> 63 /// <returns></returns> 64 private ReturnType CallAndroidMethod<ReturnType>(string method, params object[] args) 65 { 66 #if !UNITY_EDITOR && UNITY_ANDROID 67 return _jo.Call<ReturnType>(method, args); 68 #endif 69 return default(ReturnType); 70 } 71 72 //iOS方法导入 73 #if !UNITY_EDITOR && UNITY_IOS 74 [DllImport("__Internal")] 75 private static extern bool iOSJoinQQGroup(string key, string uid); 76 #endif 77 78 }
图4:在编辑器下调用的结果
Android和iOS的效果马三就不单独打包展示了,感兴趣的话,大家可以自己打包测试一下。
三、总结
在本篇博客中,马三和大家一起学习了如何实现在不接SDK的情况在手机上拉起手Q加群。在开发工作中,有些问题可能并没有我们想象中的那么复杂,进行功能开发之前多阅读一下官方文档、收集下相关资料,说不定就会有更加简单优雅的解决方案。
本篇博客中的项目代码已经同步至Github,欢迎Fork! https://github.com/XINCGer/Unity3DTraining/tree/master/SDK/PullUpQQGroupDemo
如果觉得本篇博客对您有帮助,可以扫码小小地鼓励下马三,马三会写出更多的好文章,支持微信和支付宝哟!
作者:马三小伙儿
出处:https://www.cnblogs.com/msxh/p/11243588.html
请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!