在iOS6.0上使用FBNativeDialogs发布到脸书时不一致的崩溃

前端之家收集整理的这篇文章主要介绍了在iOS6.0上使用FBNativeDialogs发布到脸书时不一致的崩溃前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在努力解决这个问题一段时间,我似乎无法准确地再现它,以描述确切的用例.基本上,我正在做的是发出一个打开原生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.

猜你在找的iOS相关文章