2009-10-29 12 views
8

ブラウザをデスクトップアプリケーションのUIとして使用するにはどうすればよいですか?これまでに私が思いついたのは、...デスクトップUIのブラウザを使用

  1. すべてのHTML/Javascriptを使用してください。問題:ファイルシステムにアクセスすることはできません。
  2. アプリケーションの使用中にローカルWebサーバーを実行します。問題:ユーザーが終了したらどうやって殺すのですか?私のユーザーは技術的にCtrl + Cで十分ではありません。
  3. ブラウザコンポーネントを通常のGUIに埋め込みます。問題:埋め込まれたブラウザコンポーネントは、せいぜい不愉快になりがちです。 Javascript/CSSのサポートは、実際のブラウザと同じくらい良いものではありません。
  4. ...?

理想的な解決法は、どの技術でも機能します。 Firefox拡張機能の作成などのオプションがあることはわかっていますが、私はバックエンドの技術とブラウザの独立性を完全に自由にしたいと考えています。

+1

興味深い質問をする:私は、HTTP経由で利用できる「デスクトップアプリケーション」を検出するためのNPAPIプラグイン(Firefox、Chrome)を作成しています。 Avahi mdns Service Discoveryに基づいています。 – jldupont

+1

私はまた、この目標を達成するためにChromiumにいくつかの「バグ」をオープンしました。 – jldupont

答えて

2

IEでは、IEと同じレンダリングエンジンを使用するIE ActiveXコントロールを埋め込むことができます。 (これはプラスとマイナスです)ホストコードにScriptObjectプロパティを設定し、JavaScriptコードでwindow.externalという名前でアクセスして、Javascriptで実行できないことを行うことができます。

ローカルWebサーバーを実行している場合、アプリケーションには、Webセーバーを終了させる終了リンクがある可能性があります。

+0

私が問題を解明するのは、キルリンクを書く方法です。私は1つの解決策を思いついたが、それは非常にハッキーだ。私が試してきたサーバーはすべてPythonでしたが、どんな種類の具体的な例もすばらしいでしょう。 –

+0

もちろん、ユーザーが強制リンクをクリックしないことがあるという問題があります。 –

+0

Webブラウザーコントロールをホストすると、ホストアプリケーションが終了したときにサーバーを強制終了する可能性があります。それ以外の場合は、最後の要求後にサーバーを強制終了し、ユーザーがしばらくの間それを放置した場合にハートビートを送信することができます。または、あなたはそれを稼働させたままにすることができます。 – SLaks

1

対象とする必要があるOSについては言及していませんでした。しかし、プログラムでWebサーバを作成してから、デフォルトのブラウザを起動することができます。ユーザーがブラウザを終了してからWebサーバーをシャットダウンするまで待ちます。

たとえば、ウィンドウでは、CreateProcess()を使用して のプロセスを生成し、MsgWaitForMultipleObjects()を実行して実行が完了するまで待機することができます。

+0

OSの独立性も最高ですが、Windowsは私が取り組んでいるものです。これはうまくいくようです。ユーザーはブラウザを開いたままにして他のサイトを閲覧することができますが、少なくとも私は*結局*閉鎖されることを知っています。ブラウザが新しいブラウザではなく新しいタブでアプリを開くことを決定した場合でも問題が発生する可能性があります。私はFirefoxがコマンドラインから呼び出されたとしてもこれを行うと思います。 –

+2

ブラウザが閉じるのを待つと、待っていることは決してありません。現代のブラウザはすべてタブをサポートしているので、自分自身も含めて、24時間365日ブラウザを稼働させることができます。 – SLaks

+1

また、ブラウザがすでに起動している場合は、新しいプロセスを待つことさえありません。 – SLaks

8

ローカルWebサーバーの実行を選択すると、セキュリティ上のリスクが発生します。

あなたのアプリを知っている同じマシン上で実行されているウェブページは、Javascriptを使用してサーバーにリクエストを送信することができ、リクエストの内容を簡単かつ確実に知る方法はありません。 (refererヘッダーを信頼しないでください)

同様のアプローチを使用するGoogleデスクトップでは、Webページがディスク上のファイルを読み取ることを可能にする実際の脆弱性がいくつかあります。

これを防ぐにはいくつかの方法があります。各リクエストに、マシンごとにランダムに生成された(ある時点で期限切れになる)認証キーを必要とすることをお勧めします。これは、実際のページのソースに入れることができます。 XHRの保護により、悪意のあるWebサイトが認証キーを読み取ることを防ぎ、無害にします。

+1

ローカルサーバーは、実行中の同じマシンからの要求のみを受け入れるように設定できませんか? –

+0

