5

我有一个创建辅助磁贴的 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.
        }
...

电子邮件功能在这里:

    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);
    }

我目前得到的错误是“对象已与其客户端断开连接” - 我认为这是由程序在承诺完成之前退出引起的。在 WInRT 中如何实现这种行为?

更新:

我从 MS 那里得到了反馈,如果这是否可行,他们的回应是肯定不支持的,因为以编程方式退出应用程序违反了认证要求 3.6。

4

2 回答 2

2

辅助磁贴似乎并非旨在启动第三方应用程序:

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

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

我尝试了多种方法来纠正您的问题,但这里似乎存在时间问题。不调试时,您的上述代码(有或没有像thenor之类的 Promise 完成函数调用done)对我来说每次都会失败,无论您是否将代码置于就绪、加载或激活事件中。

然而,在我的测试中,通过以几种不同的方式包装你的启动功能,我能够让它在没有错误的情况下工作:

  1. 超时使用setTimeout超过 1 秒的任何超时
  2. 使用消息对话框Windows.UI.Popups.MessageDialog

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

使用Eight.js作为消息传递路径的示例:(似乎是最干净的可用解决方案,但显然不会在后台执行启动,也不是最用户友好的):

Eight.Message.confirmAsync("Send the email?", function (doSend) {
    if (!doSend) return;

    Email.SendNewEmail.sendEmail(emailaddress).done(function (e) {
        window.close();
    });
});

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

于 2013-02-09T05:41:33.707 回答
0

那么你可以使用 的then()launchUriAsync()处理应用程序:

Email.SendNewMail.sendEmail(emailaddress).then(function (success) {
    if (success) {
        window.close()
    } else {
        // Display error message
    }
});
于 2013-02-08T16:32:10.210 回答