启动服务:invalidationHandler被调用 - iOS 8共享表单

25

在日志中看到这个错误信息,尽管不是一贯的出现,但大约在我使用 SLComposeViewController 打开 Twitter 或 Facebook 分享表单时出现。我没有使用任何新的 iOS 8 API,只是在 iOS 8 上测试现有的代码。我看到其他人也遇到了这个问题,甚至在使用 Cocoa Touch SDK 的其他模态视图控制器时出现了崩溃。

LaunchServices: invalidationHandler 被调用

在 iOS 8 中,是否需要采取新的预防措施来处理 SLComposeViewControllerUIActivityViewController?还需要考虑其他事情吗?


在iOS 8.0 GM中,只需打开和关闭共享面板就可以看到相同的日志。目前还没有答案。 - Swany
同样的问题。UIActivityViewController非常容易出现错误。 - jjxtra
这个人在Objective-C中找到了解决方法...但我不确定如何在Swift中跟随他的答案。https://dev59.com/TF8e5IYBdhLWcg3w7-Nz - davidrayowens
看看我在另一个帖子上的回答:https://dev59.com/TF8e5IYBdhLWcg3w7-Nz#25895667 - Andrew
我也遇到了这个错误,并意识到是在调用[SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]时出现的,因为设置中没有 Facebook 帐户。我不再检查这个问题,因为它会自动处理没有帐户并呈现一条消息。 - Tom Kincaid
6个回答

26
在展示您的活动视图控制器之后,请添加以下代码:
if ([activityVC respondsToSelector:@selector(popoverPresentationController)])
{
    // iOS 8+
    UIPopoverPresentationController *presentationController = [activityVC popoverPresentationController];

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

我遇到了同样的问题...这个答案解决了崩溃的问题,但是在控制台中仍然会出现“LaunchServices: invalidationHandler called”的提示。 - Praksha
4
这是苹果的bug,查看https://devforums.apple.com/message/1049415#1049415,所以不用在意控制台的警告。 - Ajit Satarkar
我真的永远也不会想到这个。苹果太棒了。 - toblerpwn
presentationController.barButtonItem = sender; 演示控制器.按钮项 = 发送者; - hyperspasm

5

查看开发者论坛: "该日志信息并不表示您的操作有误。"


我猜你特别指的是这篇帖子:https://devforums.apple.com/message/1049415#1049415 - Richard Venable

2

我曾经遇到过一个与UIDocumentInteractionController相关的问题,当我点击它之外的区域来关闭它或者选择其他应用程序打开其中的文档时,它会崩溃,并在控制台中显示“LaunchServices: invalideationHandler called”消息(只有在iOS 8上出现)。

解决方法是将调用presentOpenInMenuFromRect:inView:animated放在主队列中,即:

dispatch_async(dispatch_get_main_queue(), ^() {

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

});

0

您可能还需要定义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

这样做对我来说可以消除错误信息,并且正常工作。你必须摆脱调用“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
关于自动关闭(而非崩溃): 我认为这可能与您尝试分享的链接有关。当我尝试发布音乐链接(Spotify、SoundCloud 等)时,我也看到了同样的情况。如果我用一些非媒体内容的链接替换链接,则相同的推文可以正常工作。我将在此提出问题,以查看是否是故意的...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接