使用 Electron 访问 macOS 照片库
Access macOS Photo Library using Electron
我正在尝试编写一个 Electron 应用程序,让用户可以在 macOS 上从他们的照片库中 select 照片。我的假设是访问照片而不导出照片的唯一方法是进入 ~/Pictures/Photos Library.photoslibrary
。但是,当将照片的文件路径传递给 <img>
标签时,出现 net::ERR_ACCESS_DENIED
错误。
有没有办法授予 Electron 应用程序访问用户照片库的权限?
我最近一直在编写访问照片库的代码。我通过编写一个调用 PhotoKit API 的本机模块来做到这一点。如果你朝那个方向走,学习曲线会很陡峭,因为你可能会使用 Objective-C++ 以及 C++ 和 Objective-C 的特性和怪癖,同时尝试在 [=38] 中编写一些东西=].
https://github.com/nodejs/node-addon-api
https://developer.apple.com/documentation/photokit?language=objc
使用 Apple 最近的安全功能,您还需要以某种方式 运行 应用程序内部的代码,并在其 Info.plist 中设置正确的权利和值,以允许访问 APIs.
在build/entitlements.mac.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- https://github.com/electron/electron-notarize#prerequisites -->
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<!-- https://github.com/electron-userland/electron-builder/issues/3940 -->
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<!-- Allow app to access Photos Library using PhotoKit API -->
<key>com.apple.security.personal-information.photos-library</key>
<true/>
</dict>
</plist>
您的应用 Info.plist 中需要以下内容:
<plist version="1.0">
<dict>
...
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs access to the photos library</string>
</dict>
</plist>
这可以使用 electron-builder 完成,方法是将以下值添加到 package.json 中 mac 构建设置的 extendInfo extendInfo 中。
{
...
"build": {
...
"mac": {
...
"extendInfo": {
...
"NSPhotoLibraryUsageDescription": "This app needs access to the photos library"
}
}
}
}
我希望这能让您有所作为。正如我上面所说,除非您已经熟悉 JavaScript、本机模块开发、Objective-C、C++ 和 Apple 的 API,否则这将伴随着陡峭的学习曲线。
如果您只需要为 one-off 项目从中读取数据,照片库实际上只是一个 directory-like 照片容器,以及一个用于元数据(面孔、地点)的 sqlite 数据库和 albums/folders)。右键click-the图片库,显示包内容,原图为Masters/YYYY/MM/DD/IMG_XXXX.JPG格式,元数据为database/photos.db,可查询部分表为RKMaster(filename/uuid master files), RKAlbum, RKFace, RKMemory, RKPlace, RKFolder, RKVersion, RKKeyword, etc., get any free sqlite browser and you can figure the rest.
您也可以将.photolibrary 文件复制到Linux 并使用纯节点扫描其folder/sqlite 文件,您不需要任何本机模块来读取它。写入它可能会尝试触发一些似乎属于某些 macosx-proprietary 扩展的 sqlite 触发器,因此首先进行备份,尝试在禁用扩展的情况下写入,或者只是读取图像和元数据并将其提取为其他格式(原始 jpeg/json 某个地方的存储桶中的文件)很容易整理,然后(如果必须的话),一旦你得到容器内的表和文件系统路径之间的关系,就反转这个过程并写出到另一个照片库文件。 =10=]
我正在尝试编写一个 Electron 应用程序,让用户可以在 macOS 上从他们的照片库中 select 照片。我的假设是访问照片而不导出照片的唯一方法是进入 ~/Pictures/Photos Library.photoslibrary
。但是,当将照片的文件路径传递给 <img>
标签时,出现 net::ERR_ACCESS_DENIED
错误。
有没有办法授予 Electron 应用程序访问用户照片库的权限?
我最近一直在编写访问照片库的代码。我通过编写一个调用 PhotoKit API 的本机模块来做到这一点。如果你朝那个方向走,学习曲线会很陡峭,因为你可能会使用 Objective-C++ 以及 C++ 和 Objective-C 的特性和怪癖,同时尝试在 [=38] 中编写一些东西=].
https://github.com/nodejs/node-addon-api https://developer.apple.com/documentation/photokit?language=objc
使用 Apple 最近的安全功能,您还需要以某种方式 运行 应用程序内部的代码,并在其 Info.plist 中设置正确的权利和值,以允许访问 APIs.
在build/entitlements.mac.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- https://github.com/electron/electron-notarize#prerequisites -->
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<!-- https://github.com/electron-userland/electron-builder/issues/3940 -->
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<!-- Allow app to access Photos Library using PhotoKit API -->
<key>com.apple.security.personal-information.photos-library</key>
<true/>
</dict>
</plist>
您的应用 Info.plist 中需要以下内容:
<plist version="1.0">
<dict>
...
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs access to the photos library</string>
</dict>
</plist>
这可以使用 electron-builder 完成,方法是将以下值添加到 package.json 中 mac 构建设置的 extendInfo extendInfo 中。
{
...
"build": {
...
"mac": {
...
"extendInfo": {
...
"NSPhotoLibraryUsageDescription": "This app needs access to the photos library"
}
}
}
}
我希望这能让您有所作为。正如我上面所说,除非您已经熟悉 JavaScript、本机模块开发、Objective-C、C++ 和 Apple 的 API,否则这将伴随着陡峭的学习曲线。
如果您只需要为 one-off 项目从中读取数据,照片库实际上只是一个 directory-like 照片容器,以及一个用于元数据(面孔、地点)的 sqlite 数据库和 albums/folders)。右键click-the图片库,显示包内容,原图为Masters/YYYY/MM/DD/IMG_XXXX.JPG格式,元数据为database/photos.db,可查询部分表为RKMaster(filename/uuid master files), RKAlbum, RKFace, RKMemory, RKPlace, RKFolder, RKVersion, RKKeyword, etc., get any free sqlite browser and you can figure the rest.
您也可以将.photolibrary 文件复制到Linux 并使用纯节点扫描其folder/sqlite 文件,您不需要任何本机模块来读取它。写入它可能会尝试触发一些似乎属于某些 macosx-proprietary 扩展的 sqlite 触发器,因此首先进行备份,尝试在禁用扩展的情况下写入,或者只是读取图像和元数据并将其提取为其他格式(原始 jpeg/json 某个地方的存储桶中的文件)很容易整理,然后(如果必须的话),一旦你得到容器内的表和文件系统路径之间的关系,就反转这个过程并写出到另一个照片库文件。 =10=]