[英]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源代碼后,我意識到了三件事:
自己創建SLComposeViewController
沒有幫助。 Facebook SDK非常簡單,它只是創建控制器,就像答案中的代碼一樣。
授權FB會話時,應用程序將被停用一次或多次。 這是由出現的權限確認警報引起的。
UIRemoteViewController
實際上是SLComposeViewController
,它在不同的進程中運行。
是什么原因造成我的錯
applicationDidBecomeActive:
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.