Вопрос

Я пытаюсь запустить небольшой клиент Twitter и столкнулся с проблемой при тестировании вызовов API, требующих аутентификации.

Мой пароль содержит специальные символы, поэтому, когда я пытаюсь использовать следующий код, он не работает.

NSString *post = [NSString stringWithFormat:@"status=%@", [status stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%@@%@/statuses/update.json", username, password, TwitterHostname]];
[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

NSURLResponse *response;
NSError *error;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

Я начал изучать base64 и помещать аутентификацию в заголовки.Я нашел У Дэйва Дрибина опубликуйте его реализацию на base64, и это, казалось, имело смысл.Однако, когда я попытался использовать его, компилятор начал жаловаться на то, что он не может найти библиотеки openssl.Итак, я прочитал, что мне нужно создать ссылку в библиотеке libcrypto, но, похоже, она не существует для iphone.

Я также читал, как люди говорят, что Apple не разрешает приложениям использовать криптографические библиотеки, что для меня не имеет смысла.

Так что теперь я в некотором роде застрял и сбит с толку.Какой самый простой способ получить базовую аутентификацию в моем приложении?

Ваше здоровье

Это было полезно?

Решение

Две вещи.Во-первых, вам нужно использовать асинхронные методы, а не синхронный/классовый метод.

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:req]
                                                               cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                           timeoutInterval:30.0];

// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

Аутентификация управляется путем реализации этого метода в вашем делегате:

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

И вам, вероятно, также потребуется реализовать эти методы:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

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

Другие советы

Вы можете напрямую, как только напишете, загрузить имя пользователя и пароль по основному URL, т.е. https://username:password@yoururl.com/

Прежде всего, вам нужно вызвать файл делегата NSURLConnection:-

  • (BOOL) соединение: (NSURLConnection *) соединение может быть аутентифицировано в пространстве защиты: (NSURLProtectionSpace *) Пространство защиты

    {

    возврат ДА;}

и затем вызовите - (void) соединение: (NSURLConnection *) соединение не получило проверки подлинности: (NSURLAuthenticationChallenge *) вызов

{
if ([challenge previousFailureCount] == 0)
        {
            NSURLCredential *newCredential;

            newCredential = [NSURLCredential credentialWithUser:@"username"
                                                       password:@"password"
                                                    persistence:NSURLCredentialPersistenceForSession];
            NSLog(@"NEwCred:- %@ %@", newCredential, newCredential);
            [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
        }
        else
        {
            [[challenge sender] cancelAuthenticationChallenge:challenge];
            NSLog (@"failed authentication");
        }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top