LaunchServices: invalidationHandler называется - общий ресурс iOS 8
Увидеть это сообщение об ошибке в журналах, хотя и не постоянно, примерно в то время, когда я использую SLComposeViewController
, чтобы открыть общий листок Twitter или Facebook. Я не использую ни один новый API iOS 8, просто проверяю существующий код на iOS 8. Я вижу, что у других была эта проблема, и даже видели сбои при использовании других модальных контроллеров вида из Cocoa Touch SDK.
LaunchServices: invalidationHandler называется
Существуют ли новые меры предосторожности при использовании SLComposeViewController
и UIActivityViewController
в iOS 8? Что-то еще нужно учитывать?
Ответы
Ответ 1
Добавьте этот код после представления своего контроллера вида активности:
if ([activityVC respondsToSelector:@selector(popoverPresentationController)])
{
// iOS 8+
UIPopoverPresentationController *presentationController = [activityVC popoverPresentationController];
presentationController.sourceView = sender; // if button or change to self.view.
}
Ответ 2
Глядя на форумы разработчиков: "В этом сообщении журнала не указано никаких ошибок с вашей стороны".
Ответ 3
У меня была аналогичная проблема с UIDocumentInteractionController, где, когда я выходил за ее пределы, чтобы отклонить ее, или выбрал другое приложение, чтобы открыть документ, он сработает с сообщением "LaunchServices: invalideHandler, называемое" консольным сообщением дважды (только с использованием iOS 8).
Обходной путь заключается в том, чтобы добавить вызов к presentOpenInMenuFromRect:inView:animated
в основную очередь, т.е.
dispatch_async(dispatch_get_main_queue(), ^() {
[self.documentInteraction presentOpenInMenuFromRect:theRect inView:self.view animated:YES];
});
Ответ 4
Вам также может понадобиться определить sourceRect
. Я использовал следующий код для отображения SLComposeViewController из tableView.
if ([controller respondsToSelector:@selector(popoverPresentationController)]) {
//get rect for this row in table
CGRect frame = [self.tableView rectForRowAtIndexPath:indexPath];
//convert table row frame to view reference
CGRect frameInView = [self.tableView convertRect:frame toView:self.view];
[controller popoverPresentationController].sourceRect = frameInView;
[controller popoverPresentationController].sourceView = self.view;
}
Ответ 5
Относительно автоматического закрытия (а не сбоя):
Я думаю, что это, вероятно, связано с той ссылкой, которую вы пытаетесь разделить. Я вижу то же самое, когда вы пытаетесь публиковать музыкальные ссылки (Spotify, SoundCloud,...). Тот же твит, если я заменил ссылку ссылкой на какой-то не-медиа-контент. Я зарегистрирую радар на этом, чтобы увидеть, намеренно ли он...
Ответ 6
Это избавит меня от сообщения об ошибке и работает так, как ожидалось. Вы должны избавиться от инструкции if, которая вызывает "isAvailableForServiceType:"
Это должно выглядеть так. Счастливое кодирование.
SLComposeViewController *tweetSheet = [SLComposeViewController
composeViewControllerForServiceType:SLServiceTypeTwitter];
[tweetSheet setInitialText:@"Great fun to learn iOS programming at appcoda.com!"];
[self presentViewController:tweetSheet animated:YES completion:nil];
if ([tweetSheet respondsToSelector:@selector(popoverPresentationController)])
{
// iOS 8+
UIPopoverPresentationController *presentationController = [tweetSheet popoverPresentationController];
presentationController.sourceView = sender; // if button or change to self.view.
}