はい;私は同じクライアント上のJavascriptがそのような要求を送信できることを意味しました。 – SLaks

+1

興味深い.... –

1

HTMLアプリケーション(HTA、略して)はしばらくありました。それらについてのすべてを読むことができますhere。基本的にHTMLとJavascriptで、ウィンドウを作成するオプションとローカルファイルシステムへのアクセス機能が追加されています。彼らはまさにあなたが望むものであるようです。これはMicrosoftの技術なので、Windowsシステム上のIEでのみ動作します。私は正常にこれを1年生にソフトウェアを配布するために使用されたCD-ROMのフロントエンドとして使用しました

もう1つのオプションはAdobe Airを使用することです。私はこの技術に精通しているわけではありませんが、ウェブページをデスクトップアプリケーションとして展開するためのフレームワークを提供しているようです。私はゲストとして2番目のリンクを投稿することはできませんが、それだけでgoogleとすぐにそれを見つけるでしょう。

+0

実際、これは私が望んでいないものです。「バックエンドの技術とブラウザの独立性を完全に自由にしたいからです。 –

4

キルリンク付きのPython Webサーバーをお探しの場合は、いつでもCherryPyを確認できます。あなたはおそらくメインのようなメソッドからテンプレートエンジンと負荷のテンプレートを使用することになり、通常のWebAppの中より http://tools.cherrypy.org/wiki/SingleClickAndRun

注:

import webbrowser 
import cherrypy 
import threading 

class MyApp: 
    """ Sample request handler class. """ 

    @cherrypy.expose 
    def index(self): 
     return """<html><head><title>An example application</title></head> 
<body> 
<h1>This is my sample application</h1> 
Put the content here... 
<hr> 
<a href="/exit">Quit</a> 
</body></html>""" 

    @cherrypy.expose 
    def exit(self): 
     raise SystemExit(0) 


class MyBGThread(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.start() 

    def run(self): 
     cherrypy.tree.mount(MyApp()) 
     cherrypy.quickstart() 

myThread = MyBGThread() 
webbrowser.open("http://127.0.0.1:8080") 

このコードはCherryPyにウェブサイト上SingleClickAndRunからのサンプルに基づいています。

グッドウィンドウにブラウザコントロールを埋め込み、アプリが終了するとサーバーを閉じるのがいいと思います。

セキュリティのために、認証方式を追加する可能性があります。 cherrypyでサポートされているものはいくつかありますが、ツールモジュールを使用して独自に実装することもできます。

+0

これは私が探しているものです。ありがとう。 –

4

私はRuby(Rubyを使うことにした理由は何通りか)だけで、まったく同じこと(デスクトップアプリケーションのGUIとして最新のHTML5/CSS3ブラウザを使用するデスクトップアプリケーション)を探しています。その数々のクロスプラットフォームライブラリの驚くべき数が生まれました。しかし、WebブラウザをデスクトップアプリのUIにしようとする試みは何もしていません。クロスプラットフォームの問題は...私は解決するとは言いませんが、私は正しい方向にいくつかのステップを取ると言います。

私には、これは新しいHTML5/CSS3標準が出てくるのに完璧です。私はそれがローカルに実行されているWebサーバーで実行できることを知っています。

別の方法は、「280 North」の人たちがやっていることをやっているようなものかもしれません。彼らは、Objective-J(Objective-Cが通常のCをどのように拡張するかを模倣する通常のJavaScriptの拡張版)とCappuccino(Objective-CのObjective-CのココアフレームワークのObjective-Jに相当)を開発しました。彼らはまた、Objective-JとCappuccinoのフレームワークがインターネットアプリケーションを構築するために、XcodeのAppleの「Interface Builder」の280 Northバージョンである「Atlas」を開発しました。 Atlasは、実際にデスクトップアプリとしてデスクトップ上で動作するカプチーノのウェブアプリです。この場合、ブラウザ(基本的には特殊なWebサーバー)の外でJSアプリケーションを開発するために、Narwhal ...クロスプラットフォーム、汎用、JavaScriptプラットフォームを使用します。

「ブラウザ、デスクトップアプリケーションへの直接接続」というアイデアが、Webサーバーを共存させずに作成でき、まだローカルFSを操作することができれば、私は非常に興味があります...うーん...これについて考えると、新しいGoogle Chromeプロジェクト「Native Client」を使ってこれを行うことができるのだろうかと思います。 NaCLは、あなたがWindowsプラットフォームに限定されているわけではないが(少なくとも今のところはGoogle Chromeブラウザに限定される)、Active Xによく似ている。 Sandboxingを介してセキュリティが追加されているだけですが、ローカルFSを操作することができます。もっと考えればするほど、それができると思われ始めます。

どのような考えですか?

関連する問題