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