2016-03-16 29 views
5

我試圖通過MQTT-Client-Framework連接到我們的推送服務器。MQTT客戶端框架保持在後臺運行

連接到服務器沒有任何複雜性,只需連接幾行代碼即可連接到服務器並訂閱主題。

但我有幾個問題,我找不到任何直接的答案。

1)我如何讓我的客戶端在後臺運行?

2)設備重啓後會發生什麼?設備重啓後如何自動連接服務器?

3)假設我在連接服務器時出錯。這個庫會試圖在循環中連接嗎?它嘗試多少次?或者我需要自己管理這個?

4)訂閱主題相同的3場景?

回答

2

根據我在MQTT客戶端框架上的經驗,以下是您的問題/疑問的答案。我希望它能夠澄清您的疑慮,並幫助您繼續前進。

1)我如何讓我的客戶端在後臺運行?

  • 您不能讓您的MQTT客戶端在後臺運行,因爲Apple不允許任何應用程序在後臺長時間保持運行。雖然如果您覆蓋它不能保證您的應用程序將繼續在後臺運行。你可以在apple documentation.
  • 瞭解更多關於後臺執行支持的信息。另請參閱issue發佈在github上給定的框架。

2)設備重啓後會發生什麼?設備重啓後如何自動連接服務器?

  • 每次您的應用程序開始執行時,您都需要使用MQTT客戶端框架連接到您的服務器,MQTT客戶端框架中沒有可用的自動連接機制。我建議寫在初始化特定控制器的連接,你的應用程序啓動,除了相同AppDelegate

3)假設我連接到服務器的過程中得到了一個錯誤後立即執行。這個庫會試圖在循環中連接嗎?它嘗試多少次?或者我需要自己管理這個?

  • 如果MQTT客戶端無法連接服務器,您需要自己處理,庫不會嘗試自動在前面的回答中提到連接。我寫了如下的示例代碼。使用NSTimer自動連接到服務器。

    [self.mqttSession connectToHost:MQTT_HOST port:MQTT_PORT usingSSL:NO connectHandler:^(NSError *error) 
    { 
        if(error) 
        { 
         // Application fail to connect to server, write your code to auto connect here 
        } 
    }]; 
    

4)同樣的情景3訂閱主題?

  • 如果您的代理服務器具有配置以跟蹤個人用戶/客戶端的現有訂閱,那麼您不需要每次都訂閱。
  • 否則每次需要在成功連接時訂閱相同的主題。使用以下MQTTSessionDelegate方法進行訂閱。

    - (void)connected:(MQTTSession *)session 
    

編碼愉快:)

+0

這幾乎是所有的答案,並基於它我不能保持連接喲我的服務器在後臺,但像電報的乘客,他們做什麼來保持連接到他們的服務器? – mehdok

+2

他們不保持連接在後臺,他們發送每個新消息的'APNS'推送通知,通知用戶有關新消息。這兩件事並行工作,他們通過MQTT以及通知服務發送消息。 –

+0

tnx很多,這是我需要的。但有沒有什麼黑客保持連接在後臺?注意:我不介意蘋果是否會批准應用程序商店,該應用程序已在組織間使用。 – mehdok

0

關於第一個問題:如何在iOS上的後臺運行

細節可以發現here。此鏈接還列出了Apple允許在後臺運行的操作,如果您的應用不符合這些條件,那麼它可能會被Apple拋出應用商店。

該列表還顯示了哪些UIBackgroundModes放置在Info.plist中,以標記您的應用需要後臺訪問。

其他3我不能

+0

我想你忘了把鏈接:) – mehdok

+0

鏈接應該有現在 – hardillb

+0

確定,在鏈路他們說,在後臺模式下啓用推送通知是不夠,並且'application:didReceiveRemoteNotification:fetchCompletionHandler:'將在接到通知時被調用。我相信這是針對APN的,這是否適用於自定義庫? – mehdok

1

1)項目 - > Capabilities->背景模式幫助。有一些選項可以讓您的應用在後臺運行。

2)一般來說,如果您的應用程序允許在後臺運行,MQTT將不會與服務器斷開連接,但我認爲您最好檢查連接並在應用程序變爲MQTT時重新連接MQTT再次激活。

AppDelegate->- (void)applicationDidBecomeActive:(UIApplication *)application;

3)不幸的是,是的,它會的。你必須管理自己。

4)我忍不住。

+0

後臺模式在有限的時間內工作(3到10分鐘),我需要儘可能保持連接到服務器。 – mehdok