2013-05-16 39 views
1

我一直在從Windows Azure實施蘋果推送通知。我能夠連接到APNS服務器並使用證書進行身份驗證。當我將流寫入服務器時,我沒有得到任何異常。但由於奇怪的原因,該設備沒有收到通知。該應用程序已註冊推送通知。我不確定問題是什麼。有什麼辦法可以檢查我發送給APNS服務器的通知是否有效,或者即使APNS服務器已經發送了通知給應用程序?以下是我的代碼。Windows Azure中的APNS

我也明白,如果有一個測試,工作代碼這是一個比這

APPLEHOST = "gateway.sandbox.push.apple.com"; 
     APPLEPORT = 2195; 

private void InitializeAPN() 
    { 
     applePushNotificationClient = new TcpClient(APPLEHOST, APPLEPORT); 
     sslStream = new SslStream(applePushNotificationClient.GetStream(), false); 

     try 
     { 
      sslStream.AuthenticateAsClient(APPLEHOST, APPLE_CLIENT_CERT_COLLECTION, SslProtocols.Tls, false); 
     } 
     catch (AuthenticationException ex) 
     { 
      Trace.WriteLine("Could not open APN connection: " + ex.ToString()); 
     } 

     Trace.WriteLine("APN connection opened successfully."); 
    } 

public void SendAPNMessage(string message, string deviceID) 
    { 
     try 
     { 
      MemoryStream memoryStream = new MemoryStream(); 

      BinaryWriter binaryWriter = new BinaryWriter(memoryStream); 

      // construct the message 

      binaryWriter.Write((byte)0); 
      binaryWriter.Write((byte)0); 
      binaryWriter.Write((byte)32); 

      // convert to hex and write 

      byte[] deviceToken = new byte[deviceID.Length/2]; 


      for (int i = 0; i < deviceToken.Length; i++) 
      { 
       deviceToken[i] = byte.Parse(deviceID.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber); 
      } 

      binaryWriter.Write(deviceToken); 

      // construct payload within JSON message framework 

      var json = new JArray(new JObject(new JProperty("aps", new JObject(new JProperty("alert", message), new JProperty("badge", 1))))).ToString(); 

      byte[] payloadBytes = System.Text.Encoding.UTF8.GetBytes(json); 

      // write payload data 
      binaryWriter.Write((byte)0); 
      binaryWriter.Write((byte)payloadBytes.Length); 
      binaryWriter.Write(payloadBytes); 
      binaryWriter.Flush(); 

      // send across the wire 

      byte[] array = memoryStream.ToArray(); 

      sslStream.Write(array); 

      sslStream.Flush(); 
     } 
     catch (Exception ex) 
     { 
      Trace.WriteLine(ex.ToString()); 
     } 

     Trace.WriteLine("Message successfully sent."); 

    } 

回答

1

更好的實現您正在使用簡單的二進制格式,不返回錯誤響應。

您應該切換到增強的二進制格式,您可以在其中發送(除了簡單的API發送的內容)消息ID和終止時間,並且可以讀取來自套接字的錯誤響應。

Apple推送通知指南是recently updated,現在他們甚至沒有提及簡單的格式,所以可能不再支持。

+0

感謝您指導我的文章,但有沒有什麼辦法可以在C#中共享一些示例代碼?因爲我還不確定如何處理APNS服務器可能發送的錯誤響應。因爲即使我發送的二進制格式是錯誤的,它也不會發送任何錯誤響應。 – Bitsian

+0

舊格式從不發送錯誤消息。至於C#示例代碼,請嘗試[Push Sharp](https://github.com/Redth/PushSharp)。 – Eran

+0

推夏普似乎是一個方便的圖書館。任何想法,如果我可以使用它的商業應用程序?這是麻省理工學院的許可證嗎?它被稱爲「Apache PushSharp版權所有2012年Apache軟件基金會」,這是否意味着我不能用於商業目的? – Bitsian