Xamarin.iOS中NSUrl初始化抛出异常,initWithString返回nil求助
Xamarin.iOS中NSUrl初始化抛出异常的解决办法
问题场景
现有Xamarin.iOS代码如下:
using (var url = new NSUrl(uri)) { // some code }
此前运行正常,现在创建NSUrl实例时抛出异常,错误信息:
Could not initialize an instance of the type 'Foundation.NSUrl': the native 'initWithString:' method returned nil. It is possible to ignore this condition by setting ObjCRuntime.Class.ThrowOnInitFailure to false.
涉及的URI示例:https://myappdev.blob.core.windows.net/myimages/apples/auth0|5db82ec6a5ee570c97cd5465.jpg?1666895662894(该URI可在浏览器正常访问)
问题原因
iOS原生NSUrl的initWithString:方法对URL格式的校验严格遵循RFC标准,竖线|属于需要URL编码的特殊字符。浏览器会自动兼容未编码的特殊字符,但NSUrl初始化时会因格式不合法返回nil,触发Xamarin的初始化失败异常。
解决方案
方案1:对URI进行标准URL编码(推荐)
在创建NSUrl前,将URI中的特殊字符转换为合法的URL编码形式,确保符合RFC标准:
// 对原始URI进行编码 var encodedUri = Uri.EscapeUriString(uri); using (var url = new NSUrl(encodedUri)) { // 后续业务代码 }
如果需要避免重复编码问题,可先通过Uri.TryCreate验证并生成标准URI:
if (Uri.TryCreate(uri, UriKind.Absolute, out var validUri)) { using (var url = new NSUrl(validUri.AbsoluteUri)) { // 后续业务代码 } }
方案2:临时禁用初始化失败异常(不推荐)
按照错误提示设置全局开关,可忽略该异常,但仅建议用于临时调试,不适合生产环境:
// 临时关闭初始化失败抛出异常 ObjCRuntime.Class.ThrowOnInitFailure = false; using (var url = new NSUrl(uri)) { if (url != null) { // 后续业务代码 } // 恢复默认设置 ObjCRuntime.Class.ThrowOnInitFailure = true; }
内容的提问来源于stack exchange,提问作者Drake
相关产品推荐
相关产品推荐

