2015-09-29 57 views
-1

我们一直在使用共享扩展(来自safari)构建像app一样的应用程序。 现在,我们已经遇到了一个大问题,扩展崩溃,当我尝试获取URL字符串Xamarin构建的iOS共享扩展中的NSURL absoluteString崩溃

CRASH:

胎面1

未处理的异常:

0单0x01746691 mono_handle_exception_internal + 2168

1 Mono 0x01745e13 mono_handle_exception + 30

2 Mono 0x0173ed2d mono_arm_throw_exception + 104

3 com.XXX.ShareExtension 0x00268e44 throw_exception + 64

在ObjCRuntime.Runtime.throw_ns_exception(IntPtr的)[0x00000]在/用户/助洗剂/数据/通道/ 2077/d8e9592a /源极/ maccore /运行/ Delegates.generated.cs:100 在(包装机到管理)ObjCRuntime.Runtime.throw_ns_exception(IntPtr的)< 0x00048>

6 com.XXX.ShareExtension 0x006fe5c0 xamarin_throw_ns_exception + 52

7 com.XXX.ShareExtension 0x007004b0 _ZL17exc eption_handlerP11NSException + 224

8的CoreFoundation 0x242cbba9 + 644

9 libobjc.A.dylib 0x35c7f087 + 174

10的libC++ abi.dylib 0x35463e17 + 78

11的libC++ abi.dylib 0x354638f7 __cxa_rethrow + 102

12 libobjc.A.dylib 0x35c7ef47 objc_exception_rethrow + 42

这意味着单声道的CRA他是。寻找进一步我看到:

胎面2

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

Objective-C中的异常。名称:NSInvalidArgumentException原因:

NSGetSizeAndAlignment():不受支持的类型编码规范'Y'在'Y'Äh?Π0i≈Π√™o≈Π√ª'in'Y,h≈Π0i≈Π √™o≈Π√ª”

本地栈跟踪:

0的CoreFoundation 0x242cb883 + 150

1 libobjc.A。dylib 0x35c7edff objc_exception_throw + 38

2的CoreFoundation 0x242cce71 + 536

3的CoreFoundation 0x242cef69 + 60

4的CoreFoundation 0x241f9515 + 516

5 libextension.dylib 0x355c2e47 + 150

6融为一体。 XXX.ShareExtension 0x000643f4 wrapper_managed_to_native_ObjCRuntime_Messaging_void_objc_msgSend_IntPtr_IntPtr_IntPtr_intptr_intptr_intptr_intptr_intptr + 128

7 com.XXX.ShareExtension 0x0003a5e8 Foundation_NSItemProvider_LoadItem_string_Foundation_NSDictionary_System_Action_2_Foundation_NSObject_Foundation_NSError + 384

8 com.XXX.ShareExtension 0x0000c5d4 iOS_ShareExtension_ShareViewController_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。

+0

什么是“objectLoaded”?如果它是在LoadItem completionHandler中接收到的数据,那么它不是NSUrl,而是Url返回的数据。类型强制转换到一个URL并试图访问AbsoluteString会导致故障(你的堆栈跟踪似乎显示它的二进制数据) – SushiHangover

+0

是的,这就是: 私人无效OnItemLoaded(NSObject的objectLoaded,NSError错误) 看来你是对的,现在我想知道,为什么它有时会起作用? – DivisionByNullPointer

回答

0

这可以通过此修复程序来解决:https://bugzilla.xamarin.com/show_bug.cgi?id=34518

我会仔细检查,它实际上让你认为是造成问题的原因(使用Console.WriteLine因为调试连接不用于扩展工作)就行了。如果objectLoaded不是NSUrl,那么强制转换将返回null,我期望一个空指针异常,而不是一个模糊的编码错误。

编辑:引用的错误修复还没有通过Xamarin alpha通道,但问题似乎是通过公开回调方法解决的。在我的情况下,我使用了内联代理,但这只是一个“幕后”的私有方法。