簡體   English   中英

將瀏覽器用於桌面 UI

[英]Using the browser for desktop UI

如何將瀏覽器用作桌面應用程序的 UI? 到目前為止,我想出的方法是......

  1. 使用所有 HTML/Javascript。 問題:無法訪問文件系統或其他任何東西。
  2. 在使用應用程序時運行本地網絡服務器。 問題:如何在用戶完成后殺死它? 我的用戶對 Ctrl+C 的技術不夠。
  3. 在常規 GUI 中嵌入瀏覽器組件。 問題:嵌入式瀏覽器組件充其量往往會出現故障。 對 Javascript/CSS 的支持從來沒有像在真正的瀏覽器中那樣好。
  4. ……?

理想的解決方案適用於任何技術。 我知道有一些選擇,比如編寫 Firefox 擴展,但我希望在后端技術和瀏覽器獨立性方面擁有完全的自由。

請注意,如果您選擇運行本地網絡服務器,則會造成安全風險。

在同一台機器上運行的任何網頁都知道您的應用程序,可以使用 JavaScript 向您的服務器發送請求,而您沒有簡單可靠的方法來了解請求的來源。 (不要相信referer標頭)

使用類似方法的 Google 桌面存在多個實際漏洞,允許任何網頁讀取磁盤上的任何文件。

有幾種方法可以防止這種情況發生; 我建議要求每個請求都有一個每台機器隨機生成的身份驗證密鑰(並在某個時候到期),您可以將其放入實際頁面的源代碼中。 XHR 保護將阻止惡意網站讀取身份驗證密鑰,從而使它們無能為力。

如果您正在尋找帶有 Kill 鏈接的 Python Web 服務器,您可以隨時查看 CherryPy。

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 示例: http ://tools.cherrypy.org/wiki/SingleClickAndRun

請注意,在普通 WebApp 中,您可能會使用模板引擎並從 main 等方法加載模板。

在 gui 窗口中嵌入瀏覽器控件並在應用程序退出時關閉服務器,這將是一件好事。

為了安全起見,您可能會添加一個身份驗證方案。 cherrypy 支持一些,但您也可以使用工具模塊實現自己的。

我正在尋找完全相同的事情(桌面應用程序使用最新的 HTML5/CSS3 瀏覽器作為桌面應用程序的 GUI),僅使用 Ruby(我決定使用 Ruby 的各種原因)。 人們想出的跨平台庫的數量令人驚訝。 但是,很少有人甚至沒有人嘗試將 Web 瀏覽器變成桌面應用程序 UI。 跨平台問題......好吧,我不會說已解決,但我會說朝着正確方向采取的幾個步驟。

對我來說,隨着新的 HTML5/CSS3 標准的出現,這將是完美的。 我知道這可以通過在本地運行的 Web 服務器來完成。

另一種方式可能就像來自“280 North”的人如何做他們所做的那樣。 他們開發了 Objective-J(常規 JavaScript 的擴展,模仿了 Objective-C 如何擴展常規 C)和 Cappuccino(Objective-J 相當於在 MAC 上的 Objective-C 的 Cocoa 框架工作)。 他們還為他們的 Objective-J 和 Cappuccino 框架開發了“Atlas”,這是 280 North 版本的 Apple“Interface Builder”的 Xcode 版本,用於構建 Internet 應用程序。 Atlas 實際上是一個 Cappuccino Web 應用程序,作為桌面應用程序在您的桌面上運行。 在這種情況下,他們使用 Narwhal……一個跨平台、通用的 JavaScript 平台,用於在瀏覽器之外開發 JS 應用程序(基本上是一個專門的 Web 服務器)。

如果有人能想出一個想法,讓“瀏覽器,直接連接到桌面應用程序”在不需要 Web 服務器共存的情況下工作,並且仍然可以操作本地 FS,我會非常感興趣......嗯..現在想起來,不知道能不能用谷歌Chrome新項目“Native Client”來做到這一點。 NaCL 與 Active X 非常相似,只是您不限於 Windows 平台(但將限於 Google Chrome 瀏覽器,至少目前如此)。 只有通過沙箱增加了安全性,但你可以操縱本地FS……我越想,我就越懷疑它可以做到。

有什么想法嗎?

在 Windows 中,您可以嵌入 IE ActiveX 控件,它使用與 IE 相同的渲染引擎。 (這是一個優點也是一個缺點)您可以在主機代碼中設置ScriptObject屬性,並在 Javascript 中以window.external訪問它,以執行 Javascript 無法執行的操作。

如果您運行本地網絡服務器,則應用程序中可能有一個退出鏈接,可以殺死網絡服務器。

您沒有提到您需要定位的操作系統。 但是您可以創建一個程序狀態的 Web 服務器,然后啟動默認瀏覽器。 等待瀏覽器被用戶終止,然后關閉 Web 服務器。

因此,例如在 Windows 上,您可以使用 CreateProcess() 來生成進程,然后使用 MsgWaitForMultipleObjects() 等待它完成執行。

HTML 應用程序(簡稱 HTA)已經存在一段時間了。 您可以在此處閱讀有關它們的所有信息。 它們基本上是 HTML 和 Javascript,帶有一些額外的選項來創建窗口和訪問本地文件系統。 它們似乎正是您想要的。 這是微軟的技術,所以這只適用於 Windows 系統上的 IE。 我已經成功地將它用作 CD-ROM 的前端,該 CD-ROM 用於向一年級學生分發軟件

另一種選擇是使用 Adob​​e Air。 我不太熟悉這項技術,但它似乎提供了一個框架來將網頁部署為桌面應用程序。 我不能以訪客身份發布第二個鏈接,但只需谷歌一下,你很快就會找到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM