2012-01-31 61 views
3

我想實現一個跨平臺的移動客戶端(安卓,PC - 寫在的Java和iOS寫在Objective-C的)之間雙向通信和我的谷歌的AppEngine(的Java)服務器。它應該:與客戶端的GAE雙向通信(針對Java/iOS客戶端或XMPP的通道API備選方案)?

  1. 允許雙方發起通信(客戶端連接後)。 (對每X秒輪詢是有問題的,並且據我瞭解,由於它位於AppEngine上,長輪詢http請求不是一種選擇)。
  2. 支持消息最多幾KB的文本,通常要小得多。

我已經考慮在一些反向工程Java客戶端上使用Channel API,但是這似乎是一個機會(因爲它沒有官方支持)。另外,我甚至不確定Objective-C是否有解決方案,我不希望自己潛入並實施它。

然後我考慮使用XMPP。但是,我不確定如果沒有我的用戶輸入一個Jabber帳戶,我不能這樣做(通信在後臺)。有沒有辦法爲我的客戶創建一個臨時用戶?

C2DM似乎也不是一個好選擇。它不是跨平臺的,它似乎非常注重「通知」而不是通信,並且不能保證消息傳輸的成功。

或者也許有一種完全不同的方法我沒有想到?這種類型的溝通對我來說是比較新的。

謝謝!

編輯:

因爲我在尋找後臺通信,一個新的選項浮現在腦海:一個XMPP用戶,以資源爲客戶標識符。這意味着,我將爲我的應用程序創建一個XMPP用戶(類似於:「[email protected]」),並讓客戶端將其自己的唯一ID作爲資源連接(「[email protected]/UNIQUEID」 )。這種方法是否存在缺陷或嚴重的安全缺陷?

+0

對於從服務器到客戶端的通信,您是否考慮過第三方推送解決方案,例如http://beaconpush.com/? – 2012-01-31 09:30:32

+0

謝謝。我還沒有找到符合上述所有要求的解決方案。具體來說,糾正我,如果我錯了,但beaconpush旨在網頁(使用JavaScript等),而我需要與我的本機應用程序的溝通。 – DannyA 2012-01-31 09:59:21

+0

我承認根據你的問題,我沒有從本機客戶端使用beaconpush,但我得到了他們的底層API是REST API的印象,編寫與其API通信的客戶端應該適用於允許HTTP請求的本地環境。我在他們的開源貢獻頁面http://beaconpush.com/guide/contributions/上看到了一個輕量級的C#客戶端,所以我認爲Objective-C和Java的客戶端是可能的。 – 2012-01-31 10:12:58

回答

2

兩個選項,我能想到的:

  • 你可以在你的Java應用程序中嵌入一個HTML頁面,並使用通道API爲其匿名端點。然後在收到消息時向您的應用發送信號。這不會受到Channel API實施方式的變化的影響。
  • 如果您想使用XMPP API,那麼您需要某種XMPP帳戶纔是正確的。您可以考慮在AWS或其他地方運行一個非常簡單的XMPP服務器,並將您的客戶端連接到該服務器;那麼您可以將App Engine應用程序的消息發送到您自己的服務器上的地址。 ejabberd似乎是選擇的服務。
+0

OP在Google應用引擎上,本地支持XMPP。 – rds 2012-01-31 14:23:32

+0

問題是,如果您使用App Engine中的XMPP,則需要一個帳戶來發送XMPP消息_to_。他說他不想使用用戶現有的Jabber帳戶,因爲郵件應該在後臺發送(大概不會在其他客戶端顯示,或者需要從應用程序登錄Jabber等)。因此,解決此問題的方法是運行一個非常簡單的XMPP服務,該服務處理客戶端可以連接到的匿名端點,並且可以從App Engine的XMPP API進行尋址。 – 2012-01-31 14:59:01

+0

我現在明白了這個問題。不過,我不明白中間的ejabberd是如何起作用的。我很失望地發現XMPP沒有「隱形」消息(最接近的是type =「headline」,但是一個兼容的客戶端應該顯示該消息) – rds 2012-01-31 15:10:48

0

XMPP似乎是您最好的選擇,但您需要配置您的服務器以允許匿名客戶端解決註冊問題。

我不確定你是什麼意思,任何一方發起通信雖然。 XMPP將要求客戶端通過連接到服務器來啓動,但在此之後,它可以自發地接收消息。當然,如果意圖是服務器向客戶端發送未經提示的消息,那麼如何知道沒有某種客戶端身份(這意味着某種形式的註冊)的客戶端?

+0

對於「啓動通訊」感到困惑。你完全正確。這只是爲了強調我需要一種雙向通信方法,而不是「推送通知」或者僅僅是客戶端http請求。我會澄清這個問題。謝謝! – DannyA 2012-02-01 10:58:42