Подтвердить что ты не робот

Неверное значение NSStringEncoding, обнаруженное 0x0000 (с использованием ASIHTTPRequest)

Я использую ASIHTTPRequst в своем приложении, и у меня возникают некоторые проблемы, но только на некоторых устройствах. В некоторых случаях я получаю следующую ошибку:

" Неверное значение NSStringEncoding 0x0000. Предполагая NSASCIIStringEncoding. Остановит это поведение сопоставления совместимости в ближайшем будущем"

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

Кто-нибудь знает, что может вызвать проблему? Я вижу, что есть похожие вопросы, но мой код выглядит как правильный как от других вопросов, так и от сайта ASIHTTPRequest.

Изменить При возникновении ошибки ответ от сервера не получает, поэтому пользователь застревает в регистре/входе.

urlEncodeValue:

- (NSString *)urlEncodeValue:(NSString *)str
{
    NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
    return [result autorelease];
}

Фрагмент кода ASIHTTPRequest:

    NSString *encodedUrlAdress = [NSString stringWithFormat:@"%@user/register/%@/%@/%@/%d/%@/%@/%@/%@", 
                                   kUserServerAddress, 
                                   [self urlEncodeValue:_firstName], 
                                   [self urlEncodeValue:_lastName], 
                                   [self urlEncodeValue:_phoneNumber], 
                                   _sex, 
                                   [self urlEncodeValue:_birthDate], 
                                   [self urlEncodeValue:_address], 
                                   [self urlEncodeValue:_postalNumber]];    
    NSLog(@"encodedUrlAdress: %@", encodedUrlAdress);

    NSURL *url = [NSURL URLWithString:encodedUrlAdress];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request startSynchronous];
    NSError *error = [request error];

    if (!error) {
// do stuff
}
4b9b3361

Ответ 1

Копирование моего ответа из fooobar.com/info/434580/... - вы, скорее всего, получите это сообщение из-за того, что вы вызываете getResponseString при неудавшемся запросе. Вы должны убедиться, что вы проверяете, есть ли у вас ответ, прежде чем вызывать это: один из способов, который я обнаружил для проверки полного сбоя запроса (т.е. Сетевого/сервера вниз), - проверить:

if (request.responseStatusCode == 0) {
    // the request failed entirely
} else {
    // you at least got a HTTP response
}

Это происходит, если вы вызываете [asiHttpRequest getResponseString] до того, как верный ответ был возвращен, и была установлена ​​кодировка запроса (т.е. не удалось подключиться к серверу).

Самый простой способ обхода этого предупреждения - отредактировать класс ASIHTTPRequest, удалить @synthesize responseEncoding и добавить простой пользовательский getter/setter, чтобы вы могли вернуть кодировку по умолчанию, если кодировка ответа не установлена:

- (NSStringEncoding) responseEncoding
{
    return responseEncoding || self.defaultResponseEncoding;
}

- (void) setResponseEncoding:(NSStringEncoding)_responseEncoding
{
    responseEncoding = _responseEncoding;
}

Также существует более конкретный метод обхода метода getResponseString, который, я думаю, является единственным местом, в котором используется кодировка, не проверяя значение - поскольку кодировка должна быть установлена ​​для любого ответа с ненулевой длиной:

- (NSString *)responseString
{
    NSData *data = [self responseData];
    if (!data) {
        return nil;
    }
    // --- INSERT THIS BLOCK ---
    // If the 'data' is present but empty, return a simple empty string
    if (data.length == 0) {
        return @"";
    }
    //assert(self.responseEncoding); // if you're into runtime asserts, uncomment this
    // --- END OF BLOCK TO INSERT ---
    return [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:[self responseEncoding]] autorelease];
}