项目中添加有游戏一直使用的 cocos2d-x 进行开发,老游戏还是用 c++ 开发,后续的游戏都使用cocos2d-js开发,但是iOS上就问题不断。
记录下当前 iOS app 上进行过的操作, cocos 的版本 3.17.2
-
为了优化编译和打包速度,把cocos项目的两个proj单独生成了.a静态库
-
接入乐播SDK,因为符号冲突(和cocos带的openssl), 在 cocos 替换 openssl 的符号并重新生成了一份
-
因为使用 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
-
尝试修复部分crash日志,绝大部分都是c++静态变量(非指针)析构导致的问题. 这里比如
static AppDelegate如果没有修改为static AppDelegate * s_sharedApplication = nullptr;直接杀死app就会有一条crash日志, 另外的修改也是调整源码里的内容, 从当时2%的奔溃率掉到了现在0.35%....还有些不知道怎么处理
- js游戏播放本地录制的录音需要开启跨域, 这里 server 用的是
CocoaHTTPServer
@interface DDGameHTTPFileResponse : HTTPFileResponse
@end
@implementation DDGameHTTPFileResponse
- (NSDictionary *)httpHeaders {
return @{
@"Access-Control-Allow-Origin": @"*",
};
}
@end
- 录音后声音输出改为了听筒而不是扬声器. 最开始使用重置 category 的方式 ,但是只在 iOS 15 上生效.
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
后面经过分析, 导致上面现象的问题在于 webview 的声音在别的进程, 应该反其道而行之, 关闭自身的音频node.
[[AVAudioSession sharedInstance] setActive:NO error:nil];