在MacOS应用程序中嵌入Python

通过pyinstaller将python应用程序嵌入MacOS可可应用程序中

用于macOS核心的Mosaic Shapes用Python编写。 该UI用Objective-C编写,并通过NSTask和NSPipes与嵌套的Python应用程序进行通信。

由于产生的沙箱约束和代码签名问题,花了很多时间,咒骂和深夜才弄清楚如何将Python应用程序嵌套在Cocoa应用程序中。 我找不到在线全面的解决方案来解决我的问题。 我希望本演练对将来在搜索Google搜索结果的人中有所帮助。

从pyinstaller生成.app并将其嵌套在XCode中之后,通过NSTask调用python应用程序很简单。 但是,一旦准备好将应用程序提交给商店,就需要正确设置应用程序的沙箱权利并对该应用程序进行代码签名。 这就是噩梦通常开始的地方。

从这里下载python 2.7.13:
https://www.python.org/downloads/

下载pyinstaller:
http://www.pyinstaller.org/

一旦将应用程序沙箱化,MacOS的默认出厂python版本和Python的Hombrew / Cellar版本将出现代码签名问题。 嵌套python应用程序后,使用适当的沙盒权利对其进行签名,然后尝试调用您的python应用程序后,就会显示该错误。 您将收到崩溃消息,该崩溃消息给出了引用Python的古老代码签名错误。 (堆栈溢出)。

确保直接从python.org下载Python安装程序。 就我而言,我正在使用2.7.13(尚未使用Python 3进行测试)

下载并安装后,仔细检查默认的Python:

  guppy:〜dean $哪个python 
/Library/Frameworks/Python.framework/Versions/2.7/bin/python
guppy:〜院长$ python -version
Python 2.7.13

如果您使用的安装方式不是默认的python解释器,则可以明确指定要在python virtualenv中使用的python版本

  mkvirtualenv -python = /库/框架/Python.framework/版本/2.7/bin/python 

现在,打包您的python应用程序(替换为您的参数):

  python pyinstaller.py run.py -icon = icon-windowed.icns -clean -windowed -onefile -osx-bundle-identifier“ com.mosaic.mosaicshapes” 

注意 :请确保您已经准备好图标文件,否则pyinstaller将默认使用其自己的图标。 此外,将包ID替换为父应用程序的包ID。

将生成的应用程序嵌入XCode Resources文件夹(复制和粘贴/拖放生成的.app)

pyinstaller将生成一个Info.plist文件。 在XCode中导航到该文件,然后更改Executable File属性。 删除“ MacOS /”,仅保留可执行文件名称。 否则,iTunesConnect将在提交应用程序时在验证页面期间抱怨代码签名问题。

转到产品->存档,在XCode中存档您的应用程序。 导出存档而不重新签名应用程序。 这是最后一个选项:导出为macOS应用程序。

将使用您的应用程序创建目录。

很快我们就可以对应用程序进行签名和打包,但是在此之前,我们需要配置沙箱权利。

父母权利:

在XCode上启用沙箱时,将生成此文件。 您父母的权利清单可能与我的不同,这取决于您的申请要求。 Apple有相当详尽的文档,可帮助您度过一些最初的违规错误。

我已将此文件复制到我的codesign目录中,因此可以在下面的代码签名脚本中更轻松地引用它。 这是我们将用于签名的原始父母权利文件。 在我的情况下,我允许用户指定要转换为马赛克的照片,因此,我只有一个属性要为我的沙箱指定。

  guppy:〜dean $ cat〜/ Desktop / p.entitlements 




com.apple.security.app-沙盒

com.apple.security.files.user-selected.read-write


子权利是我们用来签署python应用程序的权利。

子权利只能包含两个属性以指定沙箱继承。 来自Apple文档“要启用沙箱继承,子目标必须恰好使用两个应用程序沙箱授权密钥: com.apple.security.app-sandboxcom.apple.security.inherit 。 如果指定其他任何应用程序沙盒授权,则系统将中止子进程。 但是,您可以通过iCloud和通知权利将其他功能授予子进程。”

  guppy:〜dean $ cat〜/ Desktop / c.entitlements 




com.apple.security.app-沙盒

com.apple.security.inherit


现在是时候签名和打包您的应用程序以提交到应用程序商店了。

我使用以下bash代码签名脚本对应用程序进行签名和打包。 确保根据您的需要更改参数:

“第三方Mac开发人员应用程序”用于Apple商店提交。
“开发人员ID应用程序”用于在Apple商店之外分发您的应用程序。 我想先与“开发人员ID应用程序”签名,以确保所有内容都能正确安装,然后再提交给商店。

将从当前工作目录中创建一个.pkg文件。 现在通过Application Loader上载此软件包! 如果您通过XCode上传二进制文件,它将使二进制文件签名,这将覆盖并排除我们为Python应用程序配置的权利。 因此,请使用Application Loader!

整个过程对吗?