oAuth/MGTwitterEngine изменить пользователя для iPhone?

Я работаю над приложением Twitter для iPhone, используя oAuth/MGTwitterEngine. Источник, на котором он основан, находится здесь: http://icodeblog.com/wp-content/uploads/2010/09/iCodeOauth.zip

Но я хочу, чтобы пользователь приложения мог вернуться и изменить имя пользователя и пароль, если, например, у пользователя есть более одной учетной записи Twitter.

Можно ли дать кнопке действие, чтобы открыть страницу, которая открывается автоматически при первом открытии приложения. (страница входа)


person Tapy    schedule 19.12.2010    source источник


Ответы (1)


Покопавшись в коде и поиграв с вещами, я нашел способ сделать это, который, вероятно, задокументирован везде, где у вас есть фреймворк.

Глядя на iCodeOauthViewController.m, внутри viewDidAppear: вы можете вызвать isAuthorized в движке, и он сообщит вам, аутентифицированы вы или нет. Если это возвращает да, вы можете затем вызвать метод clearAccessToken для объекта механизма, чтобы очистить эту аутентификацию. При следующем вызове controllerToEnterCredentialsWithTwitterEngine: delegate: он вернет контроллер представления для повторного ввода имени пользователя и пароля.

edit: в iCodeOauthViewController.m внутри fo viewDidAppear: (строка 46) вы увидите эту строку:

UIViewController *controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];

этот вызов возвращает экран входа в систему, который вы видите, если пользователь еще не вошел в систему. Если пользователь вошел в систему, он возвращает nil. Если контроллер равен нулю, он переходит непосредственно к списку.

чтобы «выйти» из системы, вы можете использовать этот метод:

- (void)switchUser
{
    // log off the existing user if one is validated
    if ([_engine isAuthorized])
        [_engine clearAccessToken];

    // display the login prompt
    UIViewController *controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];       
    if (controller) 
        [self presentModalViewController: controller animated: YES];
}

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

-(IBAction)tweet:(id)sender {

    [textfield resignFirstResponder];
    [_engine sendUpdate:[textfield text]];
    [self updateStream:nil];


    if([_engine isAuthorized]==NO){UIAlertView *alert = [[UIAlertView alloc]
                                                         initWithTitle: @"Please, Sign in"
                                                         message: @"You'll have to sign in for this app to work!"
                                                         delegate: nil
                                                         cancelButtonTitle:@"Ok"
                                                         otherButtonTitles:nil];
        [alert show];
        [alert release];
        }
}

измените его, чтобы он выглядел так:

-(IBAction)tweet:(id)sender {


if([_engine isAuthorized]==NO){
    UIAlertView *alert = [[UIAlertView alloc]
                                                     initWithTitle: @"Please, Sign in"
                                                     message: @"You'll have to sign in for this app to work!"
                                                     delegate: nil
                                                     cancelButtonTitle:@"Ok"
                                                     otherButtonTitles:nil];
    [alert show];
    [alert release];
    }
else {
    [textfield resignFirstResponder];
    [_engine sendUpdate:[textfield text]];
    [self updateStream:nil];

}

}

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

Я бы порекомендовал попытаться немного больше понять, как работает target-c, и получить хотел-вы-знали-о-2-летах-назад">знаком с отладчиком. Если вы запустите отладчик, и ваше приложение даст сбой, отладчик остановится в той точке кода, где произошел сбой, и вы сможете просмотреть вызовы функций в стеке, чтобы определить, что код делает неправильно. Подробнее о том, как лучше начать с target-c. Я бы порекомендовал некоторые онлайн-сайты, такие как учебные пособия CocoaDevCentral. Запомните это . Вы хорошо начали, пытаясь сделать что-то свое на основе примера. Не бойтесь делать побочный проект, чтобы поиграть с идеей, если она не сразу работает в вашем основном проекте, даже если это что-то столь же простое, как выяснение другого способа сделать 2 + 2. Надеюсь, это поможет.

person slycrel    schedule 20.12.2010
comment
Извините за вопрос, но я все еще изучаю Objective-C. Не могли бы вы предоставить мне код? - person Tapy; 20.12.2010
comment
Я разобрался, где появился этот экран и где происходит авторизация с помощью отладчика. Вы можете попробовать это и посмотреть, сможете ли вы понять это, даже с кодом выше. Начните с установки точки останова в верхней части метода viewDidAppear:. - person slycrel; 20.12.2010
comment
Спасибо! Мне также удалось дать кнопке действие для перехода на страницу. Но есть одна вещь, которую я не мог понять в отладчике. Вы видите, если вы нажали «Отмена», не введя имя пользователя и пароль, и попытались опубликовать что-то, приложение вылетает. Можно ли отображать предупреждение или что-то, говорящее пользователю, что он/она не вошел в систему? - person Tapy; 21.12.2010
comment
в коде, где они пытаются опубликовать твит, вы можете проверить тот же вызов [_engine isAuthorized], и если они не авторизованы, появится предупреждение и фактически не отправляйте твит. - person slycrel; 21.12.2010
comment
Хорошо, но как мне сообщить об этом движку, если он не авторизован? Первое, о чем я подумал, это если ([_engine isNotAuthorized]) Но это не сработало. - person Tapy; 21.12.2010
comment
[_engine isAuthorized] возвращает логическое значение. true, если он авторизован, false, если нет. Нет необходимости менять вызов. - person slycrel; 21.12.2010
comment
И для проверки вы можете сделать if([_engine isAuthorized] == NO) { // делаем предупреждение } else { // продолжаем как обычно } - person slycrel; 21.12.2010
comment
Хм, приложение запускается и т. д., но когда я нажимаю кнопку твита без входа в систему, приложение вылетает, и предупреждение не отображается. - person Tapy; 22.12.2010
comment
if([_engine isAuthorized]==NO){UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @Пожалуйста, Войдите в сообщение: @Вам нужно войти, чтобы это приложение работало! делегат: ноль cancelButtonTitle:@Ok otherButtonTitles:nil]; [предупреждающее шоу]; [выпуск предупреждения]; } else { // продолжаем как обычно } - person Tapy; 22.12.2010
comment
Это код, который я добавил, что-то не так с кодом или я что-то забыл? - person Tapy; 22.12.2010
comment
не выпускайте предупреждение, которое вызывает ваш сбой. Я считаю, что как только кнопка OK будет нажата, она будет отпущена. Кроме того, вы можете захотеть вернуться в конце этого блока кода и удалить оператор else. - person slycrel; 22.12.2010
comment
Он по-прежнему вылетает без отображения предупреждения. Должен ли я загрузить код, чтобы вы могли взглянуть на него, когда у вас будет время? - person Tapy; 22.12.2010
comment
Ну, я загрузил его, так что если бы вы могли взглянуть на него, когда у вас будет время, это было бы здорово! mediafire.com/?v044xrgwjnin1jj - person Tapy; 22.12.2010
comment
Большое спасибо за вашу помощь! Благодаря этому я многому научился и обязательно загляну на эти сайты. - person Tapy; 24.12.2010