electron 我想添加我的电子应用程序到mac的,共享菜单扩展时,任何文件夹被点击

yfwxisqw  于 2023-06-20  发布在  Electron
关注(0)|答案(1)|浏览(165)

enter image description here显示的代码是build.config.json文件的一部分,我试图使用chat gpt的想法重建它,但我不认为这是实际的解决方案,它是如何完成的?或者有没有办法把我的应用程序添加到共享菜单扩展,任何人都可以参考我如何解决我的问题。先谢谢你了

"mac": {
        "icon": "static/xxx.png", 
        "category": "public.app-category.utilities",
        "target": "dmg",
        "hardenedRuntime": true,
        "gatekeeperAssess": true,
        "extendInfo": {
          "NSAppleEventsUsageDescription": "Let me use Apple Events.",
          "NSCameraUsageDescription": "Let me use the camera.",
          "NSScreenCaptureDescription": "Let me take screenshots.",
          "NSServices": [
          {
            "NSMenuItem": {
              "default": "Share with My App"
            },
            "NSMessage": "shareWithMyApp:",
            "NSSendTypes": [
              "NSStringPboardType"
            ],
            "NSReturnTypes": [
              "NSStringPboardType"
            ]
          }
        ]
        }
      }
e0bqpujr

e0bqpujr1#

您需要做的是编写一个**Share Extension**并将其包含在捆绑的应用程序中。根据我的经验(这可能不是最好的方法),我在xCode中构建了一个最小的共享扩展,并在我构建的应用程序中包含了生成的“.appex”包。我仍在努力解决我的尝试中的一些问题,这绝对是一个比向Info. plist添加一些值要复杂得多的过程。
你需要能够用Swift或Obj-C编写一些代码,正确的设计是让用户验证选定的文件,然后与扩展中的云服务“共享”,最好是独立于父应用程序。
我相信在iOS版本的共享扩展中,扩展是严重沙箱化的,只有某些共享资源可用。您应该能够访问共享密钥链资源和应用程序组文件。
下面是我在MacOS上的电子项目中包含共享扩展的肮脏方法。我知道其他人已经做过了,但这是我通过黑客攻击这个想法得出的结论。
我发现我可以将文件共享到扩展和父应用程序都可以访问的应用程序组文件夹。与iOS不同,MacOS允许子应用程序启动父应用程序,尽管没有参数。有了这些可用的资源,我使用xCode提供的模板编写了一个最小共享扩展。
我的扩展关闭共享对话框,就像用户按了发送按钮一样,并将接收到的URL写入应用程序组文件夹中的文件。我相信这在App Store中是不允许的,因为他们会强制执行某些模式。
我的扩展只是将URL写入以UUIDv 1值命名的文件中,允许我按接收顺序保存它们。在我写出这些文件之后,我启动我的应用程序,它会查找这些相同的文件(在launchsecond-instance上),并使用我已经编写的电子代码来处理命令行参数。
除了编写代码,您还需要编写Info.plist值,以帮助操作系统管理扩展。这是我的扩展Info. plist中的相关部分。

<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationSupportsAttachmentsWithMinCount</key>
            <integer>1</integer>
            <key>NSExtensionActivationSupportsText</key>
            <false/>
            <key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
            <integer>0</integer>
        </dict>
    </dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.share-services</string>
    <key>NSExtensionPrincipalClass</key>
    <string>$(PRODUCT_MODULE_NAME).ShareViewController</string>
</dict>

扩展名也应该有a bundle identifier signifying it's a relation to your parent app
您可能还希望在xCode中配置扩展的名称和图标,以便它在菜单中显示为所需的。
一旦构建了xCode项目,我就将生成的“.appex”复制到我的electron项目中(在本例中,路径为includes/mac/universal/PlugIns/Share.appex,它是我的electron-builder mac构建配置的一部分。在我的electron-builder.json中,相关条目看起来像这样。

{
  ...
  "mac": {
    ...
    "extraFiles": [
      {
        "from": "./includes/${os}/universal/PlugIns",
        "to": "PlugIns"
      }
    ]
  }
}

目前,我仍在努力克服一些奇怪的事情,这些事情阻止了我的扩展在系统上自动启用。
1.构建的应用程序必须在操作系统识别扩展之前运行。
1.我第一次让它工作时,需要在System Preferences > Extensions > Added ExtensionsSystem Preferences > Extensions > Share Menu中启用它。第一次之后,这些都被系统记住了。
1.虽然其他应用程序在这样做后在其菜单中有扩展,但我不得不重新启动Finder(重新启动或注销/登录)才能让它显示在Finder菜单中。
至于你的问题,特别是针对文件夹,我没有一个答案。This page in apple's documentation describes configuring the activation rules,虽然我看不出有什么帮助。您可以在从菜单中选择应用后进行筛选,但它仍会显示在非文件夹对象的菜单中。
我希望这是有意义的,并以某种方式帮助你或某人。黄色的盒子告诉我不要这样做,但是如果有人愿意教我们一个更好的,不那么黑客的方法来实现Electron应用程序的共享扩展,我会非常有兴趣听到这一切。

相关问题