2010-10-04 7 views
2

locationServicesEnabled est passé d'une propriété à une méthode.locationServicesEnabled pour iOS 3 et iOS 4

C'est dépréciée:

CLLocationManager *manager = [[CLLocationManager alloc] init]; 
if (manager.locationServicesEnabled == NO) { 
    // ... 
} 

Maintenant, je dois utiliser:

if (![CLLocationManager locationServicesEnabled]) { 
    // ... 
} 

Je veux soutenir iOS 3 et iOS 4 appareils. Comment puis-je vérifier cela sur les appareils iOS 3 et se débarrasser de l'avertissement obsolète?

Répondre

1

Essayez:

BOOL locationServicesEnabled; 
CLLocationManager locationManager = [CLLocationManager new]; 
if([locationManager respondsToSelector:@selector(locationServicesEnabled) ]) 
{ 
    locationServicesEnabled = [locationManager locationServicesEnabled]; 
} 
else 
{ 
    locationServicesEnabled = locationManager.locationServicesEnabled; 
} 

En tant que solution/travail autour. L'utilisation des définitions du compilateur vous posera des problèmes lors de l'utilisation de la cible de déploiement minimale pour permettre aux anciennes versions du système d'exploitation d'accéder à votre application.

+0

J'ai essayé votre approche, mais 'locationServicesEnabled' est toujours OUI si les services de localisation généraux sont activés ou non. J'ai vérifié l'autre approche et il n'obtient jamais ici #if __IPHONE_OS_VERSION_MIN_REQUIRED> __IPHONE_3_1' (testé sur iPod Touch 2G avec iOS 4.1) Il semble que vous ayez raison avec la cible de déploiement minimum. – testing

+0

Maintenant, j'ai testé avec l'iPad, mais l'iPad frappe également la méthode et non la propriété. – testing

+0

Le SDK de base est 4.1 et la cible de déploiement est 3.0 – testing

2

editted:

#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_3_1 
    #if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_3_2 
    if (![CLLocationManager locationServicesEnabled]) { 
    // ... 
    } 
    #else 
    CLLocationManager *manager = [[CLLocationManager alloc] init]; 
    if (manager.locationServicesEnabled == NO) { 
     // ... 
    } 
    #endif 
#else 
CLLocationManager *manager = [[CLLocationManager alloc] init]; 
if (manager.locationServicesEnabled == NO) { 
    // ... 
} 
#endif 
+0

Merci. Pourquoi iOS 3.1? – testing

+0

Ah, parce que quand je construis mon application, nous utilisons habituellement 3.1.3, ce qui signifie que nous pouvons reconnaître la constante __IPHONE_3_1 mais parce que 3.1.3 sera égal à 3.1, donc il ira à la branche else. La raison est également 3.1.3 est le plus haut sdk de l'iphone avant 4.0 (3.2 est seulement pour l'ipad) – vodkhang

+0

Ce qui serait si l'application fonctionnerait sur un iPad? – testing

5

Comme la propriété 'locationServicesEnabled' est simplement obsolète, elle est toujours disponible pour une utilisation (pour une durée indéterminée). Pour gérer la situation de manière dynamique, vous devez fournir une solution défensive. Semblable à la solution ci-dessus, je:

BOOL locationAccessAllowed = NO ; 
if([CLLocationManager instancesRespondToSelector:@selector(locationServicesEnabled)]) 
{ 
    // iOS 3.x and earlier 
    locationAccessAllowed = locationManager.locationServicesEnabled ; 
} 
else if([CLLocationManager respondsToSelector:@selector(locationServicesEnabled)]) 
{ 
    // iOS 4.x 
    locationAccessAllowed = [CLLocationManager locationServicesEnabled] ; 
} 

L'appel à des contrôles « instancesRespondToSelector » pour voir si la propriété est toujours disponible, alors je revérifier que la classe elle-même prend en charge l'appel de méthode (étant une méthode statique il rapportera OUI).

Juste une autre option.

Questions connexes