2014-10-01 11 views
4

我是很新的xamarin的iOS程序,所以這可能是一個愚蠢的問題..獲取的iOS客戶端來SignalR請求做出響應時,應用程序被轉到後臺

背景: 我正在做一個應用程序,應該發送向事件地點的特定範圍內的用戶發出警報。 Sinc的incidens可以發生「任何地方」,geofencing不是一種選擇。我嘗試過使用遠程通知,但我只需提醒處於事件範圍內的客戶端,而不要打擾其他客戶端(距離事件太遠)。這意味着我首先必須獲取所有用戶的當前位置,並通知那些在範圍內的位置。所以我想也許SignalR可能是一個解決方案。

如何在ios應用程序(iOS 7和8)響應來自SignalR集線器的請求時(如用戶按下手機上的主頁按鈕以使應用程序不再位於前景中)。我需要能夠請求客戶端在服務器請求時將其當前位置發送回服務器。我可能會補充說客戶端會將重要的位置更改發送回服務器,因此應用程序已啓用後臺任務。

我已經設置了集線器發送的getLocation請求:

public void SendLocationRequest() 
{ 
    Clients.Others.locationRequestReceived(); 
} 

論viewDidLoad方法客戶端:

_client.OnLocationRequestReceived += 
      (sender, message) => InvokeOnMainThread(() => LocRequestReceived()); 

和LocReuestReceived(我剛設置它,以顯示現在的本地通知):

void LocRequestReceived() 
    { 
     var notification = new UILocalNotification 
     { 
      FireDate = DateTime.Now.AddSeconds(1), 
      AlertAction = "Get Location", 
      AlertBody = "Should retrieve currentLocation", 
      ApplicationIconBadgeNumber = 1, 
      SoundName = UILocalNotification.DefaultSoundName 
     }; 
     UIApplication.SharedApplication.ScheduleLocalNotification(notification); 
    } 

只要應用程序位於前臺,在手機上,但沒有任何反應,當應用程序被bacground。 (轉到後臺運行,當它工作在模擬器上,但migh是在模擬器中的錯誤見http://krumelur.me/2014/09/23/my-ios8-adventure-as-a-xamarin-developer/

我quess我的問題是,即時通訊調用InvokeOnMainThread(()=> LocRequestReceived()),在那裏我也許應該在後臺線程上調用它? 正如我所說,我剛開始xamarin iOS開發,所以任何輸入非常讚賞。

回答

0

我結束了一個稍微不同的方法。我使用本地CFStream來建立持久的tcp連接而不是SignalR。

public CFReadStream readStream; 
public CFWriteStream writeStream; 
public void Connect() 
{ 
    if (readStream == null) { 
     CFStream.CreatePairWithSocketToHost ("SERVER_ADDRESS", "PORT", out readStream, out writeStream); 
     ConfigureStream (readStream); 
     //Added handler for streamevents 
     ..... 
     readStream.Open(); 
    } 
} 

使得數據流是即使應用在背景執行開放,這是必不可少的(除了添加必要的背景模式中的Info.plist):

void ConfigureStream(CFStream stream) 
    { 
     var nsstream = new NSStream (stream.Handle); 
     if (stream.GetType() == typeof(CFReadStream)) { 
      **nsstream [NSStream.NetworkServiceType] = NSStream.NetworkServiceTypeVoIP;** 
     } 
    } 
+0

你說你的應用程序這是一個VOIP應用程序,不是嗎?這不符合蘋果的規定嗎? – HenningK 2015-03-23 07:52:12

+0

是的,但客戶可以在Enterprise Developer帳戶下發布應用程序並且不在AppStore上。由於對於應用程序能夠在不提醒用戶的情況下響應服務器請求而言至關重要,我想沒有其他方法(至少據我所知)。 – 2015-03-24 22:23:39

相關問題