如何使用MvvMCross在运行时检测平台?

时间:2014-03-02 00:26:51

标签: mvvmcross

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

理想情况下,我喜欢设备,操作系统,屏幕分辨率,方向等,但是现在我只适合操作系统

3 个答案:

答案 0 :(得分:6)

感觉很奇怪,但是我记不起有人曾经要求这个作为一个功能而且我认为没有人为它做过插件。

鉴于您未来的要求(屏幕资源,方向等),最简单的方法可能是在核心项目中定义一个接口:

 public enum OS
 {
    Droid, Touch, WinPhone, WinStore, Mac, Wpf
 }

 public IDetails
 {
     OS OS { get; }
     // whatever else you need
 }

然后,您可以在每个UI项目中注册此实现 - 例如在Setup for 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

答案 1 :(得分:1)

原来已经有一个项目了 - https://github.com/aritchie/acrmvvmcross Kudos Allan Ritchie!

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

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());

答案 2 :(得分:0)

ViewModel

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

查看创建(ViewDidLoad / OnCreate)

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