【Unity】iOS应用通过浏览器打开并传值的设置方法

        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&param2=2这串信息,能在unity能在应用中检测到param1=1&param2=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的方法中进行处理。

猜你喜欢

转载自blog.csdn.net/ssssssilver/article/details/110205969