已签名公证的Mac应用启动时遭Gatekeeper拦截jna*.tmp文件求助
JNA临时文件触发Gatekeeper验证失败的解决方案
这个问题的核心是JNA在运行时会动态生成未签名的临时本地库文件(即你看到的jna7223640233751603426.tmp),这类文件不在你应用的签名公证范围内,因此被Gatekeeper拦截。以下是可行的解决办法:
1. 禁用JNA临时文件生成(推荐)
通过设置JNA的系统属性,强制它使用你已签名公证的本地库文件,不再生成临时文件:
- 在应用启动时添加JVM参数:
-Djna.nosys=true - 或者在代码中提前设置:
System.setProperty("jna.nosys", "true"); - 同时将JNA的本地库(比如
libjnidispatch.dylib)打包到应用的Contents/Frameworks目录下,确保这个库已经和主应用一起完成了签名和公证。
2. 重新完整签名并公证应用包
如果你的应用包存在嵌套文件未签名的情况,也可能导致Gatekeeper对运行时生成的文件更敏感。可以重新执行完整的签名和公证流程:
- 签名整个应用包(包括所有嵌套框架和库):
codesign --deep --force --sign "Developer ID Application: 你的开发者ID (XXXXXX)" YourApp.app - 将应用打包成zip后重新提交公证:
ditto -c -k --sequesterRsrc --keepParent YourApp.app YourApp.zip xcrun notarytool submit YourApp.zip --keychain-profile "你的公证配置文件" --wait - 公证完成后,给应用加盖时间戳:
xcrun stapler staple YourApp.app
3. 备选方案:替换JNA动态生成逻辑
如果修改JNA配置有困难,可以考虑直接调用已签名的本地库,替代JNA的动态生成机制,但这个方案开发成本较高,仅作为最后备选。
内容的提问来源于stack exchange,提问作者Long Trịnh Hoàng Phạm
相关产品推荐
相关产品推荐

