【Unity游戲開發】不接SDK也能在游戲內拉起加QQ群操作?


一、引子

  一般在游戲進行對外測試的時候都會有一個玩家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 
請尊重別人的勞動成果,讓分享成為一種美德,歡迎轉載。另外,文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM