39

J'ai trouvé plusieurs exemples de code pour faire ce que je veux (vérifier l'accessibilité), mais rien de tout cela ne semble être assez précis pour me servir. Je n'arrive pas à comprendre pourquoi cela ne veut pas jouer sympa.Vérification de l'accessibilité de l'iPhone

je le reachability.h/m dans mon projet, je fais

#import <SystemConfiguration/SystemConfiguration.h> 

Et je le cadre ajouté. J'ai aussi:

#import "Reachability.h" 

au sommet du .m dans lequel je suis en train d'utiliser la joignabilité.

Reachability* reachability = [Reachability sharedReachability]; 
[reachability setHostName:@"http://www.google.com"]; // set your host name here 
NetworkStatus remoteHostStatus = [reachability remoteHostStatus]; 

if(remoteHostStatus == NotReachable) {NSLog(@"no");} 
else if (remoteHostStatus == ReachableViaWiFiNetwork) {NSLog(@"wifi"); } 
else if (remoteHostStatus == ReachableViaCarrierDataNetwork) {NSLog(@"cell"); } 

Cela me donne toutes sortes de problèmes. Qu'est-ce que je fais mal? Je suis un bon codeur, j'ai juste du mal quand vient le temps de comprendre ce qui doit être mis là où je veux activer ce que je veux faire, peu importe si je veux savoir ce que je veux faire ou non. (Si frustrant)

Mise à jour: C'est ce qui se passe. Ceci est dans mon viewcontroller, que j'ai l'

#import <SystemConfiguration/SystemConfiguration.h> 

et

#import "Reachability.h" 

mis en place avec. C'est ma partie la moins préférée de la programmation de loin. reachability problems http://sneakyness.com/reachability.png


FWIW, on n'a jamais fini par mettre en œuvre ce dans notre code. Les deux caractéristiques qui nécessitaient un accès à Internet (participer au tirage au sort et acheter le DVD) n'étaient pas des caractéristiques principales. Rien d'autre requis l'accès à Internet. Au lieu d'ajouter plus de code, nous avons simplement défini l'arrière-plan des deux vues Internet sur un avis indiquant aux utilisateurs qu'ils doivent être connectés à Internet pour utiliser cette fonctionnalité. Il était en thème avec le reste de l'interface de l'application, et a été bien fait/avec goût. Ils n'ont rien dit à ce sujet pendant le processus d'approbation, mais nous avons reçu un appel téléphonique personnel pour vérifier que nous distribuions des articles qui appartenaient au film. Selon leur accord généralement vague, vous n'êtes pas autorisé à avoir des sweepstakes autrement.

Je pense aussi que ceci adhère plus strictement à leur idée de «seulement utiliser les choses si vous en avez absolument besoin».

Here's the iTunes link to the application, EvoScanner.

+1

de quelle manière est-il pas faire ce que vous voulez? nous ne pouvons pas dire à partir de ce code ici ce que vous voulez ou comment cela ne fonctionne pas. ne compile-t-il pas, ne produit-il pas les bons résultats dans certaines situations, ou quoi? –

+0

J'ai mis à jour la question pour refléter mes problèmes. Désolé de ne pas être plus précis. – Sneakyness

+2

Il s'avère que nous n'en avons jamais eu besoin de toute façon! Ils disent ** que le meilleur code est le code que vous n'avez jamais à écrire! **: D – Sneakyness

Répondre

65

De votre capture d'écran, il semble que vous n'ayez pas ajouté Reachability à votre projet. Vous devez télécharger joignabilité d'Apple:

https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html

Et ajouter à la fois des fichiers .h .m à votre projet.

Mise à jour: Vous avez noté que vous avez l'accessibilité.Mais en regardant la version la plus récente, je peux voir pourquoi vous avez les erreurs que vous avez énumérées - ils ont changé l'API et vous utilisez probablement un exemple de code que vous avez trouvé ailleurs. Essayez:

dans le fichier .h:

//import Reachability class 
#import "Reachability.h" 

// declare Reachability, you no longer have a singleton but manage instances 
Reachability* reachability; 

dans le fichier .m:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNetworkChange:) name:kReachabilityChangedNotification object:nil]; 

reachability = [Reachability reachabilityForInternetConnection]; 
[reachability startNotifier]; 

NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 

if(remoteHostStatus == NotReachable) {NSLog(@"no");} 
else if (remoteHostStatus == ReachableViaWiFi) {NSLog(@"wifi"); } 
else if (remoteHostStatus == ReachableViaWWAN) {NSLog(@"cell"); } 

..... 

- (void) handleNetworkChange:(NSNotification *)notice 
{ 

    NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 

    if(remoteHostStatus == NotReachable) {NSLog(@"no");} 
else if (remoteHostStatus == ReachableViaWiFi) {NSLog(@"wifi"); } 
else if (remoteHostStatus == ReachableViaWWAN) {NSLog(@"cell"); } 
} 
+0

Non, j'ai les deux ajouté, mais c'est une bonne chose à mentionner. Comment les inclure afin que je puisse les utiliser là où j'en ai besoin? Cela me déprime vraiment. – Sneakyness

+1

vous devez avoir une déclaration d'importation en haut de votre fichier. import Accessibilité.h – bpapa

+0

Mis à jour avec de nouvelles données, s'il vous plaît relire la réponse –

3

Avez-vous n'importe où le code suivant?

[reachability startNotifier]; 

si votre code est joignabilité de l'exemple de la pomme, alors vous devez le faire avant de pouvoir commencer à vous rapports des mises à jour de statut.

+0

avez-vous besoin de faire cela même si vous ne faites qu'interroger le statut immédiat comme le code ci-dessus plutôt que d'attendre une notification? –

+0

je le crois; Je peux me tromper, mais le code d'accessibilité d'Apple fonctionne essentiellement dans un thread séparé qui vérifie l'accessibilité sur un intervalle défini, et vous devez démarrer ce processus avant de pouvoir vous renvoyer le statut. – Kevlar

+1

Vous NE POUVEZ PAS interroger le statut immédiat. L'accessibilité fonctionne lorsque vous tentez d'établir une connexion, puis Reachability commence à émettre des notifications d'état. Le plus proche que vous pouvez faire est d'essayer quelques résultats de petite URL que vous savez que vous existez, puis attendez les notifications. Apple a été très explicite à WWDC que c'est la façon de faire l'accessibilité. –

28
[reachability setHostName:@"http://www.google.com"]; 

Attention! J'ai rencontré le problème que c'est toujours "NotReachable" si le préfixe http: // est utilisé.

Raphael

+28

Attention! http: // ne fait pas partie du nom d'hôte. – Sneakyness

+8

Voilà ce que je signale. –

+20

Encore, un piège valide à signaler. Nous ne sommes pas tous des experts en protocole réseau. –

7

est ici le bon code comme ça marche pour moi aujourd'hui !!!

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleNetworkChange:) name: kReachabilityChangedNotification object: nil]; 

reachability = [Reachability reachabilityForInternetConnection]; 

[reachability startNotifier]; 

NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 

if(remoteHostStatus == NotReachable) {NSLog(@"no");} 
else if (remoteHostStatus == ReachableViaWiFi) {NSLog(@"wifi"); } 
else if (remoteHostStatus == ReachableViaWWAN) {NSLog(@"cell"); } 
+0

Ceci est correct. Si vous le faites de cette façon, il bloquera le thread principal, vous n'avez donc pas besoin de la version asynchrone. –

-3

changer cette

reachability = [Reachability reachabilityForInternetConnection]; 

à cette

reachability = [[Reachability reachabilityForInternetConnection] retain];