IOS的app在苹果手机中可以通过设置好的URL_Scheme,在浏览器中把请求头换成URL_Scheme://就能直接打开对应的应用(如果没有安装对应的app,会弹出指令无效的弹框,但可以跳转到指定应用进行下载,具体的js逻辑参照我的这篇笔记https://blog.csdn.net/ssssssilver/article/details/109730514)
URL_Scheme的具体设置需要在unity打包出xcode工程后,在xcode工程的info里面设置,如图所示
设置好URL_Types后,可以在工程根目录的info.plist上看到对应的节点配置
URL_Identifier应该是指应用的唯一标识,URL_Schemes应该是指一个应用可以设置多个URL_Sheme,这里我设置成test_scheme,那么当我在浏览器中输入test_scheme:// 后,按确定就能够打开对应的这个打包出来的应用。
打开应用的方法实现了,还需要把值传进去,目标是输入test_scheme://param1=1¶m2=2这串信息,能在unity能在应用中检测到param1=1¶m2=2这一串字符串,然后根据逻辑进行页面跳转之类的自定义操作。
我们首先需要在unity中定义一个方法引用,这个方法是提供给xcode进行调用的。
public void IosCallFunction(string parmaters)
{
Debug.Log("url_scheme传过来的字符串为: " + parmaters);
}
同时要把这个方法的类挂载在MainCamera上,这样的话xcode里面就能通过SendMessage的方式调用unity里面挂载在指定物体上的类里面的方法。
完成上一步后将unity工程打包成xcode工程,并找到UnityAppController.mm这个类。具体位置如下图
在这个类里面找到对应的openURL类,xcode就是通过这个类来处理url_scheme打开的逻辑。在return返回之前,把url的值通过UnitySendmessage的方法传回给unity,则可以触发上面在unity里面创建好的类。代码如下
// UIApplicationOpenURLOptionsKey was added only in ios10 sdk, while we still support ios9 sdk
- (BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary<NSString*, id>*)options
{
id sourceApplication = options[UIApplicationOpenURLOptionsSourceApplicationKey], annotation = options[UIApplicationOpenURLOptionsAnnotationKey];
NSMutableDictionary<NSString*, id>* notifData = [NSMutableDictionary dictionaryWithCapacity: 3];
if (url)
{
notifData[@"url"] = url;
UnitySetAbsoluteURL(url.absoluteString.UTF8String);
}
if (sourceApplication) notifData[@"sourceApplication"] = sourceApplication;
if (annotation) notifData[@"annotation"] = annotation;
AppController_SendNotificationWithArg(kUnityOnOpenURL, notifData);
URLString = [url absoluteString];
// 传值给unity
//Main Camera指unity场景中的Main Camera物体
//IosCallFunction指在Main Camera中挂载的类里面的IosCallFunction方法
//URLString指上面这方法需要传的值
UnitySendMessage( "Main Camera", [@"IosCallFunction" UTF8String], [URLString UTF8String]);
return YES;
}
这样的话,通过url打开ios应用时,就可以同时把url_scheme的参数传回给unity的方法中进行处理。