ログにこのエラーメッセージが表示されるのは、一貫してではありませんが、SLComposeViewController
を使用してTwitterまたはFacebookの共有シートを開いたときです。 iOS 8で既存のコードをテストするだけで、新しいiOS 8 APIを使用していません。他の人がこの問題を抱えていて、Cocoa Touch SDKの他のモーダルビューコントローラーを使用するとクラッシュすることさえあります。
LaunchServices:invalidationHandlerが呼び出されました
IOS 8でSLComposeViewController
およびUIActivityViewController
を使用する際の新しい予防策はありますか?他に考慮すべきことはありますか?
アクティビティビューコントローラーを提示した後、次のコードを追加します。
if ([activityVC respondsToSelector:@selector(popoverPresentationController)])
{
// iOS 8+
UIPopoverPresentationController *presentationController = [activityVC popoverPresentationController];
presentationController.sourceView = sender; // if button or change to self.view.
}
開発者フォーラム を見る:「そのログメッセージは、ユーザーのエラーを示していません。」
UIDocumentInteractionControllerで同様の問題が発生しました。UIDocumentInteractionControllerの外側をタップして閉じるか、別のアプリを選択してドキュメントを開くと、「LaunchServices:invalideationHandlerが呼び出されました」というコンソールメッセージが2回表示されてクラッシュします(iOS 8のみを使用) 。
回避策は、presentOpenInMenuFromRect:inView:animated
への呼び出しをメインキューに追加することです。
dispatch_async(dispatch_get_main_queue(), ^() {
[self.documentInteraction presentOpenInMenuFromRect:theRect inView:self.view animated:YES];
});
自動終了について(クラッシュではありません):おそらく、共有しようとしているリンクに関連していると思います。音楽リンク(Spotify、SoundCloudなど)を投稿しようとすると、同じことが発生します。リンクをメディア以外のコンテンツへのリンクに置き換えると、同じツイートが機能します。私はこれをレーダーで調べて、それが意図的なものかどうかを確認します...
sourceRect
を定義する必要がある場合もあります。次のコードを使用して、tableViewからSLComposeViewControllerを表示しました。
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;
}
これにより、エラーメッセージが表示されなくなり、期待どおりに動作します。 「isAvailableForServiceType:」を呼び出すifステートメントを削除する必要があります。
このようになります。ハッピーコーディング。
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.
}