Frage

Ich möchte wissen, wie GPS-Hardware in in Iphone zu erkennen oder nicht

War es hilfreich?

Lösung

Auch wenn Sie dies mit dem SDK nicht bestimmen können, können Sie Ihr Wissen über die aktuellen Modelle nutzen. Wenn Sie sich auf das iPhone 3G, iPhone 3GS und iPod Touch 2. Generation begrenzen (ich weiß nicht persönlich unterstützen ältere iPhone Rand oder iPod touch 1. Generation), dann wissen Sie bereits, dass das iPhone Modelle werden mit einem echten AGPS-Einheit während der iPod Touch 2nd Generation nutzen können - falls und wenn vorhanden - mit Geotags versehen wiFi Hot Spots. Anschließend können Sie die folgende Methode verwenden, das Modell zu bestimmen, Sie laufen auf:

- (NSString *) deviceModel{
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *answer = malloc(size);
    sysctlbyname("hw.machine", answer, &size, NULL, 0);
    NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding];
    free(answer);
    return results;
}

Die Methode gibt @ "iPhone2,1" für das 3GS, @ "iPhone1,2" für das 3G und @ "iPod2,1" für den iPod touch der 2. Generation; Sie nennen es wie folgt

NSString *deviceModel = [[self deviceModel] retain];

und verwenden Sie es wie folgt:

if([self.deviceModel isEqualToString:@"Pod2,1"]){
    // no real GPS unit available 
    // no camera available
    ...
}

Andere Tipps

Sie können nicht erkennen die Hardware, zumindest nicht über die offizielle SDK. Sie können jedoch interact mit ihm (nämlich aus ihm heraus bekommen Informationen) aus Ihrer Anwendung (über den Corelocation-Framework). Und das in jedem Gerät arbeitet seit der Veröffentlichung von iPhone OS ausgeliefert 2.0 (auch iPod touch ohne eine echten GPS innen).

Um für die GPS-Berechtigungen fragen zu vermeiden, nur um zu wissen, ob das GPS vorhanden ist, verwende ich einen kleinen Trick. Da alle Geräte mit einem echten GPS auch 3G habe ich überprüfen gerade, ob das Gerät einen Telefonbetreiber hat.

//Use classLoaders to avoid crashes on iPhone OS 3.x
id netInfo = [[NSClassFromString(@"CTTelephonyNetworkInfo") alloc] init];
if (netInfo) 
{
            id carrier = [netInfo subscriberCellularProvider];

            if ([[carrier carrierName] length] <=0)
            {
                    //NO operator=>NO 3G and no real GPS  
            }
}
[netInfo release];

Natürlich kann dies zu 100% nicht zukunftssicher, aber es funktioniert gut an dieser Stelle. Ich benutze es in meiner Batterie HD App, um GPS-Schätzungen zu verstecken, damit ich nicht offensichtlich will die Benutzer Berechtigungen für das fragen.

Das Beste, was ich gefunden ist, die Tatsache zu nutzen, dass CLLocation.verticalAccuracy nur für GPS-fähige Geräte eingestellt ist. Natürlich bedeutet dies, dass GPS-Verfügbarkeit erst nach der ersten Standortaktualisierung bestimmt werden kann.

Von Apples Dokumentation:

  

Die Bestimmung der vertikalen Genauigkeit   erfordert ein Gerät mit GPS   Fähigkeiten. So auf einige früher   iOS-basierte Geräte, diese Eigenschaft   enthält immer einen negativen Wert.

Update: Manchmal sendet Core-Location CLLocation Objekte mit verticalAccuracy = -1 auf einem iPhone 4 als auch. Wahrscheinlich ist es zu tun, dass, wenn kein GPS-Fix vorhanden und Core Location Resorts Zelle oder Wi-Fi-Positionierung. Die Tatsache, Sie bekommen -1 bedeutet nicht unbedingt, Sie nicht GPS haben. Nur wenn Sie einen positiven Wert bekommen Sie sicher wissen, haben Sie GPS haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top