PJSIP:将iOS应用程序移动到后台然后移动到前台

时间:2017-10-02 21:19:52

标签: ios iphone voip pjsip

我有一个使用PJSIP v2.3.0的iOS VOIP应用程序。

在iOS 11发布之后,我在下面看到了很多崩溃的实例。我有与我的应用程序集成的结构(crashlytics),这是崩溃的线程的回溯。

Crashed: Thread
0  libsystem_kernel.dylib         0x186819348 __pthread_kill + 8
1  libsystem_pthread.dylib        0x18692d354 pthread_kill$VARIANT$mp + 396
2  libsystem_c.dylib              0x186788fd8 abort + 140
3  libsystem_c.dylib              0x18675cabc basename_r + 314
4  MyApp                          0x101a2ab58 pj_sockaddr_get_port + 10115892
5  MyApp                          0x101a24e28 udp_on_read_complete + 10092036
6  MyApp                          0x1019bba74 ioqueue_dispatch_read_event + 9661008
7  MyApp                          0x1019bd1f0 pj_ioqueue_poll + 9667020
8  MyApp                          0x101a08788 pjsip_endpt_handle_events2 + 9975652
9  MyApp                          0x1019df334 worker_thread + 9806608
10 MyApp                          0x1019cf274 thread_main + 9740880
11 libsystem_pthread.dylib        0x18692c32c _pthread_body + 308
12 libsystem_pthread.dylib        0x18692c1f8 _pthread_body + 310
13 libsystem_pthread.dylib        0x18692ac38 thread_start + 4

线程因pj_sockaddr_get_port

上的断言而崩溃
PJ_ASSERT_RETURN(a->addr.sa_family == PJ_AF_INET ||
             a->addr.sa_family == PJ_AF_INET6, (pj_uint16_t)0xFFFF);

注意:PJ_ENABLE_EXTRA_CHECK为我的应用定义为0,所以PJ_ASSERT_RETURN在这里只是PJ_ASSERT。

导致这次崩溃的PJSIP日志告诉了一些有趣的事情。该应用程序是后台运行的,它会取消注册。当应用程序在几分钟后进入前台时,它会尝试注册。

我看到以下警告消息,同时crashlytics报告了上面提到的带有回溯的崩溃。

2017-09-28 21:00:11 TID=50691 [pjsua] Log Level-1 : 16:00:11.267     ioq_select  Error replacing socket: Invalid argument
2017-09-28 21:00:11 TID=50691 [pjsua] Log Level-1 : 16:00:11.267     udp0x10de7f3a0  Warning: pj_ioqueue_recvfrom: [err 120009] Bad file descriptor
2017-09-28 21:00:11 TID=50691 [pjsua] Log Level-1 : 16:00:11.267     udp0x10de7f3a0  Warning: pj_ioqueue_recvfrom: [err 120009] Bad file descriptor
.
.
.
2017-09-28 21:00:18 TID=50691 [pjsua] Log Level-1 : 16:00:15.256     udp0x10de7f3a0  Warning: pj_ioqueue_recvfrom: [err 120057] Socket is not connected
2017-09-28 21:00:18 TID=50691 [pjsua] Log Level-1 : 16:00:15.256     udp0x10de7f3a0  Warning: pj_ioqueue_recvfrom: [err 120057] Socket is not connected
2017-09-28 21:00:18 TID=50691 [pjsua] Log Level-1 : 16:00:15.256     udp0x10de7f3a0  Warning: pj_ioqueue_recvfrom: [err 120057] Socket is not connected
.
.
.
2017-09-28 21:00:18 TID=50691 [pjsua] Log Level-1 : 16:00:18.262 udp0x10de7f3a0  Warning: pj_ioqueue_recvfrom: [err 120038] Socket operation on non-socket
2017-09-28 21:00:18 TID=50691 [pjsua] Log Level-1 : 16:00:18.262 udp0x10de7f3a0  Warning: pj_ioqueue_recvfrom: [err 120038] Socket operation on non-socket
2017-09-28 21:00:18 TID=50691 [pjsua] Log Level-1 : 16:00:18.262 udp0x10de7f3a0  Warning: pj_ioqueue_recvfrom: [err 120038] Socket operation on non-socket

根据我的理解,udp_on_read_complete中的旋转循环会出现这些警告消息。 iOS可以重新声明pjsip尝试使用的套接字吗?

有没有人碰到过这次车祸?任何类型的指针/指南都是最受欢迎的。

1 个答案:

答案 0 :(得分:4)

我所做的修复只是在replace_udp_sock()失败时从pjlib / src / pj / ioqueue_common_abs.c中的ioqueue_dispatch_read_event方法返回。崩溃发生了,因为忽略了错误并且使用错误的套接字调用了on_read_complete。

我做的改变:

rc = replace_udp_sock(h);
if (rc != PJ_SUCCESS) {
  PJ_LOG(3, (THIS_FILE, "UDP socket replacement failed with error status %d", rc));
  if (has_lock) {
      pj_ioqueue_unlock_key(h);
  }
  return;
}

请告诉我这是否能为您解决问题。