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

私はあなたの問題を修正するためにいくつかの方法を試しましたが、ここでタイミングの問題が発生しているようです. thenデバッグしていないとき、コードを準備完了、ロード済み、またはアクティブ化されたイベントに配置しても、上記のコード (またはのような Promise 完了関数呼び出しの有無にかかわらずdone) は毎回失敗します。

ただし、私のテストでは、いくつかの異なる方法で起動関数をラップすることで、エラーなしでこれを機能させることができました。

  1. setTimeout1秒以上のタイムアウトで使用するタイムアウト付き
  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 ストア アプリ フォーラムを試してみてください。

于 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 に答える