C# Xamarin.iOS MPMediaItem.AssetURL始终为空

C# Xamarin.iOS MPMediaItem.AssetURL始终为空,c#,xamarin.ios,C#,Xamarin.ios,在Xamarin.iOS中,MPMediaItem.AssetURL始终为任何项返回null。我研究了一下,然后尝试使用Objective-C手柄。所以我用 NSUrl url=新的NSUrlitem.VALUEFORPROPERTYMMEDIAITEM.AssetURLProperty.Handle; 上面的代码尝试获取AssetURL属性的objective-c句柄,然后将其转换为托管表示。它起作用了 所以,我决定研究mono的实现。Mono已经将其实现为- 将此.ValueForPrope

在Xamarin.iOS中,MPMediaItem.AssetURL始终为任何项返回null。我研究了一下,然后尝试使用Objective-C手柄。所以我用

NSUrl url=新的NSUrlitem.VALUEFORPROPERTYMMEDIAITEM.AssetURLProperty.Handle; 上面的代码尝试获取AssetURL属性的objective-c句柄,然后将其转换为托管表示。它起作用了

所以,我决定研究mono的实现。Mono已经将其实现为-

将此.ValueForProperty MPMediaItem.AssetURLProperty返回为NSUrl;
我手动尝试了这个,它实际上返回null。所以,这意味着Xamarin实现是错误的。然而,有一件事让我感到困惑。在我运行正确的第一个代码片段后,第二个被剪断的代码片段不返回null,而是返回正确的值。我的第一个代码段有什么可能改变第二个代码段的行为

听起来好像ValueForProperty返回的句柄不是NSUrl,而强制转换将其设为null,例如,它可能是内部/私有类型

我的第一个代码段可能做了什么来改变第二个代码段的行为


简单。您使用此特定句柄值创建了NSUrl。如果您再次尝试获取该实例,则将返回相同的实例,除非它被垃圾收集,因此我们有一个表示单个本机实例的单个托管实例。

代码片段用于HTML/JS/CSS。你不能用objective-c,那不是objective-c。然而,c使用什么?它肯定是NSUrl。ios sdk也对其进行了记录。如果不是这样,我们就无法将其托管表示创建为NSUrl。然而,有一个警告。ValueForProperty返回-id。因此,它的实际类事先未知,因此返回的NSObject在托管表示中不是NSUrl。如果一个对象在非托管表示中是NSURL,这并不意味着它的管理NSObjor也是定义的NSURL。事实上,它被证明是一种类型,它意味着它与该类型兼容,即它可以是其他的东西,并且当发生这种情况时,席运行时必须处理它。您可以尝试Console.WriteLine item.ValueForPropertyMMediaitem.AssetURLProperty.Description;多看看。此外,如果本机对象属于NSRL类型,则as cast可以获取NSObject并将其转换为NSUrl。这就是集合(如NSDictionary)的工作原理。FWIW我在设备(如ipod)上尝试此功能时,确实会从item.assetur中获取NSUrl实例-library://item/item.m4a?id=8380231058135138167. 您能打开一个bug报告并告诉我们您正在使用的软件的所有版本信息+正在使用的iOS版本吗?我不知道席西是如何处理兼容类型的。但有一点是肯定的,即使潜在对象是NSUrl,如果席没有正确识别底层对象,那么管理对象可能不是NSUrl。“as”cast与本机对象无关。它只看到托管对象。这是Xamarin运行时,它在后台工作以确保正确包装类型。“描述”是正确的ipod库url。我的版本是8.2.0.193独立版