用于Twitter的SLComposeViewController现在在iOS 8.3中崩溃

时间:2015-04-13 19:20:42

标签: ios objective-c slcomposeviewcontroller invalidargumentexception

我的应用中有Tweetsheet分享选项。刚刚更新到iOS8.3,现在SLComposeViewController在我尝试展示Tweetsheet时抛出错误:

  

“因未捕获的异常而终止应用   'NSInvalidArgumentException',原因:'应用程序试图呈现一个   nil模态视图控制器在目标“

SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[tweetSheet setInitialText:@"testing!"];
[self presentViewController:tweetSheet animated:YES completion:nil];

我正在检查Twitter是否可用。其他人现在有这个问题吗?

2 个答案:

答案 0 :(得分:2)

在运行iOS 8.3的iPhone上使用SLServiceTypeTwitter时遇到同样的问题:虽然

[SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter] 

返回YES,后续调用

[SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]

返回nil。但是,如果我在iPad或iPhone模拟器上运行应用程序,或者我将服务类型更改为SLServiceTypeFacebook,它将返回视图控制器。

现在我使用此解决方法:要检查Twitter可用性,我使用

+(BOOL)twitterAvailable {
    return([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter] &&
           [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter] != nil);
}

在呈现SLComposeViewController之前,我进一步添加了一个额外的检查:

if(composeViewController != nil) {
   [viewController presentViewController:composeViewController animated:YES completion:nil];
}

这应该是iOS 8.4中修复错误的未来证据。

答案 1 :(得分:0)

在使用其中一项服务之前,您应始终检查是否可以访问该对象:

if( [SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter] ){

这非常重要,所以

  1. 您的应用未崩溃且
  2. 您可以告诉用户该服务不可用。
  3. 您应该对iOS中可以使用的其他服务执行相同的操作,例如SMSMail

    if(![MFMessageComposeViewController canSendText]) {
    

    if( ![MFMailComposeViewController canSendMail] ){
    

    如果您想确定手机上有特定应用,您也可以尝试使用canOpenURL:

    - (BOOL)isAppAvailable:(NSString *)appURL{
       return [[UIApplication sharedApplication]  
                    canOpenURL:[NSURL URLWithString:appURL]];
    }
    

    我认为调用isAvailableForServiceType:SLServiceTypeTwitter正在执行类似的事情。