LaunchServices: invalidationHandler called - iOS 8 share sheet

空扰寡人 提交于 2019-11-30 07:47:53

问题


Seeing this error message in the logs, though not consistently, around the time that I use SLComposeViewController to open a Twitter or Facebook share sheet. I am not using any new iOS 8 API, just testing existing code on iOS 8. I see others have had this problem and even seen crashes when using other modal view controllers from the Cocoa Touch SDK.

LaunchServices: invalidationHandler called

Are there new precautions to take with SLComposeViewController and UIActivityViewController in iOS 8? Something else to consider?


回答1:


Add this code after you present your activity view controller:

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

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



回答2:


Looking at the developer forums: "That log message does not indicate any error on your part."




回答3:


I had a similar problem with a UIDocumentInteractionController, where when I tapped outside it to dismiss it, or selected another app to open the document in, it would crash with the "LaunchServices: invalideationHandler called" console message displayed twice (only using iOS 8).

A workaround is to add the call to presentOpenInMenuFromRect:inView:animated to the main queue, i.e.

dispatch_async(dispatch_get_main_queue(), ^() {

[self.documentInteraction presentOpenInMenuFromRect:theRect inView:self.view animated:YES];

});



回答4:


You may also need to define the sourceRect. I used the following code to display a SLComposeViewController from a 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:


Regarding the auto-closing (not the crash): I think it's probably related to the link you are trying to share. I'm seeing the same thing when trying to post music links (Spotify, SoundCloud,...). The same tweet works if I replace the link by a link to some non-media-content. I'll file radar on this to see whether it's intentional...




回答6:


This gets rid of the Error message for me and works as expected. You have to get rid of the if statement that calls "isAvailableForServiceType:"

It should look like this. Happy coding.

    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.
    }


来源:https://stackoverflow.com/questions/25759380/launchservices-invalidationhandler-called-ios-8-share-sheet

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!