C# Xamarin构建的iOS共享扩展中的NSURL absoluteString崩溃

C# Xamarin构建的iOS共享扩展中的NSURL absoluteString崩溃,c#,ios,xamarin,mono,ios-app-extension,C#,Ios,Xamarin,Mono,Ios App Extension,我们一直在使用共享扩展(来自safari)构建类似messenger的应用程序。 现在我们遇到了一个大问题,当我试图获取url字符串时,扩展崩溃了 崩溃: 踏面1 未处理的异常: 0单声道0x01746691单声道句柄异常内部+2168 1单声道0x01745e13单声道句柄异常+30 2单声道0x0173ed2d单声道手臂抛出异常+104 3 com.XXX.ShareExtension 0x00268e44抛出\u异常+64 在/Users/builder/data/lanes/2077/d

我们一直在使用共享扩展(来自safari)构建类似messenger的应用程序。 现在我们遇到了一个大问题,当我试图获取url字符串时,扩展崩溃了

崩溃:

踏面1

未处理的异常:

0单声道0x01746691单声道句柄异常内部+2168

1单声道0x01745e13单声道句柄异常+30

2单声道0x0173ed2d单声道手臂抛出异常+104

3 com.XXX.ShareExtension 0x00268e44抛出\u异常+64

在/Users/builder/data/lanes/2077/d8e9592a/source/maccore/Runtime/Delegates.generated.cs:100中的ObjCRuntime.Runtime.throw_ns_异常(intptr)[0x00000] at(包装器本机到托管)ObjCRuntime.Runtime.throw_ns_异常(intptr)

6 com.XXX.ShareExtension 0x006fe5c0 xamarin_抛出异常+52

7 com.XXX.ShareExtension 0x007004b0\u ZL17exception\u handlerP11NSException+224

8芯基础0x242cbba9+644

9 libobjc.A.dylib 0x35c7f087+174

10 libc++abi.dylib 0x35463e17+78

11 libc++abi.dylib 0x354638f7\uuu cxa\u rethrow+102

12 libobjc.A.dylib 0x35c7ef47 objc_异常_rethrow+42

也就是说mono崩溃了。再进一步看,我看到:

踏板2

iOS_ShareExtension[336]:未处理的托管异常:

抛出Objective-C异常。名称:NSInvalidArgumentException原因:

NSGetSizeAndAlignment():不支持的类型编码规范“Y”位于“Y”的位置≈∏0i≈∏√™o≈∏√ª“in”YÄh≈∏0i≈∏√™o≈∏√ª’

本机堆栈跟踪:

0芯基础0x242cb883+150

1 libobjc.A.dylib 0x35c7edff objc_异常_抛出+38

2芯基础0x242cce71+536

3芯基础0x242cef69+60

4芯基础0x241f9515+516

5 libextension.dylib 0x355c2e47+150

6 com.XXX.ShareExtension 0x000643f4 包装器\u托管\u到\u本地\u对象运行时\u消息传递\u无效\u对象运行\u msgSend\u IntPtr\u IntPtr\u IntPtr\u IntPtr\u IntPtr\u IntPtr\u IntPtr+128

7 com.XXX.ShareExtension 0x0003a5e8基础提供程序加载项字符串基础字典系统操作基础对象基础错误+384

8 com.XXX.ShareExtension 0x0000c5d4 iOS\u ShareExtension\u ShareViewController\u ViewDidLoad+1048

我的崩溃代码:

    NSExtensionItem content = ExtensionContext.InputItems [0];

    foreach (NSItemProvider item in content.Attachments) {
        if (item.HasItemConformingTo ("public.url")){
            item.LoadItem (UTType.URL,null, OnItemLoaded);
            break;
        }
    }
然后:

NSUrl url = objectLoaded as NSUrl;
_sharedURl = url.AbsoluteString; // THIS CRASH!!!

你知道怎么绕过这个吗?我甚至尝试过以各种方式隐藏此NSUrl。

此修复程序可以解决此问题:

我会再次检查它是否真的到达了您认为导致问题的那一行(使用Console.WriteLine,因为调试附件不适用于扩展)。如果objectLoaded不是NSUrl,则强制转换将返回null,我希望出现null指针异常,而不是模糊的编码错误


编辑:引用的bug修复程序还没有通过Xamarin alpha通道,但是通过公开回调方法,问题似乎得到了解决。在我的例子中,我使用的是内联委托,但这只是“幕后”的私有方法。

什么是“objectLoaded”?如果是LoadItem completionHandler中接收的数据,则它不是NSUrl,而是Url返回的数据。键入将其强制转换为url并尝试访问AbsoluteString将导致错误(堆栈跟踪显示其二进制数据)是的,它是:private void OnItemLoaded(NSObject objectLoaded,NSError error)您似乎是对的,现在我想知道,为什么它有时会工作?