NSSetUncaughtExceptionHandler被第三方SDK劫持

时间:2013-05-08 14:57:40

标签: iphone ios objective-c cocoa-touch cocoa

编辑:对于那些想知道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 < / strong>永远不会被召唤。

//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

做了什么

3 个答案:

答案 0 :(得分:0)

这可能是因为您的WeirdAnalyticsSDK向服务器发送了崩溃报告,overridse发送了uncaughtExceptionHandler

使用hockeyapp SDK时发生在我身上。我在调试模式下忽略了sdk的init行,一切正常。

您还应该检查WeirdAnalyticsSDK是否有enable debug mode个标记。

答案 1 :(得分:0)

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

  • 我们应该通过发送msg到第三个sdk来注册第三个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);
}

```

答案 2 :(得分:-1)

我也有这个问题。

您只需在任意一次电话<?php class Login extends MY_Controller{ public function index() { $this->load->helper('form'); $this->load->view('public/admin_login'); } public function admin_login() { $this->load->library('form_validation'); $this->form_validation->set_rules('username','User Name','required|alpha|trim'); $this->form_validation->set_rules('password','Password','required'); $this->form_validation->set_error_delimiters("<p class='text-danger'>","</php>"); if($this->form_validation->run() ) { $username = $this->input->post('username'); $password = $this->input->post('password'); $this->load->model('loginmodel'); $login_id = $this->loginmodel->login_valid($username , $password); if($login_id) { $this->session->set_userdata('user_id','login_id'); return redirect('admin/dashboard'); } else { echo "password dont match"; } } else { $this->load->view("public/admin_login"); } } } 之后调用NSSetUncaughtExceptionHandler即可。这是示例代码。

NSSetUncaughtExceptionHandler