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"); } }); }
在之后的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
或者我没有崩溃,并且原生共享对话框显示为它应该.
这个堆栈意味着在这个时候调用一个叫做UIRemoteViewControllerCreationRequest的线程,这里有两个不同的崩溃的例子:
谢谢你的帮助
解决方法
自己创建一个SLComposeViewController没有帮助. Facebook SDK在这方面很简单,它只是创建控制器,就像答案中的代码一样,带有奖金.
>当您授权FB会话时,您的应用程序将被停用一次或多次.这是由于出现许可确认提示.
> UIRemoteViewController实际上是在不同的进程中运行的SLComposeViewController.
是什么原因导致我的错误?
>用户确认FB权限
>这将触发applicationDidBecomeActive:
>它还触发FB回调来显示对话框.
>我的应用程序DidBecomeActive:正在使用UI做一些事情,当FB对话框出现时(tirggering a table reload),不应该做什么.
另外还有一件要小心的事情 – 在任何特定的线程上都没有调用presentShareDialogModallyFrom …的处理程序(请参阅SLComposeViewController文档).这意味着如果要从其更新UI,则应该从处理程序中使用dispatch_async(dispatch_get_main_queue(),…).
编辑:显然,以前的步骤修复了一些崩溃,但其中一个崩溃没有解决.经过大量搜索和搜索Apple开发者论坛后,我认为iOS 6中有一个与远程控制器连接并使用UIAppearance的bug,尤其是UINavigationBar的外观.我目前正在从我的应用程序中删除使用UIApperance.