Не удается отправить твит с помощью TwitterKit на iOS 11

Я пытаюсь использовать TwitterKit для создания твита с помощью предоставленного класса TWTRComposer. Это функция, которую я вызываю:

-(void) tweet:(UIViewController *) root {
    TWTRComposer *composer = [[TWTRComposer alloc] init];

    [composer setText:@"just setting up my Twitter Kit"];

    // Called from a UIViewController
    [composer showFromViewController:root completion:^(TWTRComposerResult result) {
        if (result == TWTRComposerResultCancelled) {
            NSLog(@"Tweet composition cancelled");
        }
        else {
            NSLog(@"Sending Tweet!");
        }
    }];
}

С этим есть две проблемы:

  1. Когда приложение Twitter установлено на моем устройстве, отображается диалоговое окно TWTRComposer, но вскоре после этого сверху отображается другое предупреждение с заголовком: «Нет учетной записи Twitter» и следующее сообщение : "Учетные записи Twitter не настроены. Вы можете добавить или создать учетную запись Twitter в настройках." Я могу закрыть это диалоговое окно, а затем отправить твит (успешно), но это, очевидно, очень плохой UX . Кроме того, это диалоговое окно с ошибкой выглядит странно, так как в iOS 11 больше нет Twitter в настройках.
  2. Когда приложение Twitter не установлено на моем устройстве, диалоговое окно TWTRComposer вообще не отображается. Вместо этого немедленно вызывается блок завершения в методе showFromViewController с результатом типа TWTRComposerResultCancelled.

У меня есть ощущение, что это может быть как-то связано с проблемами входа в Twitter. поскольку приложение, над которым я работаю, не включает регистрацию/вход в Twitter. Однако у меня сложилось впечатление, что TWTRComposer обрабатывает все входы в систему.

Любая помощь действительно приветствуется, и спасибо за чтение!


person Miki P    schedule 04.08.2017    source источник


Ответы (2)


Вы правы: из-за изменений в iOS 11 вам необходимо авторизоваться перед вызовом TWTRComposer.

iOS 11 больше не поддерживает использование Twitter через встроенную социальную сеть. Вместо этого вы можете использовать Twitter Kit 3 для твитов, входа пользователей и использования Twitter API. В следующем руководстве показано, как перенести старый код.

Войдите (если возможно, в следующем порядке: Twitter для iOS / SFSafariViewController / UIWebView. Отметьте предварительные требования), а затем напишите:

Объект:

// Check if current session has users logged in
if ([[Twitter sharedInstance].sessionStore hasLoggedInUsers]) {
    TWTRComposerViewController *composer = [TWTRComposerViewController emptyComposer];
    [fromController presentViewController:composer animated:YES completion:nil];
} else {
    [[Twitter sharedInstance] logInWithCompletion:^(TWTRSession *session, NSError *error) {
        if (session) {
            TWTRComposerViewController *composer = [TWTRComposerViewController emptyComposer];
            [fromController presentViewController:composer animated:YES completion:nil];
        } else {
            UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"No Twitter Accounts Available" message:@"You must log in before presenting a composer." preferredStyle:UIAlertControllerStyleAlert];
            [self presentViewController:alert animated:YES completion:nil];
        }
    }];
}

Быстрый:

if Twitter.sharedInstance().sessionStore.hasLoggedInUsers() {
    // App must have at least one logged-in user to compose a Tweet
    let composer = TWTRComposerViewController.emptyComposer()
    present(composer, animated: true, completion: nil)
} else {
    // Log in, and then check again
    Twitter.sharedInstance().logIn { session, error in
        if session != nil { // Log in succeeded
            let composer = TWTRComposerViewController.emptyComposer()
            self.present(composer, animated: true, completion: nil)
        } else {
            let alert = UIAlertController(title: "No Twitter Accounts Available", message: "You must log in before presenting a composer.", preferredStyle: .alert)
            self.present(alert, animated: false, completion: nil)
        }
    }
}

Документы:

person nathan    schedule 04.08.2017
comment
Спасибо за ваш ответ! Просто чтобы уточнить, чтобы использовать TWTRComposer, необходимо заранее вызвать logIn()? - person Miki P; 05.08.2017
comment
Перед показом проверьте с помощью Twitter.sharedInstance().sessionStore.hasLoggedInUsers(), есть ли зарегистрированный пользователь. - person nathan; 05.08.2017
comment
Таким образом, вышеуказанный метод входа в систему откроет приложение/Safari, или мне придется позаботиться об этом? Из документации непонятно. Кроме того, нужно ли разрешать пользователям регистрироваться/входить в мое приложение через Twitter? Или пользователи могут просто войти в Twitter через мое приложение? - person Miki P; 05.08.2017
comment
Задокументированный процесс входа в систему выглядит следующим образом: Twitter для iOS -> SFSafariViewController -> UIWebView. Выбор за библиотекой. - person nathan; 05.08.2017
comment
Я вижу, так что библиотека справляется с этим. Последний вопрос (надеюсь), нужно ли мне разрешать регистрацию/вход через Twitter в мое приложение, чтобы все это работало? - person Miki P; 05.08.2017
comment
Проверьте предварительные требования. Странно то, что в документах указано следующее: TWTRComposer > This class automatically handles presenting a log in controller if there are no logged in sessions. - person nathan; 05.08.2017
comment
Я знаю, поэтому и задал этот вопрос... Очень странно. - person Miki P; 05.08.2017
comment
Наверное не обновлялся. Если вы можете, отправьте электронное письмо в службу поддержки, чтобы они могли обновить его для будущих пользователей. - person nathan; 05.08.2017
comment
Я только что наткнулся на это: github.com/marcoarment/FCUtilities/ blob/master/FCUtilities/ Твиттер-аутентификация без Твиттер-кита. Использует приложение Twitter для iOS с SFAuthenticationSession в качестве запасного варианта. - person nathan; 05.08.2017
comment
Кажется, что документы очень устарели. Такие методы, как emptyComposer() и hasLoggedInUsers(), больше не отображаются в заголовочном файле. Тем не менее, я заставил его работать с помощью доступных методов. - person Miki P; 07.08.2017
comment
@MikiP У меня есть сообщение об ошибке, в котором говорится, что Value of type 'TWTRSessionStore' has no member 'hasLoggedInUsers'. Не могли бы вы поделиться, как вы справляетесь с этим? - person hientrq; 17.11.2017
comment
@HienQuangTran Я закончил работу над приложением, которое касается этого вопроса, и с тех пор не занимался разработкой для iOS, поэтому моя память в этой области невелика. Однако я не думаю, что столкнулся с проблемой, с которой вы столкнулись, поэтому я не могу сильно помочь. Извини! - person Miki P; 17.11.2017
comment
@HienQuangTran Сначала проверьте минимальную версию iOS для развертывания. Если это только iOS9+, вы сможете установить TwitterKit v3, где присутствует hasLoggedInUsers. В противном случае будет установлен TwitterKit v2.8.1. Ваше здоровье. - person SoftDesigner; 22.01.2018

С 12 июня 2018 г. блокировка обратного вызова больше не является обязательной. Правильный формат обратного вызова для приложений iOS:

twitterkit-MY_CONSUMER_KEY://

https://developer.twitter.com/en/docs/basics/callback_url.html

person shahil    schedule 21.11.2018