Необходимо определить, когда приложение не может подключиться к серверу при загрузке документа JSON в iOS.

Я загружаю документ JSON из своего приложения на сервер в Интернете, и я могу сделать это успешно. Однако сейчас мне нужно определить, когда нет подключения к Wi-Fi или 3G, и предложить пользователю предупреждение, которое информирует пользователя о том, что приложение не может подключиться, а затем дать им возможность сохранить документ JSON как файл .plist локально.

Вот код, который у меня есть до сих пор:

Это мой метод, который загружает мой документ JSON на сервер:

- (void) sendJsonDoc:(NSString *)jDoc {

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://myWebsite.php"]];

    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-type"];

    [request setValue:[NSString stringWithFormat:@"%d", [jDoc length]] forHTTPHeaderField:@"Content-length"];

    [request setHTTPBody:[jDoc dataUsingEncoding:NSUTF8StringEncoding]];

    [NSURLConnection connectionWithRequest:request delegate:self];

}




- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    int code = [httpResponse statusCode];
    NSLog(@"%d", code);

}

Вот код, который у меня есть для локального сохранения документа JSON в виде файла plist:

NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    path = [path stringByAppendingPathComponent:@"jsonDoc.plist"];

    // If the file doesn't exist in the Documents Folder, copy it.
    NSFileManager *fileManager = [NSFileManager defaultManager];

    if (![fileManager fileExistsAtPath:path]) {
        NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"jsonDoc" ofType:@"plist"];
        [fileManager copyItemAtPath:sourcePath toPath:path error:nil];
    }

    // Load the Property List.
    NSString *loadJSON = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

Как определить в моем методе sendJsonDoc отсутствие соединения и выдать пользователю предупреждение об отсутствии соединения и о том, хотят ли они сохранить документ локально?


person syedfa    schedule 30.12.2012    source источник
comment
В дополнение к проверке достижимости, предложенной PaReeOhNos, вам также потребуется обрабатывать все ошибки из NSURLConnection, поскольку сетевое подключение может быть потеряно в середине передачи.   -  person Codo    schedule 30.12.2012
comment
У вас есть ссылка на страницу, которая показывает, как обрабатывать эти ошибки? Сколько ошибок нужно обрабатывать, кроме 404?   -  person syedfa    schedule 30.12.2012
comment
Вам нужно реализовать connection:didReceiveResponse: и проверить код состояния (NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response; if (httpResponse.statusCode != 200) ...). И вам нужно будет реализовать connection:didFailWithError:. Это все, о чем я могу думать.   -  person Codo    schedule 30.12.2012
comment
Спасибо, что разъяснили мне этот вопрос :-)   -  person syedfa    schedule 31.12.2012


Ответы (1)


Ознакомьтесь с фреймворком/библиотекой Reachability.

tonymillion сделал хорошую версию поставляемой Apple, которая была адаптирована для использования ARC, а также добавила поддержку блоков. В ридми на гитхабе также объясняется, как можно подписаться на уведомления о смене подключения :)

ознакомьтесь с проектом здесь

person PaReeOhNos    schedule 30.12.2012
comment
Большое спасибо за ваш ответ, я очень ценю это! - person syedfa; 31.12.2012
comment
Не беспокойтесь :) Как уже упоминал Кодо, просто обязательно обрабатывайте любые исключения, которые происходят во время соединения :) - person PaReeOhNos; 31.12.2012