Mac 端《英雄联盟》更新后打不开?一行命令搞定
Mac 上更新完《英雄联盟》后弹出「The application League of Legends can't be opened」?这是拳头公司更新器搞坏了 App 代码签名导致的老问题。一条命令就能修。
如果你在 Mac 上更新过《英雄联盟》,然后被一个 “The application League of Legends can’t be opened” 的弹窗劝退过,别慌,不是你一个人。这是每次打补丁后反复出现的老毛病,跟你的 Mac 没坏、安装也没损坏一毛钱关系都没有。
到底发生了什么
拳头的更新器更新游戏时,会改动 App bundle 里面的文件——但改完之后没有重新给外层的壳 App 签名。macOS 会用 Gatekeeper(门卫)通过校验代码签名来判断 App 有没有被篡改。签名对不上,macOS 就直接拒绝启动这个 App。
想确认是不是这个问题,在终端跑一下:
spctl --assess --type execute "/Applications/League of Legends.app"
如果输出类似下面这样:
/Applications/League of Legends.app: invalid resource directory
(directory or signature have been modified)
那就是 Gatekeeper 把你的 App 拦下了。
解决办法
终端里跑一条命令就行:
codesign --force --deep --sign - "/Applications/League of Legends.app"
这条命令用 ad-hoc 方式给外层 App bundle 重新签了个名,macOS 看到就放行了。内部真正的游戏客户端 LeagueClient.app 上面拳头的签名是正常的——这条命令只修外面那层坏掉的壳。
就这么简单。重新打开《英雄联盟》,应该能正常启动了。
为什么这事儿老是发生
你在「应用程序」文件夹里看到的 League of Legends.app 其实只是一个很薄的壳。真正的可执行文件在这里:
League of Legends.app/Contents/LoL/LeagueClient.app
启动 App 时,外壳会先拉起 LeagueClient,再交给 Riot Client,最后由 Riot Client 管理实际游戏。拳头每次更新后都会规规矩矩给里面的 LeagueClient.app 重新签名,但外壳因为内容被改过,签名就废了。macOS 一看签名对不上,连启动都不让启动,直接拦。
速查
以后再有补丁把它搞坏了,直接跑:
codesign --force --deep --sign - "/Applications/League of Legends.app"
不用重装。不用重启。两秒钟搞定。