Unity在iOS18上OpenURL函数无法打开网页的解决办法_uiapplication.openurl ios18
环境
Unity 2021.3.15f1
iOS版本 18.3.2
问题描述:
在iOS18上,调用Application.OpenURL无反应,XCode控制台提示:
BUG IN CLIENT OF UIKIT: The caller of UIApplication.openURL(_: ) needs to migrate to the non-deprecated UIApplication.open(_:options:completionHandler:). Force returning false (NO).
原因:
使用的Unity版本过低,当前版本中的Application.OpenURL,在ios上实际调用的是UIApplication.openURL(_:)方法。
该方法在ios18上已经被废弃,替换为UIApplication.open(_:options:completionHandler:)
解决:
方法一:升级Unity
如果项目不适合升级Unity,可以考虑方法二。
方法二:创建iOS原生插件供Unity调用
-
在Unity工程的Assets\\Plugins\\iOS文件夹中新建.mm文件(URLHandler.mm),实现对新方法的调用(_OpenURL)
#import extern \"C\" { void _OpenURL(const char *url) { NSString *urlStr = [NSString stringWithUTF8String:url]; NSURL *nsurl = [NSURL URLWithString:urlStr]; if (@available(iOS 10.0, *)) { [[UIApplication sharedApplication] openURL:nsurloptions:@{} completionHandler:nil]; } else { [[UIApplication sharedApplication] openURL:nsurl]; } }}
-
在Inspector中检查,确保.mm文件导入设置中勾选了iOS
-
在Unity工程中新建.cs文件(URLHandler.cs)
-
定义与.mm文件中方法对应 extern 方法(_OpenURL)
-
定义供外部调用的方法(OpenURL)
using UnityEngine;public class URLHandler{ #if UNITY_IOS && !UNITY_EDITOR [DllImport (\"__Internal\")] private static extern void _OpenURL(string url); #endif public static void OpenURL(string url) { #if UNITY_IOS && !UNITY_EDITOR _OpenURL(url); #else Application.OpenURL(url); #endif }}
-
在需要的位置调用URLHandler.OpenURL打开网页
URLHandler.OpenURL(url);
-
注意事项
- 相关文件最好创建在Assets\\Plugins\\iOS文件夹中,避免改动影响到非iOS的平台
- DllImport声明需要判断平台,避免影响非iOS平台
- 调用方法时注意对平台的判断,非iOS平台仍可以调用Unity的Application.OpenURL方法
#if UNITY_IOS && !UNITY_EDITOR _OpenURL(url);#else Application.OpenURL(url);#endif