开发者社区 问答 正文

IOS集成语音识别SDK,推到后台10min后,重新进入crash

我集成了IOS语音识别SDK,调用了语音识别start方法后,把APP推到后台10min左右,重新进入语音识别界面发生了crash,我用你们的NIsDemo进行了同样操作,也是会crash,请问是什么原因导致?下面是错误码:

2019-07-02 16:23:05.163526+0800 PCAuto[11680:2784550] [IMFBase] 捕捉到应用崩溃日志:[Application Receive SIGPIPE Signal]

 (

    "0   libsystem_platform.dylib            0x00000001fdfb59e0 <redacted> + 40",

    "1   libsystem_kernel.dylib              0x00000001fdf3337c mach_msg + 72",

    "2   CoreFoundation                      0x00000001fe339ad8 <redacted> + 236",

    "3   CoreFoundation                      0x00000001fe334974 <redacted> + 1396",

    "4   CoreFoundation                      0x00000001fe3340e0 CFRunLoopRunSpecific + 436",

    "5   GraphicsServices                    0x00000002005ad584 GSEventRunModal + 100",

    "6   UIKitCore                           0x000000022b584c00 UIApplicationMain + 212",

    "7   PCAuto                              0x0000000100fcca88 main + 124",

    "8   libdyld.dylib                       0x00000001fddf2bb4 <redacted> + 4"

)

展开
收起
游客y56ee6k6cgy2u 2019-07-10 18:04:10 592 分享 版权
阿里云 AI 助理回答

根据您提供的错误日志和问题描述,崩溃的原因可能与iOS应用在后台运行时的资源管理机制有关。以下是详细分析和解决方案:


问题原因分析

  1. SIGPIPE信号导致崩溃
    错误日志中显示[Application Receive SIGPIPE Signal],这表明应用尝试向一个已经关闭的管道(socket)写入数据,从而触发了系统发送的SIGPIPE信号。

    • 在语音识别场景中,SDK通常会通过WebSocket或其他网络连接与服务器通信。当应用进入后台时,iOS可能会暂停或限制网络连接,导致连接被关闭。
    • 当应用重新进入前台并尝试继续使用已关闭的连接时,就会触发SIGPIPE信号,进而导致崩溃。
  2. 后台处理未正确配置
    iOS SDK默认仅支持前台处理。如果未对后台模式进行配置,应用进入后台后可能会暂停录音或网络连接,导致语音识别服务中断。

    • 您提到将应用推到后台约10分钟后重新进入,这种长时间的后台运行可能导致语音识别服务的连接被系统回收或中断。
  3. NIsDemo同样崩溃
    您提到官方示例工程NIsDemo也出现了同样的问题,这进一步表明问题可能与SDK的默认配置或iOS系统的后台限制有关。


解决方案

1. 配置后台模式

为了支持语音识别在后台运行,需要对iOS工程进行以下配置:
- 步骤1:添加后台模式权限
Info.plist文件中添加Required background modes配置,并设置以下值:
- App plays audio or streams audio/video using AirPlay
这允许应用在后台继续播放音频或处理音频流。

  • 步骤2:修改录音模块行为
    默认情况下,SDK在应用进入后台时会停止录音。为了避免这种情况,需要修改录音模块的实现:
    • 找到NLSVoiceRecorder.m文件中的_appResignActive接口,确保在该接口中不调用停止录音的方法

2. 处理SIGPIPE信号

为了避免因SIGPIPE信号导致的崩溃,可以在应用启动时忽略该信号:
- 代码示例
AppDelegate.mapplication:didFinishLaunchingWithOptions:方法中添加以下代码:

#import <signal.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 忽略SIGPIPE信号
    signal(SIGPIPE, SIG_IGN);
    return YES;
}

这样可以防止因向已关闭的连接写入数据而导致的崩溃。

3. 检查语音识别连接状态

在应用从后台返回前台时,建议检查语音识别服务的连接状态,并在必要时重新初始化SDK:
- 代码示例

- (void)applicationWillEnterForeground:(UIApplication *)application {
    // 检查语音识别连接状态
    if ([_nui isInitialized]) {
        [_nui nui_release];
    }
    // 重新初始化SDK
    NSString *initParam = [self genInitParams];
    [_nui nui_initialize:[initParam UTF8String] logLevel:LOG_LEVEL_VERBOSE saveLog:NO];
}

这可以确保语音识别服务在应用返回前台时处于正常状态。

4. 调试和验证

完成上述修改后,请按照以下步骤验证问题是否解决:
1. 将应用推到后台并保持一段时间(如10分钟)。
2. 重新进入语音识别界面,观察是否仍然发生崩溃。
3. 如果问题仍未解决,请检查是否有其他后台任务或资源占用导致冲突。


重要提醒

  • 避免敏感信息泄露
    确保在代码中未硬编码app_keyak_idak_secret等敏感信息,以免造成资费损失或安全风险。
  • 真机测试
    建议在真机上进行测试,因为模拟器可能无法完全模拟后台行为。

通过以上步骤,您可以有效解决因后台运行导致的语音识别崩溃问题。如果仍有疑问或需要进一步支持,请随时联系阿里云技术支持团队。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答