Новичок пытается создать URL-адрес для запроса GET - мой тестовый код и снимок экрана включены

Будучи новичком в iOS и Objective-C, я пытаюсь создать приложение, в котором пользователь может аутентифицироваться через Facebook, Google+ или еще 3 (российские) социальные сети.

Я знаю, что для Facebook я мог бы использовать Facebook SDK или Social.framework, но для остальных мне приходится использовать OAuth и UIWebView, потому что для них пока нет хороших SDK.

(Однажды мне это уже удалось, но это было для приложения Adobe AIR, а теперь я пытаюсь научиться нативному...)

В Xcode 5.2 я подготовил очень простое приложение Master-Detail для iPhone и проверил его в GitHub:

скриншот

Мой вопрос касается создания NSString для запроса GET (или тела в POST) -

В настоящее время у меня есть следующий неуклюжий исходный код в DetailViewController. м:

- (NSString*)buildUrl
{
    NSString *key = _dict[kKey];
    NSString *str = _dict[kAuthUrl];

    if ([key isEqual: kFB]) {
        str = [str stringByAppendingString:@"display=touch"];
        str = [str stringByAppendingString:@"&response_time=token"];
        str = [str stringByAppendingString:@"&client_id="];
        str = [str stringByAppendingString:_dict[kAppId]];
        str = [str stringByAppendingString:@"&redirect_uri="];
        str = [str stringByAppendingString:_dict[kAppUrl]];
        //str = [str stringByAppendingString:@"&state="];
        //str = [str stringByAppendingString:rand(1000)];
    } else if ([key isEqual: kGG]) {
    } else if ([key isEqual: kMR]) {
    } else if ([key isEqual: kOK]) {
    } else if ([key isEqual: kVK]) {
    }

    return str;
}

Мои вопросы:

  1. Вместо stringByAppendingString могу ли я использовать что-нибудь получше? Например, NSArray (или даже лучше NSDictionary), а затем каким-то образом соединить его с амперсандом между ними?
  2. Как избежать объектов HTML в значении redirect_uri=?
  3. Мне нужно добавить случайное число в качестве значения state=, но я не уверен, какую функцию лучше всего использовать...

Вот что печатает мое приложение для приведенного выше кода. :

Запрос MyAuth[9626:70b]: { URL: https://graph.facebook.com/oauth/authorize?display=touch&response_time=token&client_id=432298283565593&redirect_uri=https://www.facebook.com/connect/login_success.html }

(что нехорошо: URL-адрес в конце не экранирован и нет случайного номера состояния).


person Alexander Farber    schedule 06.01.2014    source источник


Ответы (1)


stringWithFormat: твой друг.

- (NSString*)buildUrl
{
    NSString *key = _dict[kKey];
    NSString *str = _dict[kAuthUrl];

    if ([key isEqual: kFB]) {
        NSString *escapedURI = [_dict[kAppUrl] stringByAddingPercentEscapesUsingEncoding:NSUTF8Encoding];
        int state = arc4random_uniform(1000);
        str = [NSString stringWithFormat:@"%@display=touch&response_time=token&client_id=%@&redirect_uri=%@&state=%d", _dict[kAuthUrl], _dict[kAppId], escapedURI, state];
    } else if ([key isEqual: kGG]) {
    } else if ([key isEqual: kMR]) {
    } else if ([key isEqual: kOK]) {
    } else if ([key isEqual: kVK]) {
    }

    return str;
}
person rmaddy    schedule 06.01.2014
comment
Спасибо, это выглядит лучше, чем мой код. Значит, нет хорошего способа соединить NSDictionary с NSString? - person Alexander Farber; 07.01.2014
comment
Мой ответ показывает хороший способ присоединиться к словарю и строке. - person rmaddy; 07.01.2014