проверка доступности iPhone - PullRequest
40 голосов
/ 07 декабря 2009

Я нашел несколько примеров кода, который делает то, что я хочу (проверка доступности), но ни один из них не кажется достаточно точным, чтобы быть полезным для меня. Я не могу понять, почему это не хочет играть хорошо.

У меня есть достижимость. Ч / м в моем проекте, я делаю

#import <SystemConfiguration/SystemConfiguration.h>

И у меня есть рамки, добавленные. У меня также есть:

#import "Reachability.h"

в верхней части .m, в котором я пытаюсь использовать достижимость.

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"); }

Это вызывает у меня всевозможные проблемы. Что я делаю неправильно? Я - хороший программист, мне просто трудно найти время, чтобы понять, что нужно сделать, чтобы включить то, что я хочу сделать, независимо от того, хочу ли я знать, что я хочу делать или нет. (Так расстраивает)

Обновление: это то, что происходит. Это в моем viewcontroller, который у меня есть

#import <SystemConfiguration/SystemConfiguration.h>

и

#import "Reachability.h"

с настройкой. Это моя самая нелюбимая часть программирования на сегодняшний день. reachability problems
(источник: sneakyness.com )


FWIW, мы никогда не реализовывали это в нашем коде. Две функции, которые требовали доступа в Интернет (вход в лотерею и покупка DVD), не были основными. Больше ничего не требуется доступ в интернет.

Вместо того, чтобы добавлять больше кода, мы просто устанавливаем фон обоих представлений в Интернете, чтобы уведомить пользователей, что они должны быть подключены к Интернету, чтобы использовать эту функцию. Это было в теме с остальным интерфейсом приложения, и было сделано хорошо / со вкусом. Они ничего не сказали об этом во время процесса одобрения, однако мы получили личный телефонный звонок, чтобы убедиться, что мы раздавали вещи, которые действительно имели отношение к фильму. Согласно их обычно расплывчатому соглашению, вам не разрешается проводить лотереи в противном случае.

Я бы также подумал, что это более строго придерживается их идеологии "используй вещи, только если они тебе абсолютно необходимы".

Вот ссылка iTunes на приложение, EvoScanner.

Ответы [ 5 ]

66 голосов
/ 08 декабря 2009

С вашего скриншота кажется, что вы не добавили Reachability в свой проект. Вы должны загрузить Reachability from Apple:

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

И добавьте файлы .h и .m в ваш проект.

Обновление: вы отметили, что у вас есть Reachability. Но, глядя на самую последнюю версию, я могу понять, почему у вас есть ошибки, которые вы перечислили - они изменили API, и вы, вероятно, используете пример кода, который вы нашли в другом месте. Попробуйте:

в .h файле:

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

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

в .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"); }
}
28 голосов
/ 16 марта 2010
[reachability setHostName:@"http://www.google.com"];

Внимание! Я столкнулся с проблемой, что это всегда "NotReachable", если префикс http: //.

Raphael

7 голосов
/ 15 августа 2010

Вот правильный код, как он работает у меня сегодня !!!

[[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"); }
3 голосов
/ 07 декабря 2009

У вас есть где-нибудь код?

[reachability startNotifier];

если ваш код доступности взят из примера Apple, то вам нужно сделать это, прежде чем он сможет начать сообщать вам об обновлениях статуса.

0 голосов
/ 11 февраля 2012

изменить это

reachability = [Reachability reachabilityForInternetConnection];

к этому

reachability = [[Reachability reachabilityForInternetConnection] retain];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...