Блок завершения входа в twitterKit никогда не выполняется

Я пытаюсь опубликовать некоторый контент в твиттере из своего приложения, и, к сожалению, с iOS 11 старый способ больше не работает, поэтому я внедряю twitterKit и нахожу некоторые всплески.

Когда у меня не установлено приложение, оно запускает блок завершения ниже, что странно, потому что мне пришлось вручную отклонить предупреждение, так как в предупреждении нет кнопок для этого.

Но моя настоящая проблема заключается в том, что у меня установлено приложение Twitter, и я вошел в систему. Но я не могу обнаружить его с помощью набора Twitter. И когда я нажимаю кнопку «Поделиться в твиттере», приложение переключается на новый вид, если оно просит меня подключить мое приложение к моему твиттеру (если я не вошел в систему, у меня есть поле для входа и пароля, но результатом всегда является то же самое...) Когда я нажимаю "Подключиться", представление возвращается к моему приложению, и ничего не происходит, блок завершения никогда не вызывается... Я работаю в iOS 11 и x-code 9, но я пробовал тот же подход с iOS 10, и я получаю тот же результат. Вход в Twitter никогда не обнаруживается. Это код, который я запускаю, любая помощь будет оценена:

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: false, completion: {
        print("This code never runs")
    })
} else {
    // Log in
    Twitter.sharedInstance().logIn { session, error in
        if session != nil {
            // Log in succeeded / Never happens
            let composer = TWTRComposerViewController.emptyComposer()
            composer.delegate = self
            self.present(composer, animated: true, completion: {
                print ("This code never runs")
            })
        } else {
            let alert = UIAlertController(title: "No Twitter Accounts Available", message: "You must log in before presenting a composer.", preferredStyle: .alert)

            //Only happens if I don't have the twitter app installed on my device
            self.present(alert, animated: false, completion: {
                print ("not loggued in")

                /*
                 manual dismission of the prompt as it don't have
                 any button
                 */
                sleep(3)
                alert.dismiss(animated: true, completion: nil)

            })
        }
    }
}

В консоли я получаю сообщение об ошибке: [Snapshotting] Для создания снимка представления (0x105977000, UIKeyboardImpl), которое не было обработано хотя бы один раз, требуется afterScreenUpdates:YES.

РЕДАКТИРОВАТЬ: я решил добавить этот метод в appDelegate:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey: Any] = [:]) -> Bool { return Twitter.sharedInstance().application(app, open: url, options: options)}


person Alfro    schedule 12.10.2017    source источник


Ответы (1)


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

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    let twtrHandled = TWTRTwitter.sharedInstance().application(app, open: url, options: options)
    return twtrHandled
}

Если у вас есть несколько комплектов, которые могут обрабатывать URL-адрес, я обрабатываю это так (здесь я также использую SDK facebook и Branch SDK):

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    let branchHandled = Branch.getInstance().application(app, open: url, options: options)
    let fbHandled = SDKApplicationDelegate.shared.application(app, open: url, options: options)
    let twtrHandled = TWTRTwitter.sharedInstance().application(app, open: url, options: options)
    return branchHandled || fbHandled || twtrHandled
}
person Milan Nosáľ    schedule 26.03.2018
comment
Как мы можем изменить это, чтобы вызывать TWTRTwitter.sharedInstance... только тогда, когда это приходит из Twitter? Что делать, если этот метод попал из другого источника? - person Jake T.; 27.03.2018
comment
Или мы всегда должны вызывать эту линию, и она справится с ней, если потребуется? - person Jake T.; 27.03.2018
comment
@ ДжейкТ. AFAIK, возвращаемое значение является логическим, сообщающим вам, было ли оно обработано Twitter или нет.. поэтому я ожидаю, что TWTRTwitter.sharedInstance() имеет свой собственный механизм для определения того, исходит ли он из Twitter или нет. - person Milan Nosáľ; 27.03.2018
comment
Я вижу, спасибо большое! Похоже, что для этого метода вполне приемлемо возвращать НЕТ. Есть идеи, что тогда происходит? Я просмотрел документацию, но она просто говорит, что возвращает логическое значение, говорящее, обработало ли приложение ссылку. Он ничего не говорит о том, что об этом предупреждается или есть ли какие-либо последствия этого. Мое лучшее предположение, возможно, какое-то аналитическое отслеживание, специфичное для ссылки? Например, открыто рекламное приложение Facebook, но вы не справитесь с этим, покажет ли это аналитика Facebook? Приложение пользователя открылось на обычном домашнем экране без проблем. - person Jake T.; 28.03.2018
comment
@ ДжейкТ. На самом деле не исследовал это, но я считаю, что лучше всего вернуть возвращаемое значение, которое вы получаете от вызова TWTRTwitter.sharedInstance().. если твиттер обработал это, то правильно вернуть true.. если есть несколько наборов, которые могут это обработать (например, я также использую ветку и facebook), я бы вернул логическое ИЛИ возвращаемых значений из вызова соответствующих обработчиков этих наборов - если какой-либо из этих наборов обрабатывал url, опять же, логическое ИЛИ сделало бы окончательное возвращаемое значение true - что я считаю правильным вернуть, если один из комплектов справился с этим - person Milan Nosáľ; 28.03.2018