1. 程式人生 > >Unity3D和IOS的互動教程——通過URL啟動APP並傳遞引數

Unity3D和IOS的互動教程——通過URL啟動APP並傳遞引數

最近專案(麻將手遊)中遇到這樣一個需求:在建立一個私人房後通過ShareSDK分享一個連線到微信,點選這個連線後設備將跳轉至下載頁面或是啟動APP並直接進入到指定房間。由於目前沒有原生IOS的開發經驗,在發揮面向百度程式設計師的特長之後,寫出來下面的方案並用於專案中,實測可行,特來分享,希望不足之處還請指出;

工程環境:Unity 5.2.2 + Xcode7.3.1

1.喚醒APP並傳遞引數

在Unity釋出出的Xcode工程中按下圖進行設定;

URL Schemes位置填寫的內容可以理解為你給你的APP起的名字,當其他人喊你的名字後你將會迴應(PS.感興趣的同學可以在Safari裡面輸入 weixin://dl/profile ,可以看到世界上程式設計最厲害的人),當然,你可以有很多名字或是外號,你都可以新增進去;

設定完成後將會在下圖位置看到你剛才給APP“起的名字”;


如果此時真機除錯,我們將能通過 WarTree:// 啟動這個APP;

WarTree://Content 將啟動APP並將這一整句傳進APP(Content處為想傳遞的引數,我在我的專案裡傳遞的是Mahjong://pid=0&roomID=0&time=0);

2.接收URL傳遞的引數

讓我們回到Xcode工程裡,找到下圖中的UnityAppController.mm指令碼;


// 新增這句程式碼,它負責向Unity傳遞引數;
extern void UnitySendMessage(const char *, const char *, const char *);
// 新增這個全域性變數,用於儲存APP啟動時URL傳遞的引數;
// 由於需要等遊戲的主要模組載入完畢後再向Unity傳送訊息,所以此處用了這個全域性變數;等待遊戲載入完後通知IOS;
NSString *URLString = @"";
// 此處是個坑,IOS9以後的系統走的是這個介面,而我在Unity5.2.2中釋出的Xcode工程只有下面那個介面;
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options
{
    URLString = [url absoluteString];
    // 針對喚醒APP的情況傳遞引數;
    UnitySendMessage( "Main Camera", [@"OpenIosApp" UTF8String], [URLString UTF8String] );
    return YES;
}
// 這個是我釋出成Xcode後自帶的,裡面的內容不只有這些,只需加上前兩行即可;
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
{
    URLString = [url absoluteString];
    // 針對喚醒APP的情況傳遞引數;
    UnitySendMessage( "Main Camera", [@"OpenIosApp" UTF8String], [URLString UTF8String] );
    return YES;
}

3.IOS傳送訊息給Unity

經過上一步我們通過UnitySendMessage即向Unity傳送了資訊,它有三個引數;
如果我在一個名字為Script.cs的腳本里寫了一個名字為Function的方法,並且這個指令碼掛載了一個名字為GameObject的物體上; 那麼就可以在Xcode的腳本里這麼寫:UnitySendMessage(GameObject,Function,"我來傳話啦"); 結合上文,我此處應該在掛在Main Camera上的某個腳本里寫如下函式;
public void OpenIosApp( string parmaters )
{
	GameDebug.Log( "openUrl傳過來的字串為: " + parmaters );
}

4.Unity傳送訊息給IOS

在Unity中寫如下程式碼;
using System.Runtime.InteropServices;

[DllImport("__Internal")]
private static extern void _GetURLString ();
// 當遊戲模組載入完畢後呼叫;
public static void GetURLString()
{
	_GetURLString();
}
回到剛才Xcode工程的指令碼中寫如下程式碼;
extern "C"
{
    void _GetURLString();
}

void _GetURLString()
{
    // 針對啟動APP的情況傳遞引數;
    UnitySendMessage( "Main Camera", [@"OpenIosApp" UTF8String], [URLString UTF8String] );
    // 清空,防止造成干擾;
    URLString = @"";
}


至此,Unity和IOS之間的互相通訊已經建立成功。

相關推薦

Unity3DIOS互動教程——通過URL啟動APP傳遞引數

最近專案(麻將手遊)中遇到這樣一個需求:在建立一個私人房後通過ShareSDK分享一個連線到微信,點選這個連線後設備將跳轉至下載頁面或是啟動APP並直接進入到指定房間。由於目前沒有原生IOS的開發經驗,在發揮面向百度程式設計師的特長之後,寫出來下面的方案並用於專案中,實測可

通過網頁開啟App傳遞引數

如果想要從網頁中開啟App,只要在AndroidManifest.xml檔案中設定Activity的相關屬性則可,具體如下: <activity
 android:name=".StartActivity">

 <int

使用URL 啟動unity Andriod APP傳遞引數

我的棋牌遊戲需要一個功能: 房主微信分享一個內容(微信的URL),上面包含有url,標題,內容,略圖。當被邀請人點選分享的內容,可以直接開啟這個遊戲,並登入後直接登入這個房間。不需要人工記憶房間號等。 OK,這裡我們就要用到幾個知識點: 1、微信SDK-分享URL 2、

Unity3D Android 互動時遇到的常見的兩個問題

CommandInvokationFailure: Failed to re-package resources. E:\android\android-sdk-windows\android-sdk-windows\build-tools\25.0.2\aapt.exe package

Android&iOS:如何在外部啟動app(若有安裝APP, 則自動啟動app(使用 URL Schema), 若沒有安裝, 則詢問是不是到應用市場下載)

Android&iOS:如何在外部啟動app(若有安裝APP, 則自動啟動app(使用 URL Schema), 若沒有安裝, 則詢問是不是到應用市場下載) 原理:用瀏覽器開啟下載網頁html, 利用javascript進行條件判斷。  <head>

[Unity3D]Unity+Android互動教程——讓手機"動"起來

想要用Unity實現一個二維碼掃描的功能,然後網上找外掛,找到一個貌似叫EasyCodeScanner,但下載下來用用,真不好使,一匯入執行就報錯,調好錯了再執行發現點按鈕沒反應,反覆試了幾遍發現還是沒反應,沒辦法看原始碼,結果發現只實現了IOS部分,沒有Android部分,我屮艸芔茻...,神傷!用IO

通過URL啟動應用程式

html <a href="myApp://Hello!">點選這裡啟動程式</a> reg.reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\myAp

在一個jsp頁面接收另一個jsp頁面通過URL方式傳過來的引數

例如在一個jsp頁面有如下程式碼: <a href="${pageContext.request.contextPath}/family/send.jsp?grade=1"></a> 那麼怎麼在另個jsp頁面直接接收grade的值呢? 方法如下:

通過URL開啟APP

如果想要從網頁中開啟App,只要在AndroidManifest.xml檔案中設定Activity的相關屬性則可,具體如下: <activity
 android:name=".StartActivity">

 <intent-filt

安卓通過url開啟app,以及下載對應app

一.使用Custom Scheme URI開啟APP 就Android平臺而言,URI主要分三個部分:scheme, authority and path。其中authority又分為host和port。格式如下: scheme://host:

Android 啟動另外的APP傳遞引數

                有時候需要從一個APP中啟動另外一個APP,比如Twitter/微信等。如果你不知道那個APP的Activity,但是知道包名(package name),那麼可以使用如下的方法:Intent LaunchIntent = getPackageManager().getLaun

url中向後臺傳遞引數中文亂碼

方法一: 1、jsp中程式碼   var userNo = $('#prisoner_id').val();       userNo = encodeURI(userNo);       allPrisonerGrid.datagrid('options').url = 'mobilemanage!all

GridView實現超連結列圖片列,跳轉頁面傳遞引數

「注意!請勿私自轉載!」   最近在使用ASP.NET建設網站,需要解決如標題所示的問題,上網可以搜出很多答案。現在簡單總結一下我的解決辦法,方便各位取用,有任何疑問歡迎提出交流。 (注:使用V

vue 頁面跳轉(兄弟元件)通過路由或vuex 進行傳遞引數,並且實現重新整理資料不消失

用vue搭建整個前端頁面,需要實現一個資訊列表的顯示,當點選某一項時,跳轉到另外一個頁面顯示具體的資訊詳情。那麼像這種兄弟之間的頁面如何傳遞參呢?我們都知道在 Vue.js 的專案中,如果專案結構簡單,

WPF 利用Process.Start()方法啟動指定路徑下的exe檔案傳遞引數

簡單來說就是實現一個程式A 開啟程式B,並且在開啟的時候傳遞一些引數給B,最後在B視窗上顯示出引數,這個小功能也是折騰了我半天。現在把我的過程整理記錄下來。 1.首先我們得有一個被呼叫的程式,新建一個簡單的WPF程式,命名為:argTest。裡面加一個label,用來顯示接

cmake教程5-macro巨集定義以及傳遞引數給原始檔

引入在C++程式中我們經常見到如下,兩個問題: 1. 輸出當前程式的版本號 2. 通過cmake新增macro巨集定義 出入到原始檔,例如在編譯opencv/caffe的時候,我們通過cmake -DUSE_CUDA=ON/OFF來確定,是否使用c

Android--通過網頁開啟APP傳值詳解

        本來這篇部落格應該寫Git的,但是由於最近專案比較忙,Git的內容還沒有整理完(因為還有GitLab以及Github的內容),所以先寫了這片部落格總結以下比較零碎的東西。現在正在做商城

Swift3.0通過閉包回撥傳遞引數 / @escaping

//載入請求資料 func loadData(completion: @escaping (_ result:[String]) -> ()) -> () { DispatchQueue.global().async {

Android -- 啟動Service傳遞資料

本文主要記錄Activity傳遞資料到Service。 原始碼與上一篇基本是保持一致的,只是在跳轉過程中增加了引數的傳遞。 我們先來看效果。 1、效果圖 2、通過以上效果圖,可以看出

Url傳送post請求傳遞引數

        #region  向Url傳送post請求,返回網站響應內容        /// <summary>        /// 向Url傳送post請求,返回網站響應內容        /// </summary>        ///