13

我已经在这个问题上苦苦挣扎了一段时间,但我似乎无法足够准确地重现它来描述确切的用例。本质上,我正在做的是发出打开本机 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");
            }
        });
    }

presentShareDialogModallyFrom: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,这里有两个不同崩溃的示例: 在此处输入图像描述 在此处输入图像描述

谢谢你的帮助

4

7 回答 7

2

在对我的应用程序进行大量试验并查看 Facebook SDK 源代码后,我意识到了 3 件事:

  1. 自己创建一个SLComposeViewController没有帮助。Facebook SDK 在这方面非常简单,它只是创建与答案中的代码完全相同的控制器,并带有奖励。

  2. 当您授权 FB 会话时,您的应用程序会被停用一次或多次。这是由出现的权限确认警报引起的。

  3. UIRemoteViewController实际上SLComposeViewController是在不同的进程中运行的。

是什么导致了我的错误?

  1. 用户确认 FB 权限
  2. 这触发applicationDidBecomeActive:
  3. 它还触发 FB 回调以呈现对话框。
  4. applicationDidBecomeActive:正在对 UI 做一些在 FB 对话框出现时不应该做的事情(触发表重新加载)。

此外,还有一件事需要注意 - 处理程序presentShareDialogModallyFrom...不会在任何特定线程上调用(请参阅SLComposeViewController文档)。这意味着dispatch_async(dispatch_get_main_queue(), ...)如果您从处理程序更新 UI,则应该使用处理程序。

编辑:显然,前面的步骤修复了一些崩溃,但其中一个崩溃没有解决。经过大量谷歌搜索和苹果开发者论坛,我认为 iOS 6 与遥控器连接和使用存在一个错误UIAppearance,尤其是UINavigationBar. 我目前正在UIApperance从我的应用程序中删除使用。

于 2013-06-24T08:57:23.780 回答
1

这是将帖子发布到 Facebook 的一种非常奇怪的方式。这是一种永远不会崩溃的更简单的方法。

视图控制器.h

#import <UIKit/UIKit.h>
#import <Social/Social.h>
#import <Accounts/Accounts.h>

@interface ViewController : UIViewController {
SLComposeViewController *mySLComposerSheet;
}
- (IBAction)PostToFacebook:(id)sender;

@end

ViewController.m @implementation ViewController

- (IBAction)PostToFacebook:(id)sender {
mySLComposerSheet = [[SLComposeViewController alloc] init];
mySLComposerSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook];
[mySLComposerSheet setInitialText:@"Place Text Here"];
[self presentViewController:mySLComposerSheet animated:YES completion:nil];
}
@end

如果需要,这里有一个视频

于 2013-02-17T13:18:49.757 回答
1

抱歉,其中一些是相当猜测,但我想我会尝试:

您确定可以安全地从非 UI 线程调用 canPresentShareDialogWithSession 吗?

在 _NSDictionaryEnumerate 的两个堆栈中都有一行。从高级函数看来,有些东西正在调用 enumerateKeysAndObjectsUsingBlock:。

根据您在 [presentShareDialogModallyFrom:sender] 之后发生的崩溃记录。当发件人的视图消失时,是否有东西被释放?

变量“图像”是保留还是自动释放,具体取决于它采用的代码路径。

于 2013-02-19T08:14:06.080 回答
1

我认为问题在于沃尔特已经说过。在您的代码中,某些事情是在主线程之外完成的。

在崩溃日志中,您可以看到有人在非 UI 线程的某个 UI 元素上设置外观 (UIAppearance)。那就是问题所在。此操作必须仅在 UI(主)线程中完成。

于 2013-02-19T08:45:11.767 回答
1

我相信这与 UIAppearance 方法的组合和从后台线程启动 UIRemoteViewController 有关。我们在我们的应用程序中遇到了同样的问题。我将更改我们的演示者类以从主线程呈现我们所有的远程视图控制器,看看是否有帮助。

在您的情况下,我猜 Facebook SDK 中的某些内容正在从后台线程中呈现某些内容。

在我确认我的修复有效后,我会更新。

于 2013-03-04T20:08:48.787 回答
1

这是 iOS 6 和 Social Framework 中的错误,请在此处查看答案UINavigationBar 外观和 Facebook-Sheet 错误

如何解决这个问题?

简单地而不是使用[UINavigationBar appearance]use[UINavigationBar appearanceWhenContainedIn:...]

您可以为您的导航控制器使用自定义类(例如 CustomNavigationController),然后在外观中应用它:

[UINavigationBar appearanceWhenContainedIn:[CustomNavigationController class], nil]

从我的实验来看,它应该用于所有方法,appearance不仅是等等(在你发送消息的每个对象上)UINavigationBarUIBarButtonItemappearance

于 2013-08-27T12:41:05.960 回答
-2

我想你知道什么是显而易见的,但我曾经遇到过这个错误,它是一个 NSMutableArray,它在 for..in 语句中被枚举时发生了变异。

查看 NSMutableArray,你会发现你的错误。

顺便说一句,如果你的目标是 ios6,你为什么不使用带有原生 facebook 实现的社交框架呢?

于 2013-02-16T00:53:35.610 回答