Настройка доступности с помощью AFNetworking 2.0
Я пытаюсь настроить Reachability с помощью нового 2.0 AFNetworking.
В моем AppDelegate я инициализирую sharedManager.
// Instantiate Shared Manager
[AFNetworkReachabilityManager sharedManager];
Затем в соответствующем VC-методе я проверяю, есть ли isReachable:
// Double check with logging
if ([[AFNetworkReachabilityManager sharedManager] isReachable]) {
NSLog(@"IS REACHABILE");
} else {
NSLog(@"NOT REACHABLE");
}
В настоящее время это не работает, как ожидалось, в симуляторе, но я думаю, что это нужно будет тестировать на устройстве, а не на симуляторе.
Вопрос
То, что я хотел бы сделать, - следить за связностью внутри VC. Поэтому я запускаю следующее в viewDidLoad:
// Start monitoring the internet connection
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
Как мне зарегистрироваться для изменений? Что будет/будет вызываться после изменения сетевого подключения, я не вижу этого в документации.
Ответы
Ответ 1
Как вы можете прочитать в AFNetworking читать мне страницу
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
}];
Здесь также ссылка на официальную документацию.
Ответ 2
У меня есть одноэлементный класс AFHTTPRequestOperationManager. В singleton есть метод:
+(void)connectedCompletionBlock:(void(^)(BOOL connected))block {
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
BOOL con = NO;
NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
if (status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusReachableViaWiFi) {
con = YES;
}
if (block) {
[[AFNetworkReachabilityManager sharedManager] stopMonitoring];
block(con);
}
}];
}
Перед выполнением запроса вы вызываете этот метод, который возвращает блок, указывающий, доступен ли доступ в Интернет:
[TLPRequestManager connectedCompletionBlock:^(BOOL connected) {
if (connected) {
// Make a request
}else{
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Notice" message:@"Internet is not available." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
[alertView show];
}
}];
Ответ 3
Я просто пережил ваш вопрос и все ответы. После этого я решил сделать все это один раз. Таким образом, в моем существующем проекте я просто включил AFNetworking через cocoa -pods, и вот решение, которое полностью укусит меня.
Решение. Прежде всего AFNetworkReachabilityManager - это одноэлементный класс. Вам не нужно выполнять инициализацию AppDelegate для sharedManager.
//[AFNetworkReachabilityManager sharedManager];
#import <AFNetworkReachabilityManager.h>
- (void)viewDidLoad {
//Starting the network monitoring process
[[AFNetworkReachabilityManager sharedManager]startMonitoring];
//Checking the Internet connection...
[[AFNetworkReachabilityManager sharedManager]setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status){
if (status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusReachableViaWiFi) {
UIAlertView *alertNetFound = [[UIAlertView alloc]initWithTitle:@"Network Found" message:@"Please Wait Until It is loading" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alertNetFound show];
}else{
UIAlertView *alertNetNotFound = [[UIAlertView alloc]initWithTitle:@"No Internet" message:@"Please Check Your Internet Connection Honey" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alertNetNotFound show];
}
}];
Итак, в этом случае каждый раз, когда устройство подключается к сети, он сначала запускает процесс startMonitoring, после чего он каждый раз попадает в блок состояния и отображает предупреждение в соответствии со статусом.
Вы можете делать все согласно вашему выбору, заменив предупреждения в блоке состояния. Я использовал это для автоматической загрузки веб-страницы из локального хранилища, но я удалил этот код для простоты.
Он даже работает с моим симулятором и Mac mini..
Спасибо
Надеюсь, что это помогло.
Ответ 4
Я использую это в делете приложения →
func reachablityCode() {
AFNetworkReachabilityManager.sharedManager()
AFNetworkReachabilityManager.sharedManager().startMonitoring()
AFNetworkReachabilityManager.sharedManager().setReachabilityStatusChangeBlock({(status) in
let defaults = NSUserDefaults.standardUserDefaults()
if status == .NotReachable {
defaults.setBool(false, forKey:REACHABLE_KEY)
}
else {
defaults.setBool(false, forKey: REACHABLE_KEY)
}
defaults.synchronize()
})
}
И затем это в базовом файле →
func isReachable() -> Bool {
return NSUserDefaults.standardUserDefaults().boolForKey(REACHABLE_KEY)
}