我一直在努力解决这个问题一段时间,我似乎无法准确地再现它,以描述确切的用例.基本上,我正在做的是发出一个打开原生iOS 6.0 Facebook共享对话框的请求(使用Facebook iOS SDK 3.1.1):
if ([[SocialManager sharedManager] isNativeFacebookShareDialogAvailable]) { if (!url) { url = [NSURL URLWithString:@""]; } if (!imageUrl) { imageUrl = [NSURL URLWithString:@""]; } dispatch_async(backgroundQueue,^{ NSData *imageData = [NSData dataWithContentsOfURL:imageUrl]; UIImage *image = [UIImage imageWithData:imageData]; if (!image) { image = [[UIImage alloc] init]; } if ([FBNativeDialogs canPresentShareDialogWithSession:[FBSession activeSession]]) { dispatch_async(dispatch_get_main_queue(),^{ [FBNativeDialogs presentShareDialogModallyFrom:sender initialText:initialText images:@[image] urls:@[url] handler:^(FBNativeDialogResult result,NSError *error) { if (error) { failBlock([[error userInfo] description]); } else { if (result == FBNativeDialogResultSucceeded) { completionBlock(); } else if (result == FBNativeDialogResultCancelled) { failBlock(@"User cancelled"); } else if (result == FBNativeDialogResultError) { failBlock(@"Unknown error"); } } }]; }); } else { LogErr(@"Can't display native share dialog for active session"); } }); }@H_403_4@在之后的ShareShareDialogModallyFrom:sender被调用,我要么得到以下崩溃日志:
*** Terminating app due to uncaught exception 'NSGenericException',reason: '*** Collection <__NSArrayM: 0x1d161490> was mutated while being enumerated.' *** First throw call stack: (0x32ede2a3 0x326b097f 0x32eddd85 0x35da094d 0x32edb62f 0x35da07f5 0x35e7e5e5 0x35e0ccd7 0x35e0cb6d 0x372c490f 0x35e0ca61 0x35e160d5 0x372b783b 0x35e160b1 0x372b711f 0x372b699b 0x372b6895 0x372c5215 0x372c53b9 0x36f5fa11 0x36f5f8a4) libc++abi.dylib: terminate called throwing an exception@H_403_4@或者我没有崩溃,并且原生共享对话框显示为它应该. @H_403_4@这个堆栈意味着在这个时候调用一个叫做UIRemoteViewControllerCreationRequest的线程,这里有两个不同的崩溃的例子: @H_403_4@谢谢你的帮助
解决方法
经过大量实验,我的应用程序和Facebook SDK源码,我意识到3件事情:
@H_403_4@自己创建一个SLComposeViewController没有帮助. Facebook SDK在这方面很简单,它只是创建控制器,就像答案中的代码一样,带有奖金.
>当您授权FB会话时,您的应用程序将被停用一次或多次.这是由于出现许可确认提示.
> UIRemoteViewController实际上是在不同的进程中运行的SLComposeViewController. @H_403_4@是什么原因导致我的错误? @H_403_4@>用户确认FB权限
>这将触发applicationDidBecomeActive:
>它还触发FB回调来显示对话框.
>我的应用程序DidBecomeActive:正在使用UI做一些事情,当FB对话框出现时(tirggering a table reload),不应该做什么. @H_403_4@另外还有一件要小心的事情 – 在任何特定的线程上都没有调用presentShareDialogModallyFrom …的处理程序(请参阅SLComposeViewController文档).这意味着如果要从其更新UI,则应该从处理程序中使用dispatch_async(dispatch_get_main_queue(),…). @H_403_4@编辑:显然,以前的步骤修复了一些崩溃,但其中一个崩溃没有解决.经过大量搜索和搜索Apple开发者论坛后,我认为iOS 6中有一个与远程控制器连接并使用UIAppearance的bug,尤其是UINavigationBar的外观.我目前正在从我的应用程序中删除使用UIApperance.
>当您授权FB会话时,您的应用程序将被停用一次或多次.这是由于出现许可确认提示.
> UIRemoteViewController实际上是在不同的进程中运行的SLComposeViewController. @H_403_4@是什么原因导致我的错误? @H_403_4@>用户确认FB权限
>这将触发applicationDidBecomeActive:
>它还触发FB回调来显示对话框.
>我的应用程序DidBecomeActive:正在使用UI做一些事情,当FB对话框出现时(tirggering a table reload),不应该做什么. @H_403_4@另外还有一件要小心的事情 – 在任何特定的线程上都没有调用presentShareDialogModallyFrom …的处理程序(请参阅SLComposeViewController文档).这意味着如果要从其更新UI,则应该从处理程序中使用dispatch_async(dispatch_get_main_queue(),…). @H_403_4@编辑:显然,以前的步骤修复了一些崩溃,但其中一个崩溃没有解决.经过大量搜索和搜索Apple开发者论坛后,我认为iOS 6中有一个与远程控制器连接并使用UIAppearance的bug,尤其是UINavigationBar的外观.我目前正在从我的应用程序中删除使用UIApperance.