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スタックは、この時点で呼び出されたスレッドの呼び出しを意味します。2 つの異なるクラッシュの 2 つの例を次に示します。 ここに画像の説明を入力 ここに画像の説明を入力

ご協力いただきありがとうございます

4

7 に答える 7

2

アプリケーションで多くの実験を行い、Facebook SDK ソースを調べた後、次の 3 つのことに気付きました。

  1. 自分で作成SLComposeViewControllerしても役に立ちません。Facebook SDK はこれで非常に単純です。それは、ボーナス付きの回答のコードとまったく同じようにコントローラーを作成するだけです。

  2. FB セッションを承認しているときに、アプリケーションが 1 回以上非アクティブ化されます。これは、権限確認アラートが表示されることが原因です。

  3. UIRemoteViewController、実際にはSLComposeViewController別のプロセスで実行される です。

エラーの原因は何ですか?

  1. ユーザーは FB 権限を確認します
  2. これがトリガーapplicationDidBecomeActive:
  3. また、FB コールバックをトリガーして、ダイアログを表示します。
  4. applicationDidBecomeActive:は、FB ダイアログが表示されたときに行われるはずのないことを UI で行っていました (テーブルのリロードをトリガーしています)。

また、注意すべきことがもう 1 つあります。 のハンドラはpresentShareDialogModallyFrom...、特定のスレッドでは呼び出されません (SLComposeViewControllerドキュメントを参照)。つまりdispatch_async(dispatch_get_main_queue(), ...)、ハンドラーから UI を更新する場合は、ハンドラーから使用する必要があります。

編集:明らかに、前の手順でいくつかのクラッシュが修正されましたが、クラッシュの 1 つが解決されませんでした。UIAppearanceApple Developer フォーラムを何度もグーグル検索して検索した結果、リモート コントローラーに接続して を使用している iOS 6 、特に の外観にバグがあると思いますUINavigationBarUIApperance現在、アプリからの使用を削除しています。

于 2013-06-24T08:57:23.780 に答える
1

問題はウォルトがすでに言ったことだと思います。あなたのコードでは、何かがメインスレッドの外で行われています。

クラッシュログでは、誰かが非UIスレッドからのUI要素の外観(UIAppearance)を設定していることがわかります。それが問題です。この操作は、UI(メイン)スレッドでのみ実行する必要があります。

于 2013-02-19T08:45:11.767 に答える
1

申し訳ありませんが、これはかなり推測ですが、試してみると思いました:

非 UI スレッドから canPresentShareDialogWithSession を安全に呼び出すことができますか?

_NSDictionaryEnumerate の両方のスタックに行があります。より高い機能から、何かが enumerateKeysAndObjectsUsingBlock: を呼び出しているように見えます。

[presentShareDialogModallyFrom:sender] の直後にクラッシュしたというメモに基づいています。送信者のビューが消えると、何かが解放されますか?

変数 "image" は、それが取ったコード パスに応じて、保持されるか自動解放されます。

于 2013-02-19T08:14:06.080 に答える
1

これは、UIAppearance メソッドの組み合わせと、バックグラウンド スレッドからの UIRemoteViewController の起動に関係していると思います。アプリでも同じ問題が発生しています。プレゼンター クラスを変更して、すべてのリモート viewController をメイン スレッドから表示し、それが役立つかどうかを確認します。

あなたの場合、Facebook SDK の何かがバックグラウンド スレッドから何かを提示していると思います。

修正が機能することを確認したら、更新します。

于 2013-03-04T20:08:48.787 に答える
1

これは、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

必要に応じて、ここにビデオがあります。

于 2013-02-17T13:18:49.757 に答える
-2

明らかなことはご存知だと思いますが、私はこのエラーに一度遭遇しました。これは、 for..in ステートメント内で列挙されている間に変更された NSMutableArray でした。

NSMutableArray を見ると、エラーが見つかります。

ところで、ios6 をターゲットにするなら、Facebook ネイティブ実装のソーシャルフレームワークを使ってみませんか?

于 2013-02-16T00:53:35.610 に答える