Проверка доступности iPhone

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

У меня в проекте есть reachability.h / m, я делаю

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

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

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

#import <SystemConfiguration/SystemConfiguration.h>

и

#import "Reachability.h"

настроить с помощью. Это моя наименее любимая часть программирования.  проблемы доступности
(источник: sneakyness.com)


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

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

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

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


person Sneakyness    schedule 07.12.2009    source источник
comment
каким образом он не делает то, что вы хотите? мы не можем сказать из этого кода здесь, что вы хотите или как это не работает. он не компилируется, не дает правильных результатов в некоторых ситуациях или что?   -  person David Maymudes    schedule 07.12.2009
comment
Я обновил вопрос, чтобы отразить мои проблемы. Извините за то, что не уточнил.   -  person Sneakyness    schedule 07.12.2009
comment
Оказывается, нам это все равно никогда не понадобилось! Они действительно говорят , что лучший код - это код, который вам никогда не придется писать!: D   -  person Sneakyness    schedule 18.12.2009


Ответы (5)


Судя по снимку экрана, похоже, что в ваш проект не добавлена ​​функция Reachability. Вы должны загрузить Reachability из Apple:

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

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

Обновление: вы отметили, что у вас есть доступность. Но глядя на самую последнюю версию, я могу понять, почему у вас есть перечисленные вами ошибки - они изменили 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"); }
}
person Kendall Helmstetter Gelner    schedule 07.12.2009
comment
Нет, я добавил и то, и другое, хотя стоит упомянуть об этом, чтобы проверить. Как мне включить их, чтобы я мог использовать их там, где они мне нужны? Это меня действительно расстраивает. - person Sneakyness; 08.12.2009
comment
в верхней части файла должен быть оператор импорта. import Reachability.h - person bpapa; 08.12.2009
comment
Я сделаю это! Я никогда не видел обновления этого на SO. Прошу прощения за то, что не вернулся быстрее. На самом деле мы закончили работу над приложением без этого, так что я, скорее всего, вернусь и поработаю с ним в эти выходные. Спасибо! - person Sneakyness; 12.12.2009
comment
Ответ @KendallHelmstetterGelner nikoz (ниже), похоже, работает. Действительно ли необходима асинхронная часть NSNotification? Спасибо! - person Dan Rosenstark; 28.06.2014
comment
Лучше поддерживать обратный вызов, если вам нужно проверять статус позже, чем каждый раз создавать новый объект Reachability, особенно если вы ищете доступность для определенного хоста, а не просто общее подключение к Интернету. - person Kendall Helmstetter Gelner; 02.07.2014
comment
Для моих собственных заметок, поскольку я постоянно возвращаюсь сюда: только что проверил файл readme.txt здесь (developer.apple.com/library/IOs/samplecode/Reachability/). Оказывается, он блокируется в синхронной форме, поэтому, хотя вам и не следует этого делать, можно обойтись без включения блока async;) - person Dan Rosenstark; 01.08.2014

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

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

Рафаэль

person Raphael Schaad    schedule 16.03.2010
comment
Тем не менее, следует указать на серьезную ловушку. Не все из нас являются экспертами по сетевым протоколам. - person Nicolas Miari; 25.06.2012
comment
Это меня тоже достало. Спасибо @RaphaelSchaad - person Ray Hunter; 02.05.2015

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

[[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"); }
person nikoz    schedule 15.08.2010
comment
Это верно. Если вы сделаете это таким образом, он заблокирует основной поток, поэтому вам не нужна асинхронная версия. - person Dan Rosenstark; 01.08.2014

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

[reachability startNotifier];

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

person Kevlar    schedule 07.12.2009
comment
нужно ли вам это делать, даже если вы просто запрашиваете немедленный статус, как в приведенном выше коде, а не ждете уведомления? - person David Maymudes; 07.12.2009
comment
я так считаю; Я могу ошибаться, но код достижимости Apple в основном работает в отдельном потоке, который проверяет достижимость с заданным интервалом, как я полагаю, и вам нужно запустить этот процесс, прежде чем он сможет сообщить вам статус. - person Kevlar; 07.12.2009
comment
Вы НЕ МОЖЕТЕ запросить немедленный статус. Reachability работает, когда вы пытаетесь установить соединение, а затем Reachability начинает выдавать уведомления о состоянии. Самое близкое, что вы можете сделать, - это попробовать какой-нибудь небольшой URL-адрес, который, как вы знаете, существует, и затем дождаться уведомлений. Apple очень недвусмысленно заявила на WWDC, что это способ обеспечить доступность. - person Kendall Helmstetter Gelner; 07.12.2009
comment
Кроме того, я не использовал [reachability startNotifier] в своем коде, но я вижу обновления Reachability (из кода Apple). - person Kendall Helmstetter Gelner; 07.12.2009
comment
Вместе с Кендаллом вы должны следовать образцу Apple Reachability (убедитесь, что вы используете последнюю версию, которая, как мне кажется, 2.0) до T. Это включает в себя асинхронную проверку достижимости. Если вы сделаете это синхронно и не получите отказ Apple, ваше приложение БУДЕТ время от времени давать сбой, как только оно окажется в свободном доступе. - person bpapa; 07.12.2009
comment
Это ничего не дало мне. Не разбиться и не получить отказ - мои приоритеты. Спасибо за информацию, ребята. - person Sneakyness; 07.12.2009
comment
ReadMe.txt демонстрации Reachability предупреждает только о синхронной проверке достижимости hostName: вы можете использовать API синхронно, но не выполнять синхронную проверку hostName в основном потоке. Если устройство не может связаться с DNS-сервером или находится в медленной сети, синхронный вызов функции SCNetworkReachabilityGetFlags может заблокировать до 30 секунд, пытаясь разрешить hostName. Если это произойдет в основном потоке, сторожевой таймер приложения завершит работу приложения через 20 секунд бездействия. - person ohhorob; 08.12.2009

изменить это

reachability = [Reachability reachabilityForInternetConnection];

к этому

reachability = [[Reachability reachabilityForInternetConnection] retain];
person mhrrt    schedule 11.02.2012