【Unity游戏开发】不接SDK也能在游戏内拉起加QQ群操做?

1、引子

  通常在游戏进行对外测试的时候都会有一个玩家QQ群,方便玩家反馈问题、交流游戏心得等。那么为了增长玩家加QQ群的欲望,可能会在游戏里面设计一个小功能,点击一下能够直接拉起手Q加群的操做,加了QQ群之后,也会自动下发一些小奖励刺激玩家。本来我觉得要拉起手Q加QQ群的操做必定要接入相关平台的SDK才行,直到我详细地阅读了下腾讯官网的QQ群官方主页,我才了解到在游戏内拉起手Q发起加群的操做是如此的简单,根本不须要接入任何第三方SDK,只需短短几行代码便可轻松实现。闲言少叙,书归正文,我们立刻就开始实际操做一下。html

2、解决方案

1.Android端的工做

  在腾讯官网的QQ群官方主页,咱们能够直接看到官方已经为咱们提供好了Android相关的代码,直接复制出来并集成到咱们游戏项目对应的Android工程中就可使用了。若是是使用Internal打包方式的话,能够在Eclispe编写Java的相关代码,而后打成jar包供Unity端调用。若是是使用Gradle方式的话,能够在项目导出AndroidStudio工程的过程当中,自动化添加进这一段代码。关于使用Gradle方式进行非侵入式SDK接入打包,马三有在工做中有了一些新的心得体会,会在之后博客中讲解一下。(妈的这小子又挖坑,不会过段时间又太监了吧)android

  

  图1:QQ群官网Android端代码git

  在你的Java代码中添加如下代码便可,key不要写死在Java代码中,最好由Unity调用端传入:github

 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端所须要作的工做就完成了,是否是超级方便哈~几乎啥也没干,蛤蛤。  api

2.iOS端的工做

  再来看看咱们须要在iOS端作些什么?其实跟Android端的工做大同小异,主要仍是提供一个接口给Unity端调用。在腾讯官网的QQ群官方主页,官方也一样为咱们提供好了iOS相关的代码,不过这些代码要在Unity上使用的话,还须要小小地改造和封装一下。轻轻点亮一个赞,我们下面立刻就现场教学,教你们怎么处理一下:微信

  

  图2:QQ群官网 iOS端代码app

  在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中去调用这些接口了。post

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的效果马三就不单独打包展现了,感兴趣的话,你们能够本身打包测试一下。

3、总结

  在本篇博客中,马三和你们一块儿学习了如何实如今不接SDK的状况在手机上拉起手Q加群。在开发工做中,有些问题可能并无咱们想象中的那么复杂,进行功能开发以前多阅读一下官方文档、收集下相关资料,说不定就会有更加简单优雅的解决方案。

  本篇博客中的项目代码已经同步至Github,欢迎Fork! https://github.com/XINCGer/Unity3DTraining/tree/master/SDK/PullUpQQGroupDemo

 

 

 

 

若是以为本篇博客对您有帮助,能够扫码小小地鼓励下马三,马三会写出更多的好文章,支持微信和支付宝哟!

       

 

做者:马三小伙儿
出处:http://www.javashuo.com/article/p-ziupyguo-ey.html 请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面若有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!

相关文章
相关标签/搜索