无法在我的 Xamarin MvvmCross Android 应用程序中注册推送“预计为虚拟类型”

Posted

技术标签:

【中文标题】无法在我的 Xamarin MvvmCross Android 应用程序中注册推送“预计为虚拟类型”【英文标题】:Unable to register for pushes "was expected to be of type virtual" in my Xamarin MvvmCross Android app 【发布时间】:2016-11-11 11:25:31 【问题描述】:

我有一个 Xamarin MvvmCross android 应用 API 4.1+,它使用平台的推送和映射功能。在最近更新软件包后,我不再能够注册推送。在我的PushRegistrationListener(意图处理程序服务)中,我正在处理注册事件并在var instanceID = InstanceID.GetInstance(this); 上收到错误:

方法'java.io.File android.support.v4.content.ContextCompat.getNoBackupFilesDir(android.content.Context)' 预计是虚拟类型,但被发现是类型 直接('java.lang.reflect.ArtMethod' 的声明出现在 /system/framework/core-libart.jar)

我发现了很多关于已知 goodle 问题和过时的支持库版本的参考资料,但只要我有更高版本的参考包,它们都是半年的,不适用。这些是我的包裹:

  <package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Compat" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Core.UI" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Core.Utils" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Fragment" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Media.Compat" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.v4" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.v7.AppCompat" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.Android.Support.Vector.Drawable" version="24.2.1" targetFramework="monoandroid70" />
  <package id="Xamarin.GooglePlayServices.Analytics" version="29.0.0.2" targetFramework="MonoAndroid60" />
  <package id="Xamarin.GooglePlayServices.Base" version="29.0.0.2" targetFramework="MonoAndroid60" />
  <package id="Xamarin.GooglePlayServices.Basement" version="29.0.0.2" targetFramework="MonoAndroid60" />
  <package id="Xamarin.GooglePlayServices.Gcm" version="29.0.0.2" targetFramework="MonoAndroid60" />
  <package id="Xamarin.GooglePlayServices.Location" version="29.0.0.2" targetFramework="MonoAndroid60" />
  <package id="Xamarin.GooglePlayServices.Maps" version="29.0.0.2" targetFramework="MonoAndroid60" />
  <package id="Xamarin.GooglePlayServices.Measurement" version="29.0.0.2" targetFramework="MonoAndroid60" />

请告知如何调试此问题。

【问题讨论】:

【参考方案1】:

问题在于您使用的是旧版本的 Google Play 服务 SDK。尽管它是 Xamarin 目前(2016 年 11 月 14 日)提供的最新稳定版本,但它不包括 Google 在 version 9.0.1 中实施的修复。

修复了类更改编译错误 ContextCompat.getNoBackupFilesDir()。

Xamarin 的 Google Play 服务 Nuget 包的版本号映射没有很好地映射到官方的 Google Play 服务版本号。它已在GitHub 上记录为问题,他们已开始通过提供mappings 的表来解决此问题:

因此,为了获得 Google Play Service SDK 的工作版本,您必须使用大于 30.0.1.alpha4 的 Xamarin.GooglePlayServices 版本。

xamarin/GooglePlayServicesComponents 上还记录了一个问题,该问题已通过更新到最新的 Beta Nuget 包得到解决。

【讨论】:

看来我必须切换到 xamarin 播放服务库的 beta 版本。

以上是关于无法在我的 Xamarin MvvmCross Android 应用程序中注册推送“预计为虚拟类型”的主要内容,如果未能解决你的问题,请参考以下文章

在 Xamarin.Android 中通过 MVVMCross 绑定 OxyPlot

Xamarin iOS - MVVMCross:无法使用 ViewModel 中的命令连接自定义单元格中的按钮

在 Xamarin.Android 和 MvvmCross 中定义应用程序类的基类

Xamarin.IOS中MvvmCross的plugin使用方式

“Raw”Xamarin和MvvmCross

由于“缺少所需的图标文件”,无法分发 Xamarin iOS iPad 存档