我通过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,并且我注意到我没有得到任何响应(后台任务未被调用)。
有人知道什么是错的(或者缺少什么)?
答案 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
。在这种情况下,您可能会发现错误。
答案 1 :(得分:0)
最后,我找到了解决问题的方法:
通过此更改,我可以部署并使其在我的应用程序和Edge扩展程序之间运行本机消息传递。