cocos2d-js的折腾之旅

1,017 阅读2分钟

项目中添加有游戏一直使用的 cocos2d-x 进行开发,老游戏还是用 c++ 开发,后续的游戏都使用cocos2d-js开发,但是iOS上就问题不断。

记录下当前 iOS app 上进行过的操作, cocos 的版本 3.17.2

  1. 为了优化编译和打包速度,把cocos项目的两个proj单独生成了.a静态库 QQ20211210-162321.png

  2. 接入乐播SDK,因为符号冲突(和cocos带的openssl), 在 cocos 替换 openssl 的符号并重新生成了一份

oIk0eO.png

  1. 因为使用 web api 播放声音,导致静音开启的时候没有声音... iPad 上的表现和 iPhone 不同,需要修改 webview 的配置

    if (@available(iOS 13.0, *)) {
        WKWebpagePreferences *preferences = [[WKWebpagePreferences alloc] init];
        preferences.preferredContentMode = WKContentModeMobile;
        config.defaultWebpagePreferences = preferences;
    }
    

    c++ 那部分还是原生代码, 修改cocos源码

    // CDAudioManager.m
    if (!configured) {
        //Set defaults here
        //configuredMode = kAMM_FxPlusMusicIfNoOtherAudio;
        configuredMode = kAMM_MediaPlayback;
    }
    

    js 部分依赖注入代码,开启一段音频来实现 how to force wkwebview to ignore hardware silent switch on ios

  2. 尝试修复部分crash日志,绝大部分都是c++静态变量(非指针)析构导致的问题. 这里比如 static AppDelegate 如果没有修改为static AppDelegate * s_sharedApplication = nullptr; 直接杀死app就会有一条crash日志, 另外的修改也是调整源码里的内容, 从当时2%的奔溃率掉到了现在0.35%....还有些不知道怎么处理

QQ20211210-162519.png

  1. js游戏播放本地录制的录音需要开启跨域, 这里 server 用的是 CocoaHTTPServer
@interface DDGameHTTPFileResponse : HTTPFileResponse
@end

@implementation DDGameHTTPFileResponse
- (NSDictionary *)httpHeaders {
    return @{
        @"Access-Control-Allow-Origin": @"*",
    };
}
@end
  1. 录音后声音输出改为了听筒而不是扬声器. 最开始使用重置 category 的方式 ,但是只在 iOS 15 上生效.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

后面经过分析, 导致上面现象的问题在于 webview 的声音在别的进程, 应该反其道而行之, 关闭自身的音频node.

[[AVAudioSession sharedInstance] setActive:NO error:nil];