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

Я использую следующий код для обмена Twitter в своем приложении:

SLComposeViewController *twitter = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[twitter setInitialText:@"some text"];

twitter.completionHandler = ^(SLComposeViewControllerResult result)
{
    // do something...
    [topViewController dismissViewControllerAnimated:YES completion:nil];
};
[topViewController presentViewController:twitter animated:YES completion:nil];

Теперь, если учетные записи Twitter не настроены и приложение Twitter не установлено, я получаю следующее предупреждение:

введите здесь описание изображения

Он делает именно то, что должен: нажатие «Отмена» закрывает как окно оповещения, так и окно создания сообщения в Твиттере. Нажатие «Настройки» также закрывает оба вида и открывает настройки. Хороший.

Теперь, если учетные записи Twitter не настроены, но приложение Twitter установлено, я получаю следующее предупреждение:

введите здесь описание изображения

Обратите внимание, что нет кнопок «Отмена» и «Настройки», а есть только кнопка «ОК». При нажатии окно оповещения исчезает, но окно создания Твиттера остается, а кнопка «Опубликовать» становится серой. Таким образом, пользователю остается снова нажать «Отмена», чтобы закрыть представление создания и перейти к настройкам. Не так приятно.

Обратите внимание, что не имеет значения, проверяю ли я доступность службы перед представлением SLComposeViewController:

[SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter];

Знаете ли вы, почему такая разница в поведении и есть ли способ получить такое же поведение, независимо от того, установлено приложение Twitter или нет?

Протестировано на iOS 9.2.1, iPad Air (2-го поколения) и iPhone 6 Plus.


person Flo    schedule 15.03.2016    source источник
comment
Я также отправляю отчет об ошибке в Apple: openradar.appspot.com/25214135.   -  person Flo    schedule 17.03.2016


Ответы (1)


Проверьте [это] (Открытие приложения "Настройки" из другого приложения) . Прокрутите вниз, и там есть ответ, за который не проголосовали (как ни странно), который содержит изображения. Ссылка показывает, как перейти к настройкам/твиттеру из вашего приложения. Следующий шаг — изучить использование ACAccountStore, проверяя, нет ли пользователей, вошедших в систему через массив.

let accountStore = ACAccountStore()
let accountType = accountStore.accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierTwitter)

accountStore.requestAccessToAccountsWithType(accountType, options: nil, completion: { (granted, error) in
if (granted) {
         let arrayOfAccts = accountStore.accountsWithAccountType(accountType)
         if (arrayOfAccts.count > 0) {
         //regular function of twitter
         }
         //else is when there are no accounts logged into twitter
         else {
         //bring up a custom UIAlertAction with two options; Cancel and Settings.
         //settings should use the openURL to prefs:root=TWITTER
         } 
}

Это будет имитировать то, как это работает, когда пользователь не вошел в Twitter, а приложение не установлено, что дает вам «Отмена» и «Настройки».

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

Эта строка:

[SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter];

Проверяет, установлено ли приложение Twitter. Надеюсь это поможет.

person Nathan Rad    schedule 17.03.2016
comment
Спасибо за ответ, @Nathan! Опубликованное решение работает довольно хорошо. Немного жаль, что пользователь должен подтвердить доступ к учетным записям Twitter. Я также использую связанное решение RDC для связи с приложением «Настройки», поскольку оно, кажется, работает для iOS 6–9. Но в целом я могу оставить все как есть и жить с исходной ошибкой, если RDC решение не проходит процесс проверки. Этот риск и необходимый запрос учетной записи могут быть излишними, чтобы обойти эту довольно небольшую ошибку. Но в любом случае это хорошее решение. - person Flo; 17.03.2016