Я занимаюсь разработкой приложения для iPhone, в котором используются push-уведомления Apple.На стороне iPhone все хорошо, на стороне сервера у меня проблема.Уведомления отправляются правильно, однако, когда я пытаюсь запросить службу обратной связи, чтобы получить список устройств, с которых приложение было удалено, я всегда получаю ноль результатов.Я знаю, что должен получить один результат, поскольку приложение было удалено с одного из моих тестовых устройств.После 24 часов и более у меня все еще нет результатов от службы обратной связи ..
Есть идеи?Кто-нибудь знает, сколько времени понадобится службе обратной связи, чтобы распознать, что мое приложение было удалено с моего тестового устройства?
Примечание. У меня есть еще одно приложение push-уведомлений на устройстве, поэтому я знаю, что мое приложение не единственное.
Код - C #:
public static string CheckFeedbackService(string certaName, string hostName)
{
SYLogger.Log("Check Feedback Service Started");
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
// Create a TCP socket connection to the Apple server on port 2196
TcpClient tcpClientF = null;
SslStream sslStreamF = null;
string result = string.Empty;
//Contect to APNS& Add the Apple cert to our collection
X509Certificate2Collection certs = new X509Certificate2Collection { GetServerCert(certaName) };
//Set up
byte[] buffer = new byte[38];
int recd = 0;
DateTime minTimestamp = DateTime.Now.AddYears(-1);
// Create a TCP socket connection to the Apple server on port 2196
try
{
using (tcpClientF = new TcpClient(hostName, 2196))
{
SYLogger.Log("Client Connected ::" + tcpClientF.Connected);
// Create a new SSL stream over the connection
sslStreamF = new SslStream(tcpClientF.GetStream(), true,ValidateServerCertificate);
// Authenticate using the Apple cert
sslStreamF.AuthenticateAsClient(hostName, certs, SslProtocols.Default, false);
SYLogger.Log("Stream Readable ::" + sslStreamF.CanRead);
SYLogger.Log("Host Name ::"+hostName);
SYLogger.Log("Cert Name ::" + certs[0].FriendlyName);
if (sslStreamF != null)
{
SYLogger.Log("Connection Started");
//Get the first feedback
recd = sslStreamF.Read(buffer, 0, buffer.Length);
SYLogger.Log("Buffer length ::" + recd);
//Continue while we have results and are not disposing
while (recd > 0)
{
SYLogger.Log("Reading Started");
//Get our seconds since 1970 ?
byte[] bSeconds = new byte[4];
byte[] bDeviceToken = new byte[32];
Array.Copy(buffer, 0, bSeconds, 0, 4);
//Check endianness
if (BitConverter.IsLittleEndian)
Array.Reverse(bSeconds);
int tSeconds = BitConverter.ToInt32(bSeconds, 0);
//Add seconds since 1970 to that date, in UTC and then get it locally
var Timestamp = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(tSeconds).ToLocalTime();
//Now copy out the device token
Array.Copy(buffer, 6, bDeviceToken, 0, 32);
string deviceToken = BitConverter.ToString(bDeviceToken).Replace("-", "").ToLower().Trim();
//Make sure we have a good feedback tuple
if (deviceToken.Length == 64 && Timestamp > minTimestamp)
{
SYLogger.Log("Feedback " + deviceToken);
result = deviceToken;
}
//Clear array to reuse it
Array.Clear(buffer, 0, buffer.Length);
//Read the next feedback
recd = sslStreamF.Read(buffer, 0, buffer.Length);
}
SYLogger.Log("Reading Ended");
}
}
}
catch (Exception e)
{
SYLogger.Log("Authentication failed - closing the connection::" + e);
return "NOAUTH";
}
finally
{
// The client stream will be closed with the sslStream
// because we specified this behavior when creating the sslStream.
if (sslStreamF != null) sslStreamF.Close();
if (tcpClientF != null) tcpClientF.Close();
//Clear array on error
Array.Clear(buffer, 0, buffer.Length);
}
SYLogger.Log("Feedback ended ");
return result;
}