边缘扩展本地通信和UWP

时间:2017-11-20 23:54:23

标签: c# uwp microsoft-edge

我通过Edge Extension在我的UWP应用程序中提供了一项新功能。 我用以下manifest.json

编写了一个Edge扩展
{
"name": "MyExtensionName",
"version": "1.0.0.0",
"description": "MyExtension description",
"author": "Me",
"icons": {
    "16": "icons/logo_16.png",
    "48": "icons/logo_48.png",
    "128": "icons/logo_128.png"
},
"browser_action": {
    "default_icon": {
        "20": "icons/logo_20.png",
        "40": "icons/logo_40.png"
    },
    "default_title": "MyTitle"
},
"permissions": [
    "contextMenus",
    "tabs",
    "storage",
    "activeTab",
    "<all_urls>",
    "nativeMessaging",
    "background"
],
"minimum_edge_version": "37.14316.1000.0",
"background": {
    "scripts": ["js/background.js"],
    "persistent": true
},
"content_scripts": [{
    "matches": ["http://*/*", "https://*/*"],
    "css": ["css/light.css"],
    "js": ["js/content.js"],
    "run_at": "document_end"
}]
}

我可以使用此

创建连接
var port = browser.runtime.connectNative("MyAppServiceName");

我试图与此沟通

port.postMessage({Text: "Hello"});

我没有收到任何错误,但我的UWP应用程序中的后台任务没有得到任何回复。我不明白为什么。

在我的应用程序的package.appmanifest中,我添加了以下代码:

<uap:VisualElements DisplayName="MyUWPAppName" 
                          AppListEntry="none"
                          Square150x150Logo="Assets\Square150x150Logo.png" 
                          Square44x44Logo="Assets\Square44x44Logo.png" 
                          Description="MyUWPApp description" 
                          BackgroundColor="transparent">

并在此

<uap:Extension Category="windows.protocol">
          <uap:Protocol Name="msghost1" />
        </uap:Extension>
        <uap:Extension Category="windows.appService" EntryPoint="MyAppService.Class1">
          <uap:AppService Name="MyAppServiceName" />
        </uap:Extension>
        <uap3:Extension Category="windows.appExtension">
          <uap3:AppExtension Name="com.test.edge.extension" 
                             Id="EdgeExtension" 
                             PublicFolder="Extension" 
                             DisplayName="ms-resource:DisplayName">
            <uap3:Properties>
              <Capabilities>
                <Capability Name="websiteContent" />
                <Capability Name="websiteInfo" />
                <Capability Name="browserStorage" />
              </Capabilities>
            </uap3:Properties>
          </uap3:AppExtension>
        </uap3:Extension>

AppService是在同一解决方案中作为项目添加的运行时组件。 它的代码很简单

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.ApplicationModel.AppService;
using Windows.ApplicationModel.Background;
using Windows.Foundation.Collections;

namespace MyAppService
{
    public sealed class Class1: IBackgroundTask
    {
        private BackgroundTaskDeferral backgroundTaskDeferral;
        private AppServiceConnection appServiceconnection;


        public void Run(IBackgroundTaskInstance taskInstance)
        {
            this.backgroundTaskDeferral = taskInstance.GetDeferral(); // Get a deferral so that the service isn't terminated.
            taskInstance.Canceled += OnTaskCanceled; // Associate a cancellation handler with the background task.

            // Retrieve the app service connection and set up a listener for incoming app service requests.
            var details = taskInstance.TriggerDetails as AppServiceTriggerDetails;
            appServiceconnection = details.AppServiceConnection;
            appServiceconnection.RequestReceived += OnRequestReceived;
        }

        private async void OnRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
        {
            // This function is called when the app service receives a request
        }

        private void OnTaskCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
        {
            if (this.backgroundTaskDeferral != null)
            {
                // Complete the service deferral.
                this.backgroundTaskDeferral.Complete();
            }
        }
    }
}

我尝试使用“不启动,但在启动时调试我的代码”选项调试AppService,并且我注意到我没有得到任何响应(后台任务未被调用)。

有人知道什么是错的(或者缺少什么)?

2 个答案:

答案 0 :(得分:0)

根据评论,您甚至无法成功运行官方样本,但实际上官方样本SecureInput确实有效。因此,我担心您没有以正确的方式测试项目。如果这些有用,请查看以下提示,但不建议在样本中使用:

  • 您的设备具有Windows 10 Creators Update或更高版本,因为Edge中的本机消息传递支持Creators Update。

  • 确保已启用扩展程序开发人员功能。在边缘输入about:flags,然后选择&#34;启用扩展程序开发人员功能&#34;。详情请参阅this article

  • 托管测试网页。通常我们需要一个测试网页来测试此功能,您可以将页面发布到IIS并像http://localhost/secureinput.html一样访问它。有关如何在IIS上构建静态网站的详细信息,请参阅this article

  • 首先调试扩展脚本以查看脚本是否有任何错误。有关如何调试,请参考Debugging extensions

在您的应用服务中,您没有处理收到的消息,也没有发回消息(OnRequestReceived)方法为无。您可以参考该示例以尝试更新。

因此,部署后,检查扩展是否已正确安装,您可以尝试访问Edge中扩展的后台页面。然后使用测试页面确保您可以调试content.js。在这种情况下,您可能会发现错误。

enter image description here

答案 1 :(得分:0)

最后,我找到了解决问题的方法:

    标签中的
  • 我必须使用Name =&#34; com.microsoft.edge.extension&#34;;
  • 我必须导入名称空间xmlns:rescap =&#34; http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" ;,而不添加一些功能;
  • 必须为x64平台完成构建和部署。

通过此更改,我可以部署并使其在我的应用程序和Edge扩展程序之间运行本机消息传递。