2

编辑:对于那些想知道 SDK 是什么的人,它是 Flurry 的中文克隆,==>> Umeng。

编辑 2:在那个奇怪的 SDK 中实际上有一个禁用崩溃日志处理选项,这将使我的uncaughtExceptionHandler再次被调用。但我仍然对 SDK 一开始是如何做到这一点非常感兴趣。

我正在使用一些第三方 iOS 分析 SDK。奇怪的发现:

最初(在添加 SDK 之前),我的 appDelegate.m 中有一个UncaughtExceptionHandler。它工作得很好。每当在真实 iDevice 上测试时发生异常时,它都会将一些日志打印到控制台。

//Worked like charm before I added that weird analytics SDK
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

然后我添加了那个奇怪的分析 SDK(我所做的只是将 .a lib 放到我的项目中,并在我的 appDelegate.m 中添加一行,如下所述),然后突然之间,我的uncaughtExceptionHandler永远不会被调用。

//To make sure my uncaughtExceptionHandler was not set a second time by that SDK,
//I set and reset again, before and after I initialized that weird SDK
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
[WeirdAnalyticsSDK startWithAppkey:@"XXX_XXX_XXX_XXX"];
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

事实证明,无论我做什么,只要我在我的 appDelegate 中初始化了那个 SDK,我的uncaughtExceptionHandler就不会在发生异常时被调用。

有人能帮助我吗?那个奇怪的 SDK 到底对我的uncaughtExceptionHandler做了什么?

4

3 回答 3

0

这可能是因为您WeirdAnalyticsSDK将崩溃报告发送到服务器overridse并且uncaughtExceptionHandler.

它发生在我使用hockeyapp SDK. 我在调试模式下忽略了 sdk 的初始化行,一切正常。

您还应该检查您WeirdAnalyticsSDK是否有一些enable debug mode标志。

于 2013-05-08T15:07:16.323 回答
0

好的,我们应该挂钩第三个 SDK 使用的处理程序。

  • 我们应该通过向第三个 sdk 发送 msg 来注册第三个 sdk 的 ExceptionHandler。
  • 我们保存第三个 sdk 使用的处理程序。使用“NSGetUncaughtExceptionHandler”获取处理程序。
  • 我们通过“NSSetUncaughtExceptionHandler”处理异常。第四,我们使用函数“UncaughtExceptionHandlerMaple”自行处理异常
  • 在 UncaughtExceptionHandlerMaple 函数中,我们应该通过 --- "_previousHandler(exception)" 执行第三个 sdk 处理程序

```

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //register the third sdk
    // save the handler by the third SDK
    _previousHandler = NSGetUncaughtExceptionHandler();
    // setting the handler for yourself
    NSSetUncaughtExceptionHandler (&UncaughtExceptionHandlerMaple);
}

void UncaughtExceptionHandlerMaple(NSException *exception) {
    //handle yourself logic for the exception
    //code ...
    //recover the third sdk's exception handle
    _previousHandler(exception);
}

```

于 2018-02-01T10:46:53.380 回答
-1

我也有这个问题。

您只需要NSSetUncaughtExceptionHandler在任何可能的一次调用之后调用NSSetUncaughtExceptionHandler。这是示例代码。

static void myExceptionHandler(NSException *exception) {

    /* do your logic of exception handler */

    // invoke WeirdAnalyticsSDK's exception handler if needed
    [UIApplication sharedApplication].delegate.hijackedHandler(exception);
}

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    /* configure WeirdAnalyticsSDK which maybe call `NSSetUncaughtExceptionHandler` */

    // remember to claim property hijackedHandler in header file
    self.hijackedHandler = NSGetUncaughtExceptionHandler();

    // make sure you call `NSSetUncaughtExceptionHandler` after any possible one call NSSetUncaughtExceptionHandler
    NSSetUncaughtExceptionHandler(&myExceptionHandler);
    return YES;
}
于 2016-10-09T08:57:37.300 回答