web-dev-qa-db-fra.com

AFNetworking vérifiant la disponibilité

J'ai implémenté AFNetworking sans sous-classer AFHTTPClient, en utilisant en partie le code suivant dans mon 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];
}

Ma question est multiple. J'ai googlé jusqu'à ce que mes doigts soient engourdis et je n'ai pas encore trouvé d'échantillon de code décent qui vérifie simplement et facilement l'état de l'accessibilité à l'aide de AFNetworking. (Curieusement, il y a beaucoup de discussions sur l'importation de SystemConfiguration.framework, ce qui semble être une évidence). Donc, si mon utilisateur souhaite minimiser son utilisation des données et ne télécharger qu'en utilisant le wifi, comment puis-je vérifier le wifi et télécharger uniquement si le wifi est disponible?

Deuxièmement, il semble que AFNetworking veuille être un frontal convivial. Mais je pourrais en fait utiliser un front-end à ce front-end, car il y a BEAUCOUP de choses là-dedans que l'on doit parcourir pour arriver à ce dont on a besoin. J'ai juste besoin d'accéder à une URL, de télécharger un fichier xml (basé sur l'accessibilité) et de faire des choses avec. Suis-je en train de manquer quelque chose qui en fait une tâche simple?

Quand je comprends cela, je construis totalement un front-end ou cinq pour simplifier la mise en œuvre (en supposant que je ne suis pas seulement un idiot). Merci d'avance pour toutes les réponses.

19
AMayes

En fait contrairement à ce que A-Live a dit Accessibilité IS une partie de AFNetworking. Il est implémenté dans AFHTTPClient.hici . Vous avez besoin des importations correctes dans votre .pch fichier tel que discuté ici afin de l'utiliser.

Pour l'utiliser, vous voudrez probablement avoir une sous-classe de AFHTTPClient afin que vous puissiez utiliser setReachabilityStatusChangeBlock défini ici . Voici un exemple simple sans utiliser de sous-classe.

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
    }
}];

Si vous n'aimez pas le fonctionnement de cette configuration d'accessibilité, je recommanderais la fourchette de Tony Million de l'accessibilité d'Apple. Exemple simple:

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

Avec AFNetworking 2.0 et supérieur, on peut vérifier la disponibilité comme ceci,

    [[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];

Pour obtenir l'état actuel

[AFNetworkReachabilityManager sharedManager].reachable
20
Hemang

Juste une mise à jour, la nouvelle version d'AFNetworking a déprécié AFHTTPClient.

Vous pouvez utiliser AFHTTPRequestOperationManager.h à la place

Quelque chose de petit tiré de la page github elle-même:

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