Meine iPhone-App (http://hexalex.com) ist nicht universell, aber sie verfügt über eine Funktion, die ich für Nutzer aktivieren möchte, die auf iPads spielen. Gibt es eine Möglichkeit zu erkennen, dass Sie auf einem iPad im Kompatibilitätsmodus laufen? Die UIDevice-Methoden zum Erkennen von Maschinenspezifikationen geben alle die Werte zurück, die Sie auf einem iPhone erhalten würden (zumindest auf dem Simulator). Das einzige, was mir einfällt, ist das Erkennen von OS 3.2, aber diese Technik wird nicht lange funktionieren.Ermitteln der iPhone-App auf dem iPad im Kompatibilitätsmodus
Antwort
beantwortet Ursprünglich hier: https://stackoverflow.com/a/14864400/577237
Reposted, da es so kurz ist:
Wenn die App ein iPhone App ist im Emulator-Modus auf einem iPad läuft, wird es eine userInterfaceIdiom von Telefon, aber ein Modelltyp von iPad. Sie können dies mit dem folgenden Code überprüfen:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone &&
[[[UIDevice currentDevice] model] hasPrefix:@"iPad"]) {
// This app is an iPhone app running on an iPad
}
Ihr Code ist falsch. UI_USER_INTERFACE_IDIOM() ist identisch mit ipad für iPhone App auf dem iPad. – SpaceDog
@RubberDuck Ich muss Ihrer Einschätzung nicht zustimmen. Ich habe eine Test-App erstellt, um diese Funktionalität zu testen: https://github.com/michaelpatzer/TestEmulationMode –
das ist seltsam, weil auf Ihrer App das Verhalten erwartet wird, aber in zwei Apps von mir sehe ich iPad als die Idiom! WTF !!!! – SpaceDog
1) Verwenden Sie UIDevice-Erweiterung geschrieben von Erica Sadun. Eine sehr umfangreiche Klasse: http://github.com/erica/uidevice-extension/blob/master/UIDevice-Hardware.m
2) Oder Sie könnten auch die Methode UIDevice Klasse verwenden:
[[UIDevice currentDevice] name] // eg. "Brock's iPhone"
[[UIDevice currentDevice] model] // eg. @"iPhone", @"iPod Touch"
[[UIDevice currentDevice] localizedModel] // localized version of model
[[UIDevice currentDevice] systemName] // eg. @"iPhone OS"
[[UIDevice currentDevice] systemVersion] // eg. @"3.2"
[[UIDevice currentDevice] uniqueIdentifier] // UDID, a unique string to identify the device
Jede der oben genannten Linien wird eine NSString
zurück. Welchem können Sie ein String-Vergleich wie so tun:
NSString *model = [[UIDevice currentDevice] model];
NSLog(@"Current device model: \"%@\"", model);
3) Ein anderer Weg:
http://www.drobnik.com/touch/2009/07/determining-the-hardware-model/ Sie müssen dies ändern, um die richtige Hardware-Nummer für das iPad zu verwenden. Entnommen aus den obigen Link:
UIDevice-hardware.h
#import
#define IPHONE_1G_NAMESTRING @"iPhone 1G"
#define IPHONE_3G_NAMESTRING @"iPhone 3G"
#define IPHONE_3GS_NAMESTRING @"iPhone 3GS"
#define IPOD_1G_NAMESTRING @"iPod touch 1G"
#define IPOD_2G_NAMESTRING @"iPod touch 2G"
@interface UIDevice (Hardware)
- (NSString *) platform;
- (NSString *) platformString;
@end
UIDevice-hardware.m
#import "UIDevice-hardware.h"
#include <sys/types.h>
#include <sys/sysctl.h>
@implementation UIDevice (Hardware)
/*
Platforms
iPhone1,1 = iPhone 1G
iPhone1,2 = iPhone 3G
iPhone2,1 = iPhone 3GS
iPod1,1 = iPod touch 1G
iPod2,1 = iPod touch 2G
*/
- (NSString *) platform
{
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *platform = [NSString stringWithCString:machine];
free(machine);
return platform;
}
- (NSString *) platformString
{
NSString *platform = [self platform];
if ([platform isEqualToString:@"iPhone1,1"]) return IPHONE_1G_NAMESTRING;
if ([platform isEqualToString:@"iPhone1,2"]) return IPHONE_3G_NAMESTRING;
if ([platform isEqualToString:@"iPhone2,1"]) return IPHONE_3GS_NAMESTRING;
if ([platform isEqualToString:@"iPod1,1"]) return IPOD_1G_NAMESTRING;
if ([platform isEqualToString:@"iPod2,1"]) return IPOD_2G_NAMESTRING;
return NULL;
}
@end
Ich habe kein iPad zum Testen, aber im iPad Simulator' [[UIDevice currentDevice] Modell] 'gibt' iPhone Simulator' zurück, nicht 'iPad Simulator'. Ich nehme an, dass es "iPhone" anstelle von "iPad" zurückgibt, wenn es auf dem Gerät läuft. Es ist eine emulierte iPhone-Umgebung, also ist das keine Überraschung. Die 'hw.machine' sysctl ist ein interessanter Vorschlag, aber auf dem iPad-Simulator gibt es nur' i386' zurück. Weißt du, was es auf dem iPad zurückgibt, wenn es eine nicht-universelle iPhone App ausführt? – n8gray
Sie sollten dies nicht am Simulator testen müssen. Sie brauchen ein echtes Gerät, sonst wie können Sie wissen, was in der Feldumgebung passiert? –
Haben Sie den "UIDevice.h" überprüfen? Es hat Modelleigenschaft, die Sie die iPhone, iPod, iPad-Geräte finden können
NSString * Name; // z.B. "Mein iPhone"
NSString * -Modell; // z.B. @ "iPhone", @ "iPod Touch"
NSString * lokalisiertesModell; // lokalisierte Version des Modells
NSString * systemName; // z.B. @ "iPhone OS"
NSString * systemVersion; // z.B. @ "2.0"
NSString * uniqueIdentifier; (DEPRECATED) // a Zeichenfolge eindeutig für jedes Gerät basierend auf verschiedene Hardware-Informationen.
Ich habe kein iPad zum Testen, aber im iPad Simulator '[[UIDevice currentDevice] Modell]' gibt 'iPhone Simulator' zurück, nicht' iPad Simulator'. – n8gray
Ich drucke [[UIDevice currentDevice] Modell] und es gab mir "iPad" :) –
@ n8gray: Ja Simulator ist begrenzt. funktioniert nur auf iOS-Geräten. –
- 1. Webbrowser läuft im Kompatibilitätsmodus
- 2. UIPopoverPresentationController auf dem iPad
- 3. Ermitteln der Internetverfügbarkeit auf dem iPhone?
- 4. HTML5-Videosuche auf dem iPad
- 5. CSS-Medienabfragen auf dem iPad 3 (oder dem neuen iPad)
- 6. Ermitteln der Sommerzeit auf dem Sql-Server
- 7. Wie führe ich Java im Kompatibilitätsmodus aus?
- 8. AudioServicesPlaySystemSound Volume auf dem iPad
- 9. CGBitmapContextCreate auf dem iPhone/iPad
- 10. SASS auf dem iPad kompilieren?
- 11. TortoiseSVN Kompatibilitätsmodus
- 12. css3 funktioniert nicht im Kompatibilitätsmodus, keine Alternative?
- 13. Langsame Reaktion auf Klickereignis auf dem iPad
- 14. CSS Hintergrundbilder nicht auf dem ipad
- 15. Responsive Design funktioniert auf dem Ipad in Inspect Element, aber nicht auf der tatsächlichen Ipad-Ansicht?
- 16. MPMediaPickerController fehlende Suchfunktionalität auf dem iPad
- 17. Fullscreen für Swift Playgrounds auf dem iPad
- 18. Private API für Tethering auf dem iPad
- 19. Jquery iScroll nicht Scrollen auf dem iPad
- 20. Wird ein Programm im Kompatibilitätsmodus ausgeführt?
- 21. Funktioniert gut auf dem iPhone, aber stürzt auf dem iPad
- 22. Tab-Leiste auf dem iPhone, aber nicht auf dem iPad
- 23. Feste Hintergrundbilder verschwinden auf dem iPhone/iPad
- 24. Starten der Anwendung im Querformat für IPad
- 25. Erstellen niedriger Speicherbedingungen auf dem IPad-Gerät
- 26. Höhe und Breite auf dem iPhone (/ iPad)
- 27. Z-Index-Probleme auf dem iPad
- 28. Geteilte Bildersammlung auf dem iPad (Deep Zoom)
- 29. JSON.parse funktioniert nicht auf dem iPad Safari
- 30. CGAffineTransformMakeRotation() skaliert das Bild auf dem iPad?
Was meinen Sie mit "Kompatibilität" Modus? Dies ist iOS, nicht Windows XP. –
Wenn Sie eine nicht universelle iPhone-App auf einem iPad ausführen, wird sie in einer emulierten iPhone-Umgebung ausgeführt. Sie müssen mich dafür entschuldigen, dass ich den genauen Begriff dafür nicht kenne. – n8gray
Ja. iPhone Apps laufen auf dem iPad. In diesem Fall wissen Sie bereits, dass Sie eine iPhone-App erstellt haben, Sie müssen nur überprüfen, ob Ihr auf dem iPad läuft, siehe meine Antwort. –