You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:55:19