2010-01-05 8 views

Répondre

1

Même si vous ne pouvez pas le déterminer en utilisant le SDK, vous pouvez exploiter votre connaissance des modèles actuels. Si vous vous limitez à l'iPhone 3G, iPhone 3GS et iPod Touch 2ème génération (je ne supporte pas personnellement les anciens iPhone edge ou iPod Touch 1ère génération), alors vous savez déjà que les modèles iPhone sont livrés avec une véritable unité AGPS génération peut utiliser - si et quand disponible - points chauds wifi géolocalisés. Vous pouvez alors utiliser la méthode suivante pour déterminer le modèle que vous exécutez sur:

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

La méthode renvoie @ « iPhone2,1 » pour le 3GS, @ « iPhone1,2 » pour la 3G et @ "iPod2, 1 "pour l'ipod touch 2ème génération; vous l'appelez comme suit

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

et l'utiliser comme suit:

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

Vous ne pouvez pas détecter le matériel, au moins pas par le SDK officiel. Vous pouvez, cependant, interagir avec avec elle (à savoir, obtenir des informations à partir de celui-ci) de votre application (via le cadre CoreLocation). Et cela fonctionne dans tous les appareils livrés depuis la sortie de l'iPhone OS 2.0 (même l'iPod touche sans un vrai GPS à l'intérieur).

1

Le meilleur que je trouve est de tirer parti du fait que CLLocation.verticalAccuracy sert uniquement pour les appareils équipés GPS. Bien sûr, cela signifie que la disponibilité GPS ne peut être déterminée qu'après la première mise à jour.

De la documentation d'Apple:

La détermination de la précision verticale nécessite un dispositif avec des capacités GPS . Ainsi, sur certains appareils iOS précédents, cette propriété contient toujours une valeur négative.

Mise à jour: Parfois, Core Localisation envoie des objets CLLocation avec verticalAccuracy = -1 sur un iPhone 4 ainsi. C'est probablement ce qui se passe quand aucune solution GPS n'est disponible et que Core Location recourt au positionnement cellulaire ou Wi-Fi. Donc, le fait que vous obtenez -1 ne signifie pas nécessairement que vous n'avez pas de GPS. Seulement si vous obtenez une valeur positive, vous savez à coup sûr, vous avez un GPS.

2

Afin d'éviter de demander des autorisations GPS juste pour savoir si le GPS existe ou non, j'utilise un petit truc. Puisque tous les appareils avec un vrai GPS ont aussi la 3G je vérifie juste si l'appareil a un opérateur de téléphone.

//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]; 

Bien sûr, cela peut ne pas être à 100% à l'épreuve du temps mais cela fonctionne bien à ce stade. Je l'utilise dans mon application Battery HD afin de cacher les estimations GPS, donc je ne veux évidemment pas demander à l'utilisateur des autorisations pour cela.

+0

Comment carrierName peut-il être plus court que 0? – bk138