unity 實(shí)現(xiàn)IOS原生方法調(diào)用

在游戲中我們有時(shí)需要直接調(diào)用IOS相關(guān)的接口代碼哩治,如喚起iOS的原生彈窗(GDPR,ATT彈窗等)艾猜,獲取國(guó)家信息等等买喧,其實(shí)本質(zhì)就是從C#端,調(diào)用對(duì)應(yīng)的iOS的C++代碼匆赃。
有兩種方法淤毛,一種是利用UnitySendMessage來(lái)實(shí)現(xiàn);一種是利用delegates算柳;

第一種UnitySendMessage:
這種方式要簡(jiǎn)單一些低淡,但是會(huì)有一些限制
使用UnitySendMessage("GameObjectName1", "MethodName1", "Message to send"); 方法
這種方式需要場(chǎng)景中有一個(gè)對(duì)應(yīng)的名字“GameObjectName1”的GameObject,同時(shí)該對(duì)象上掛載了一個(gè)繼承自MonoBehaviour的腳本瞬项,該腳本中有一個(gè)名為“MethodName1”的方法蔗蹋,最后一個(gè)參數(shù)為傳遞的參數(shù),可有可無(wú)滥壕。
注意:這種方法是異步的纸颜,而且會(huì)延遲一幀執(zhí)行

第二種 delegates

C#端的對(duì)應(yīng)接口需要,以如下形式添加

//添加MonoPInvokeCallback绎橘;C++中 會(huì)有一個(gè)對(duì)應(yīng)的 OnViewConfirm 方法指針(名字要一致)
[MonoPInvokeCallback(typeof(OnViewConfirm))]
static void calledByNativeC() {              //該方法必須為靜態(tài)函數(shù)
       viewCallBack?.Invoke();
}

private delegate void OnViewConfirm();
private static Action viewCallBack;

[DllImport("__Internal")]
private static extern void showAlertDialog(string title, string message, string []buttons, string []urls, int buttonCount, OnViewConfirm calledByNativeC);

public override void showSystemAlertDialog(string title, string message, string []buttons, string []urls, Action callBack)
        {
            viewCallBack = callBack;
            showAlertDialog(title, message, buttons, urls, buttons.Length, calledByNativeC);  //這里把對(duì)應(yīng)的C#回調(diào)函數(shù)傳給C++
        }

對(duì)應(yīng)的 C++ (.cpp)或者 Objective-C++(.mm) ,(Assets\Plugins\iOS\iOSPlatformHelper)中需要

#include <stdlib.h>
#ifdef __cplusplus 
extern "C" { 
#endif

typedef void (*OnViewConfirm)();               //定義對(duì)應(yīng)的指針函數(shù)
static OnViewConfirm s_calledFromCSharp = NULL;
void showAlertDialog_native()
{
...
if (s_calledFromCSharp != NULL)
{
        s_calledFromCSharp();       //觸發(fā)對(duì)應(yīng)的回調(diào)函數(shù)
}
...
}

void showAlertDialog(const char *title, const char *message, const char **buttons, const char **urls, int buttonCount, OnViewConfirm viewClosed)
{
...
s_calledFromCSharp = viewClosed;       //接收C#傳過(guò)來(lái)的函數(shù)指針
...
showAlertDialog_native();
}

最后順便提一下胁孙,著這種平臺(tái)方法的整合

public abstract class PlatformTool
{
  private static PlatformTool _instance = null;
        public static PlatformTool Instance
        {
            get
            {
                if (_instance == null)
                {

#if UNITY_EDITOR_WIN
                    _instance = new PlatformToolWindows();
#elif UNITY_ANDROID
                    _instance = new PlatformToolAndroid();
#elif UNITY_IOS
                    _instance = new PlatformToolIOS();
#else
                    _instance = new PlatformToolOther();
#endif
                }


                return _instance;
            }
        }

//各種版本號(hào),用戶id称鳞,國(guó)家涮较,原生彈窗等的屬性或者方法
public virtual string getGuestAccount()
        {
            return getDeviceID();
        }

public virtual string getDeviceID()
        {
            if (_deviceUniqueIdentifier.Length == 0)
            {
                _deviceUniqueIdentifier = SystemInfo.deviceUniqueIdentifier;
            }

            return _deviceUniqueIdentifier;
        }

}
public class PlatformToolWindows : PlatformTool{}
public class PlatformToolAndroid : PlatformTool{}
public class PlatformToolIOS : PlatformTool{}
public class PlatformToolOther : PlatformTool{}

相關(guān)內(nèi)容:
https://docs.unity3d.com/2020.3/Documentation/Manual/PluginsForIOS.html
http://www.reibang.com/p/0c61444c9b28
利用第一種方式實(shí)現(xiàn)的原生iOS窗口調(diào)用方法
http://www.reibang.com/p/75cef8007e75

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冈止,隨后出現(xiàn)的幾起案子狂票,更是在濱河造成了極大的恐慌,老刑警劉巖熙暴,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闺属,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡周霉,警方通過(guò)查閱死者的電腦和手機(jī)掂器,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)俱箱,“玉大人国瓮,你說(shuō)我怎么就攤上這事。” “怎么了乃摹?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵禁漓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我孵睬,道長(zhǎng)播歼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任肪康,我火速辦了婚禮荚恶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磷支。我一直安慰自己谒撼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布雾狈。 她就那樣靜靜地躺著廓潜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪善榛。 梳的紋絲不亂的頭發(fā)上辩蛋,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音移盆,去河邊找鬼悼院。 笑死,一個(gè)胖子當(dāng)著我的面吹牛咒循,可吹牛的內(nèi)容都是我干的据途。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叙甸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼颖医!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起裆蒸,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤熔萧,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后僚祷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佛致,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年辙谜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俺榆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筷弦,死狀恐怖肋演,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烂琴,我是刑警寧澤爹殊,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站奸绷,受9級(jí)特大地震影響梗夸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜号醉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一反症、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧畔派,春花似錦铅碍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至憨愉,卻和暖如春烦绳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背配紫。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工径密, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躺孝。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓享扔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親括细。 傳聞我的和親對(duì)象是個(gè)殘疾皇子伪很,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容