Unity3D和IOS的交互教程——通过URL启动APP并传递参数
2017-10-18 15:19
1176 查看
最近项目(麻将手游)中遇到这样一个需求:在创建一个私人房后通过ShareSDK分享一个连接到微信,点击这个连接后设备将跳转至下载页面或是启动APP并直接进入到指定房间。由于目前没有原生IOS的开发经验,在发挥面向百度程序员的特长之后,写出来下面的方案并用于项目中,实测可行,特来分享,希望不足之处还请指出;
工程环境:Unity 5.2.2 + Xcode7.3.1
在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);
让我们回到Xcode工程里,找到下图中的UnityAppController.mm脚本;
来自CODE的代码片
snippet_file_0.txt
经过上一步我们通过UnitySendMessage即向Unity发送了信息,它有三个参数;
如果我在一个名字为Script.cs的脚本里写了一个名字为Function的方法,并且这个脚本挂载了一个名字为GameObject的物体上;
那么就可以在Xcode的脚本里这么写:UnitySendMessage(GameObject,Function,"我来传话啦");
结合上文,我此处应该在挂在Main Camera上的某个脚本里写如下函数;
来自CODE的代码片
snippet_file_0.txt
在Unity中写如下代码;
来自CODE的代码片
snippet_file_0.txt
回到刚才Xcode工程的脚本中写如下代码;
来自CODE的代码片
snippet_file_0.txt
至此,Unity和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脚本;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // 添加这句代码,它负责向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<NSString *,id> *)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;} |
来自CODE的代码片
snippet_file_0.txt
3.IOS发送消息给Unity
经过上一步我们通过UnitySendMessage即向Unity发送了信息,它有三个参数;如果我在一个名字为Script.cs的脚本里写了一个名字为Function的方法,并且这个脚本挂载了一个名字为GameObject的物体上;
那么就可以在Xcode的脚本里这么写:UnitySendMessage(GameObject,Function,"我来传话啦");
结合上文,我此处应该在挂在Main Camera上的某个脚本里写如下函数;
1 2 3 4 | public void OpenIosApp( string parmaters ){ GameDebug.Log( "openUrl传过来的字符串为: " + parmaters );} |
来自CODE的代码片
snippet_file_0.txt
4.Unity发送消息给IOS
在Unity中写如下代码;1 2 3 4 | using System.Runtime.InteropServices; [DllImport("__Internal")]private static extern void _GetURLString ();// 当游戏模块加载完毕后调用;public static void GetURLString(){ _GetURLString();} |
来自CODE的代码片
snippet_file_0.txt
回到刚才Xcode工程的脚本中写如下代码;
1 2 3 4 5 6 7 8 9 10 11 12 | extern "C"{ void _GetURLString();} void _GetURLString(){ // 针对启动APP的情况传递参数; UnitySendMessage( "Main Camera", [@"OpenIosApp" UTF8String], [URLString UTF8String] ); // 清空,防止造成干扰; URLString = @"";} |
来自CODE的代码片
snippet_file_0.txt
至此,Unity和IOS之间的互相通讯已经建立成功。
相关文章推荐
- Unity3D和IOS的交互教程——通过URL启动APP并传递参数
- Android 通过URL scheme 实现点击浏览器中的URL链接,启动特定的App,并调转页面传递参数
- Android 通过URL scheme 实现点击浏览器中的URL链接,启动特定的App,并调转页面传递参数
- Android 通过URL scheme 实现点击浏览器中的URL链接,启动特定的App,并调转页面传递参数
- iOS:启动另外的APP并传递参数
- 通过打开html启动app并传递参数
- 通过注册的URL Scheme向目标APP传递参数
- 通过注册的URL Scheme向目标APP传递参数
- 【iOS学习笔记】通过自定义的URL Scheme启动你的App
- 备忘录:javascript通过url向jsp页面传递中文参数乱码解决方法
- javascript通过url向jsp页面传递中文参数乱码解决方法
- ASP.NET页面通过URL传递参数(一)(转载)
- jquery通过url传递 和 接收 参数
- mfc通过URL传递参数时处理特殊字符
- 通过url地址传递base64加密参数遇到的问题整理
- html通过url传递参数
- javascript通过url向jsp页面传递中文参数乱码解决方法
- django通过url传递参数(编辑操作页面)
- javascript通过url向jsp页面传递中文参数导致乱码解决方案
- IOS之URL Scheme的使用(可以在app之间调用传递数据)