Windows应用商店应用 - 从辅助磁贴启动时执行单个任务

Pau*_*els 5 javascript microsoft-metro windows-8 winjs windows-store-apps

我有一个Windows应用商店应用程序,可以创建辅助磁贴.单击磁贴时,我希望应用程序执行,实际上是一个离线功能(也就是说,我不想回到应用程序,但希望应用程序执行某些操作然后退出).因此,在这种情况下,我想启动电子邮件客户端,例如.这是我到目前为止的地方:

app.addEventListener("activated", function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {

        if (args.detail.arguments !== "") {
            // Activation arguments are present that 
            // were declared when the secondary tile was pinned to Start.
            args.setPromise(WinJS.UI.processAll().done(function () {
                var emailaddress = args.detail.arguments;
                var promise = Email.SendNewMail.sendEmail(emailaddress);
                //promise.complete();
                return;
            }));

        } else if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
            // TODO: This application has been newly launched. Initialize
            // your application here.
        } else {
            // TODO: This application has been reactivated from suspension.
            // Restore application state here.
        }
...
Run Code Online (Sandbox Code Playgroud)

电子邮件功能:

    sendEmail: function sendEmail(addess, subject, body) {
        var mailto = new Windows.Foundation.Uri("mailto:?to=" + addess + "&subject=" + subject + "&body=" + body);
        return Windows.System.Launcher.launchUriAsync(mailto);
    }
Run Code Online (Sandbox Code Playgroud)

我当前得到的错误是"对象已与其客户端断开连接" - 我认为这是由于程序在promise完成之前退出而引起的.如何在WInRT中实现这种行为?

更新:

我已经收到了MS对此的反馈,以及他们的反应,如果这是否可能,它肯定是不受支持的,因为退出应用程序以编程方式违反了认证要求3.6.

Got*_*bbs 2

辅助磁贴似乎无意启动第三方应用程序:

\n\n
\n

辅助磁贴使用户能够将特定内容和深层链接\xe2\x80\x94a 引用到固定应用程序\xe2\x80\x94 内部的特定位置,从 Windows 应用商店应用程序应用程序 [原文如此] 到“开始”屏幕。

\n
\n\n

来源:http ://msdn.microsoft.com/en-us/library/windows/apps/hh465372.aspx

\n\n

我已经尝试了多种方法来纠正您的问题,但这里似乎存在时间问题。不调试时,您的上述代码(带或不带 Promise 完成函数调用,例如thendone不调试时,无论您是否将代码放入就绪、加载或激活事件中,

\n\n

然而,在我的测试中,我能够让它正常工作而不会出现错误然而,在我的测试中,通过以几种不同的方式包装您的启动函数,

\n\n
    \n
  1. 使用超时setTimeout超时时间超过 1 秒
  2. \n
  3. 通过消息对话框使用Windows.UI.Popups.MessageDialog
  4. \n
\n\n

两者都以您的承诺完成回调结束,并调用window.close();退出应用程序。

\n\n

使用八.js 的示例:(似乎是最干净的可用解决方案,但显然不会在后台执行启动,并且不是最用户友好的):

\n\n
Eight.Message.confirmAsync("Send the email?", function (doSend) {\n    if (!doSend) return;\n\n    Email.SendNewEmail.sendEmail(emailaddress).done(function (e) {\n        window.close();\n    });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:我认为这两种解决方案都很糟糕,而且我相信您会同意。两者实际上都没有在后台进行启动。我在任何地方都找不到任何文档来支持在不启动应用程序的情况下执行此操作。对我来说,这似乎是一个错误,如果可以的话,我会尝试打开一个技术支持事件以获得更干净的解决方案。如果没有,您可以尝试Windows 应用商店应用程序论坛,那里有一些真正的 Microsoft 人员。

\n