ti-enxame.com

Verificação de rede AF Disponibilidade

Eu implementei AFNetworking sem subclassificar AFHTTPClient, em parte usando o seguinte código no meu DownloadQueueManager:

-(void)downloadPodcastAt:(NSString *)url toPath:(NSString *)path
{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]
                                             cachePolicy:NSURLRequestReturnCacheDataElseLoad
                                         timeoutInterval:60.0];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        [self saveQueuedItemInformation];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {
        // Other stuff
    }];

    [operation start];
}

Minha pergunta é múltipla. Pesquisei até meus dedos ficarem dormentes e ainda não encontrei um exemplo de código decente que simples e facilmente verifique o status de acessibilidade usando AFNetworking. (Estranhamente, há muita discussão sobre a importação de SystemConfiguration.framework, que parece um acéfalo). Portanto, se meu usuário deseja minimizar o uso de dados e fazer o download apenas usando wifi, como faço para verificar se há wifi e fazer o download apenas se o wifi estiver disponível?

Segundo, parece que AFNetworking deseja ser um front-end fácil de usar. Mas, na verdade, eu poderia usar um front-end para esse front-end, porque há MUITO material por lá que é preciso percorrer para chegar ao que é necessário. Eu só preciso acessar um URL, baixar um arquivo xml (com base na acessibilidade) e fazer coisas com ele. Estou perdendo algo que torna isso uma tarefa simples?

Quando entendo isso, estou construindo totalmente um front-end ou cinco para simplificar a implementação (supondo que eu não seja apenas um idiota). Agradecemos antecipadamente a todas as respostas.

19
AMayes

Na verdade, ao contrário do que disse a A-Live Acessibilidade IS faz parte do AFNetworking. É implementado em AFHTTPClient.haqui . Você precisa das importações corretas em seu .pch arquivo conforme discutido aqui para usá-lo.

Para usá-lo, você provavelmente desejará ter uma subclasse de AFHTTPClient para poder usar setReachabilityStatusChangeBlock defined aqui . Aqui está um exemplo simples sem usar uma subclasse.

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://google.com"]];
[client setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    if (status == AFNetworkReachabilityStatusNotReachable) {
        // Not reachable
    } else {
        // Reachable
    }

    if (status == AFNetworkReachabilityStatusReachableViaWiFi) {
        // On wifi
    }
}];

Se você não gosta de como essa configuração de acessibilidade funciona, eu recomendaria Garfo de Tony Million da Acessibilidade da Apple. Exemplo simples:

Reachability *reach = [Reachability reachabilityWithHostname:@"google.com"];
if ([reach isReachable]) {
    // Reachable
    if ([reach isReachableViaWiFi]) {
        // On WiFi
    }
} else {
    // Isn't reachable

    [reach setReachableBlock:^(Reachability *reachblock)
    {
        // Now reachable
    }];

    [reach setUnreachableBlock:^(Reachability*reach)
    {
        // Now unreachable
    }];
}
45
Keith Smiley

Com AFNetworking 2.0 e superior, pode-se verificar a disponibilidade como esta,

    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    switch (status) {
        case AFNetworkReachabilityStatusUnknown:
        case AFNetworkReachabilityStatusReachableViaWWAN:
        case AFNetworkReachabilityStatusReachableViaWiFi:
            //available
            break;
        case AFNetworkReachabilityStatusNotReachable:
            //not available
            break;
        default:
            break;
    }

    NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));

}];

//start monitoring
[[AFNetworkReachabilityManager sharedManager] startMonitoring];

Para obter o status atual

[AFNetworkReachabilityManager sharedManager].reachable
20
Hemang

Apenas uma atualização, a versão mais recente do AFNetworking descontinuou o AFHTTPClient.

Você pode usar o AFHTTPRequestOperationManager.h

Algo pequeno retirado da própria página do github:

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url]; //url can be google.com or something you want to reach

NSOperationQueue *operationQueue = manager.operationQueue;
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)

{
    switch (status)
    {
        case AFNetworkReachabilityStatusReachableViaWWAN:
        case AFNetworkReachabilityStatusReachableViaWiFi:
        {
            NSLog(@"SO REACHABLE");
            [operationQueue setSuspended:NO]; // or do whatever you want
            break;
        }

        case AFNetworkReachabilityStatusNotReachable:
        default:
        {
            NSLog(@"SO UNREACHABLE");
            [operationQueue setSuspended:YES]; 
            //not reachable,inform user perhaps
            break;
        }
    }
}];
[manager.reachabilityManager startMonitoring];
8
Shawn Frank