25

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?

Kyle Clegg
  • 38,547
  • 26
  • 130
  • 141
  • Seeing same log just opening and closing a share sheet in iOS 8.0 GM. No answer yet. – Swany Sep 10 '14 at 21:42
  • Same thing here. UIActivityViewController is very buggy. – jjxtra Sep 11 '14 at 00:58
  • This guy figured it out for Objective-C...but i'm not sure how to follow his answer in Swift. http://stackoverflow.com/questions/25192313/sharing-via-uiactivityviewcontroller-to-twitter-facebook-etc-causing-crash – davidrayowens Sep 17 '14 at 05:27
  • Check out my answer on the other thread: http://stackoverflow.com/a/25895667/2546659 – Andrew Sep 17 '14 at 16:23
  • I was getting this error too and realized it was coming when calling [SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook] and no facebook accounts were in settings. I just stopped checking for this since it automatically handles not having accounts and presents a message. – Tom Kincaid Nov 08 '14 at 18:08

6 Answers6

26

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.
}
4444
  • 3,541
  • 10
  • 32
  • 43
Ram G.
  • 3,045
  • 2
  • 25
  • 31
5

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

Eric
  • 3,301
  • 4
  • 33
  • 39
2

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

});
James
  • 863
  • 8
  • 21
0

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

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

coolio
  • 161
  • 5
0

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.
    }
rjm226
  • 1,203
  • 1
  • 11
  • 21