使用PJSIP进行SIP注销

时间:2011-09-22 20:53:12

标签: iphone ios ipad sip pjsip

在我们的应用中,我们需要在用户将应用推送到后台时取消注册。 我们正在使用PJSIP。我的applicationDidEnterBackground:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"did enter background");


     __block UIBackgroundTaskIdentifier bgTask;

     bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];


    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self deregis];        
        [application endBackgroundTask: bgTask]; //End the task so the system knows that you are done with what you need to perform
        bgTask = UIBackgroundTaskInvalid; //Invalidate the background_task
        NSLog(@"\n\nRunning in the background!\n\n");

    });
     }

deregis方法如下:

- (void)deregis {
    if (!pj_thread_is_registered())
    {
        pj_thread_register("ipjsua", a_thread_desc, &a_thread);
   }    
    dereg();

}

de-reg方法如下:

void dereg()
{
    int i;
    for (i=0; i<(int)pjsua_acc_get_count(); ++i) {
        if (!pjsua_acc_is_valid(i))
             pjsua_buddy_del(i);

        pjsua_acc_set_registration(i, PJ_FALSE);
    }
}

当我们将应用程序推送到后台时,会调用dereg。但是当服务器发回401质询时,堆栈不会在SIP呼叫中发回auth详细信息,直到我将应用程序带回前台。 有谁知道为什么会这样?

谢谢, Hetal

1 个答案:

答案 0 :(得分:1)

您不希望在后台线程中结束后台任务:

e.g。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self deregis];        
    // don't do below...
    // [application endBackgroundTask: bgTask]; //End the task so the system knows that you are done with what you need to perform
    // bgTask = UIBackgroundTaskInvalid; //Invalidate the background_task
    NSLog(@"\n\nRunning in the background!\n\n");

});

您希望在更新注册时结束后台任务。所以你需要挂钩pjsua on_reg_state回调。

e.g。此示例可能只假设一个取消注册,对于多个帐户,您必须等到所有未注册

-(void) regStateChanged: (bool)unregistered {
    if (unregistered && bgTask != UIBackgroundTaskInvalid) {
        [application endBackgroundTask: bgTask]; //End the task so the system knows that you are done with what you need to perform
        bgTask = UIBackgroundTaskInvalid; //Invalidate the background_task
    }
}