2013-09-02 16 views
7

Korzystając z Xamarin.Android i Xamarin.iOS, potrzebuję obecnego systemu operacyjnego we wspólnej sekcji kodu. Czy to enum, int czy string, to nie ma znaczenia.Jak poznać aktualny system operacyjny/platformę kodu wykonawczego (Android/iOS)?

Próbowałem to:

System.Environment.OSVersion 

który jest zawsze "Unix" z niektórymi informacjami wersja jądra.

Istnieją informacji na Androida na przykład jak

Android.OS.Build.VERSION 

Ale to musi być w sekcji specyficzny kod Androida. Czy istnieje sposób na poznanie bieżącego systemu operacyjnego we wspólnej bibliotece?

+0

Mogę zapytać, co chcesz zrobić z tą informacją? –

+0

możliwy duplikat [Jak odzyskać wersję Androida SDK?] (Http://stackoverflow.com/questions/1882883/how-to-retrieve-the-android-sdk-version) – Andrei

+0

@Daniel: mój serwer (podając dane i usługi) musi wiedzieć "kto" wysyła żądanie (logowanie, powiadomienia push, niektóre dane dla interfejsu użytkownika ...) – Askolein

Odpowiedz

4

Używając odbicia, spróbuj odtworzyć wartość właściwości Monotouch.Version (i odpowiednik dla MfA: Android.OS.Build.VERSION). Jedno z połączeń zakończy się niepowodzeniem, drugie powinno się powieść; dlatego musisz użyć refleksji. To dla prawdziwego sprawdzenia czasu pracy.

Ale ponieważ twoja aplikacja jest kompilowana dwa razy, możesz naprawić tę wartość w czasie kompilacji.

#if MONOTOUCH 
    var platform = "iOS" 
#else 
    var platform = "Android" 
#endif 
+0

dzięki za te rozwiązania. Miałem nadzieję, że inny istnieje. To oznacza, że ​​musisz ręcznie obsługiwać każdą nową platformę (czyli okna). Naprawdę nie jest to istotna kwestia, ale wydaje mi się dziwne, że Xamarin nie świadczy suchej usługi w swoim API. – Askolein

+0

Korzystam z Xamarin iOS 9.6.2, Xamarin Android 6.0.4.0 i Xamarin Studio 5.10.3. Symbol MONOTOUCH nie istnieje. Ten #ifdef zawsze trafia do innego. Tak, ustawiając projekt iOS jako domyślny. Jakaś alternatywa? – jzeferino

5

Używam DeviceInfo wtyczki. Obsługuje Android, iOs, Windows Phone Silverlight, Windows Phone RT, Windows Store RT, Windows 10 UWP i działa idealnie.

To może być stosowany w PCL tak (trzeba dodać wtyczkę do projektów platformy i PCL):

var platform = CrossDeviceInfo.Current.Platform; 
    switch(platform){ 
     case Platform.iOS: 
      // iOS 
      break; 
     case Platform.Android: 
      // Android 
      break; 
    } 

Taki kod nie jest dobrą praktyką w PCL, że lepiej użyj Dependency Injection (ta wtyczka to wykorzystuje), aby dostosować zachowanie platformy.

3

Można również spróbować i jego prawdopodobnie najlepszym rozwiązaniem znalazłem:

if(Device.RuntimePlatform == Device.iOS) 
{ 
    //iOS stuff 
} 
else if(Device.RuntimePlatform == Device.Android) 
{ 

}