【问题标题】:How can I detect the platform at runtime using MvvMCross?如何使用 MvvMCross 在运行时检测平台?
【发布时间】:2018-02-09 04:04:13
【问题描述】:

我希望用户能够将有关我的应用的反馈发送到某个地址。使用电子邮件插件,这一切都很好,但是在电子邮件的正文中,我想预先填充一些关于他们正在运行的应用程序的信息。

理想情况下,我想要设备、操作系统、屏幕分辨率、方向等,但现在我只满足于操作系统

【问题讨论】:

    标签: mvvmcross


    【解决方案1】:

    感觉很奇怪,但我不记得有人曾要求将此作为一项功能,而且我认为也没有人为它制作插件。

    考虑到您未来的需求(屏幕分辨率、方向等),最简单的方法可能是在您的核心项目中定义一个界面:

     public enum OS
     {
        Droid, Touch, WinPhone, WinStore, Mac, Wpf
     }
    
     public IDetails
     {
         OS OS { get; }
         // whatever else you need
     }
    

    然后您可以在每个 UI 项目中为此注册实现 - 例如在Setup 中为 WinPhone 添加:

     protected override void InitializeLastChance()
     {
         base. Setup.InitializeLastChance();
         Mvx.RegisterSingleton<IDetails>(new WindowsPhoneDetails());
     }
    

    地点:

     public class WindowsPhoneDetails : IDetails
     {
         public OS OS { get { return OS.WinPhone; } }
     }
    

    有关此方法的更多信息,请参阅https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup#wiki-registering-platform-specific-business-objects-in-setupinitializefirstchance-and-setupinitializelastchance

    (具体屏幕尺寸,另见https://github.com/MvvmCross/MvvmCross-Tutorials/tree/master/FractalGen中的IDisplayDimensionsService

    【讨论】:

    • 我已经实现了这个 - 哪里是分享它的最佳位置。作为一个 MvvMCross 菜鸟,我不确定礼仪。
    【解决方案2】:

    原来已经有一个项目可以做到这一点 - https://github.com/aritchie/acrmvvmcross 向艾伦·里奇致敬!

    不幸的是,没有 Windows Phone 实现 et,所以我实现了 sme 的功能如下:

    public class WindowsPhoneDeviceInfoService : IDeviceInfoService
    {
        public bool IsFrontCameraAvailable
        {
            get { throw new NotImplementedException(); }
        }
    
        public bool IsRearCameraAvailable
        {
            get { throw new NotImplementedException(); }
        }
    
        public bool IsSimulator
        {
            get { throw new NotImplementedException(); }
        }
    
        public string Manufacturer
        {
            get { return DeviceStatus.DeviceManufacturer; }
        }
    
        public string Model
        {
            get { return DeviceStatus.DeviceName; }
        }
    
        public string OperatingSystem
        {
            get { return Environment.OSVersion.Version.ToString(); }
        }
    
        public int ScreenHeight
        {
            get 
            {
                object szo;
                if (DeviceExtendedProperties.TryGetValue("PhysicalScreenResolution", out szo))
                {
                    Size sz = (Size)szo;
                    if (sz == null)
                        return 0;
                    return (int)sz.Height;
                }
                else
                {
                    return 0;
                }
            }
        }
    
        public int ScreenWidth
        {
            get
            {
                object szo;
                if (DeviceExtendedProperties.TryGetValue("PhysicalScreenResolution", out szo))
                {
                    Size sz = (Size)szo;
                    if (sz == null)
                        return 0;
                    return (int)sz.Width;
                }
                else
                {
                    return 0;
                }
            }
        }
    }
    

    当然,我还得在 setup.cs 中注册类:

    Mvx.RegisterSingleton<IDeviceInfoService>(new WindowsPhoneDeviceInfoService());
    

    【讨论】:

      【解决方案3】:

      在您的 ViewModel 中:

      private string _os;
      public string Os
      {
          get { return _os; }
          set { SetProperty(ref _os, value); }
      }
      

      查看创建(ViewDidLoad/OnCreate)

      ViewModel.Os = "iOS"; or ViewModel.Os = "Android";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-19
        • 2010-09-25
        • 2013-05-17
        • 2015-05-18
        • 2010-10-03
        • 2011-06-28
        相关资源
        最近更新 更多