web-dev-qa-db-ja.com

LaunchServices:invalidationHandlerが呼び出されました-iOS 8共有シート

ログにこのエラーメッセージが表示されるのは、一貫してではありませんが、SLComposeViewControllerを使用してTwitterまたはFacebookの共有シートを開いたときです。 iOS 8で既存のコードをテストするだけで、新しいiOS 8 APIを使用していません。他の人がこの問題を抱えていて、Cocoa Touch SDKの他のモーダルビューコントローラーを使用するとクラッシュすることさえあります。

LaunchServices:invalidationHandlerが呼び出されました

IOS 8でSLComposeViewControllerおよびUIActivityViewControllerを使用する際の新しい予防策はありますか?他に考慮すべきことはありますか?

25
Kyle Clegg

アクティビティビューコントローラーを提示した後、次のコードを追加します。

if ([activityVC respondsToSelector:@selector(popoverPresentationController)])
{
    // iOS 8+
    UIPopoverPresentationController *presentationController = [activityVC popoverPresentationController];

    presentationController.sourceView = sender; // if button or change to self.view.
}
26
Ram G.

開発者フォーラム を見る:「そのログメッセージは、ユーザーのエラーを示していません。」

5
Eric

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];

});
2
James

自動終了について(クラッシュではありません):おそらく、共有しようとしているリンクに関連していると思います。音楽リンク(Spotify、SoundCloudなど)を投稿しようとすると、同じことが発生します。リンクをメディア以外のコンテンツへのリンクに置き換えると、同じツイートが機能します。私はこれをレーダーで調べて、それが意図的なものかどうかを確認します...

0
coolio

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;
}
0
mand

これにより、エラーメッセージが表示されなくなり、期待どおりに動作します。 「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.
    }
0
rjm226