簡體   English   中英

在iOS6.0上使用FBNativeDialogs發布到Facebook時發生不一致的崩潰

[英]Inconsistent crash while posting to facebook using FBNativeDialogs on iOS6.0

我一直在努力解決這個問題,我似乎無法准確地再現它以描述確切的用例。 基本上,我正在做的是發出打開原生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的線程,這里有兩個不同崩潰的例子: 在此輸入圖像描述在此輸入圖像描述

謝謝你的幫助

經過大量實驗我的應用程序並查看Facebook SDK源代碼后,我意識到了三件事:

  1. 自己創建SLComposeViewController沒有幫助。 Facebook SDK非常簡單,它只是創建控制器,就像答案中的代碼一樣。

  2. 授權FB會話時,應用程序將被停用一次或多次。 這是由出現的權限確認警報引起的。

  3. UIRemoteViewController實際上是SLComposeViewController ,它在不同的進程中運行。

是什么原因造成我的錯

  1. 用戶確認FB權限
  2. 這會觸發applicationDidBecomeActive:
  3. 它還會觸發FB回調以顯示對話框。
  4. 我的applicationDidBecomeActive:正在使用UI做一些事情,當FB對話框出現時不應該做什么(tirggering一個表重新加載)。

另外,還有一件事需要注意 - 在任何特定線程上都不會調用presentShareDialogModallyFrom...的處理程序(請參閱SLComposeViewController文檔)。 這意味着如果要從中更新UI,則應該使用處理程序中的dispatch_async(dispatch_get_main_queue(), ...)

編輯:顯然,前面的步驟修復了一些崩潰,但其中一個崩潰沒有解決。 經過大量谷歌搜索和搜索Apple Developer論壇后,我認為iOS 6中存在一個與遠程控制器連接並使用UIAppearance ,尤其是UINavigationBar的外觀。 我目前正從我的應用程序中刪除UIApperance的使用。

這是將帖子發布到Facebook的一種非常奇怪的方式。 這是一種永遠不會崩潰的簡單方法。

ViewController.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

如果需要,這里有一個視頻

對不起,其中一些是猜測,但我想我會嘗試:

你確定canPresentShareDialogWithSession可以安全地從非UI線程調用嗎?

在兩個_NSDictionaryEnumerate堆棧中都有一行。 它看起來像是從更高級的函數,調用enumerateKeysAndObjectsUsingBlock:。

基於你在[presentShareDialogModallyFrom:sender]之后崩潰的事情。 當發件人的觀點消失時,是否有某些東西被釋放?

變量“圖像”可以保留或自動釋放,具體取決於它所采用的代碼路徑。

我認為問題是沃爾特已經說過的。 在你的代碼中,有些東西是在主線程之外完成的。

在崩潰日志中,您可以看到有人正在從非UI線程的某些UI元素上設置外觀(UIAppearance)。 那就是問題所在。 此操作必須僅在UI(主)線程中完成。

我相信這與UIAppearance方法的組合以及從后台線程啟動UIRemoteViewController有關。 我們的應用中遇到了同樣的問題。 我將更改我們的演示者類,以顯示主線程中的所有遠程viewControllers,看看是否有幫助。

在你的情況下,我猜Facebook SDK中的某些東西是從后台線程中呈現的東西。

在我確認我的修復工作正常后,我會更新。

這是iOS 6和社交框架中的一個錯誤,請在這里查看答案UINavigationBar外觀和Facebook-Sheet Bug

怎么解決這個?

只需使用[UINavigationBar appearanceWhenContainedIn:...]而不是使用[UINavigationBar appearance] [UINavigationBar appearanceWhenContainedIn:...]

您可以為導航控制器使用自定義類(例如CustomNavigationController),然后將其應用於外觀:

[UINavigationBar appearanceWhenContainedIn:[CustomNavigationController class], nil]

從我的實驗中,它應該用於所有appearance方法,不僅是UINavigationBar ,還有UIBarButtonItem等(在你發送appearance消息的每個對象上)

我想你知道什么是顯而易見的,但我遇到過這個錯誤,它是一個NSMutableArray,在for..in語句中枚舉時發生了變異。

看看NSMutableArray,你會發現你的錯誤。

順便說一下,如果您定位ios6,為什么不使用本機Facebook實現的社交框架?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM