Сертификат APN Production не распознается PushSharp

Я разработал приложение для iOS, которое получает push-уведомления. Я отправляю их из среды .NET с помощью PushSharp. При разработке все прошло прекрасно, и Push'ы были успешно отправлены:

var push = new PushBroker();
var appleCert = File.ReadAllBytes(@"Utils\Cert.Development.p12");
push.RegisterAppleService(new ApplePushChannelSettings(false, appleCert, "*******"));
push.QueueNotification(new AppleNotification()
    .ForDeviceToken(token)
    .WithContentAvailable(1)
);
push.StopAllServices();

Теперь приложение одобрено и находится в AppStore. Я создал правильный производственный сертификат:

var push = new PushBroker();
var appleCert = File.ReadAllBytes(@"Utils\Cert.Production.p12");
push.RegisterAppleService(new ApplePushChannelSettings(true, appleCert, "*******"));
push.QueueNotification(new AppleNotification()
    .ForDeviceToken(token)
    .WithContentAvailable(1)
);
push.StopAllServices();

но когда я пытаюсь отправить push из PushSharp, он выдает следующее исключение:

You have selected the Production server, yet your Certificate does not appear to be the Production certificate! Please check to ensure you have the correct certificate!

Я почти уверен, что выполнил все шаги. Я скачал производственный сертификат, который был связан с файлом подготовки, установленным в приложении для публикации. Открыл его и экспортировал .p12.

Я также уверен, что не случайно использую версию для разработки, потому что, если я установлю PushSharp для разработки, используя этот последний сертификат, он выдаст следующую ошибку:

You have selected the Development/Sandbox (Not production) server, yet your Certificate does not appear to be the Development/Sandbox (Not production) certificate! Please check to ensure you have the correct certificate!

Как может сертификат быть ни разработкой, ни производством?

Где-то я могу проверить файл? Пожалуйста, дайте мне немного информации по этому вопросу, так как я понятия не имею, с чего начать.


person LcSalazar    schedule 13.02.2015    source источник
comment
У меня такая же проблема. Где вы можете заставить его работать? Вы пробовали отключить проверку сертификата?   -  person snowCrabs    schedule 16.03.2015
comment
Какая это была версия PushSharp? 2.Х.Х?   -  person Adam Mendoza    schedule 05.10.2016


Ответы (9)


Apple изменила название. Перейдите в ApplePushChannelSettings.cs и измените имя, как показано ниже.

От

if (production && !subjectName.Contains("Apple Production IOS Push Services"))

To

if (production && !subjectName.Contains("Apple Push Services"))

Мне нужно сделать это, когда я вчера обновлял сертификат с истекшим сроком действия. Измените имя, перестройте его и загрузите на сервер, после чего он снова заработает.

person TPG    schedule 11.01.2016
comment
Можете ли вы указать, где этот файл существует или где редактировать? Я использую PushSharp 2.2.1 и нигде этого не вижу. - person cvocvo; 14.07.2016

Apple представила новый универсальный сертификат push-уведомлений, который позволяет подключаться как к средам APNs Production, так и к средам разработки. Вот почему общее название сертификата производства было изменено с Apple Production IOS Push Services на Apple Push Services.

Вы должны изменить код на push-сервере провайдера, чтобы он был совместим с новым общим именем.

person rana saleh    schedule 30.12.2015

Когда вы создаете производственный сертификат (.p12) для .NET, всегда экспортируйте, например, выбирая только сертификат. см. прикрепленное изображение

http://davidbits.blogspot.in/2016/02/error-you-have-selected-production.html

введите здесь описание изображения

person jpulikkottil    schedule 15.02.2016
comment
Я использую PushSharp версии 4.0.10, и это именно то, что решило проблему для меня. Спасибо! - person Boris; 31.10.2016

Проблема была в библиотеке PushSharp, просто обновите ее до версии .3, потому что Apple изменила имя сертификата Push с (служба Apple Production Push) на (служба Apple Push), а pushSharp проверяет имя сертификата: (production && !subjectName.Contains( «Сервисы Apple Push»)).

person user1752619    schedule 23.02.2016

Ошибка: вы выбрали рабочий сервер,
но ваш сертификат не является производственным сертификатом!
Пожалуйста, проверьте, чтобы убедиться, что у вас есть правильный сертификат!

Решение: (production && !subjectName.Contains("Apple Push Services"))

person user5868997    schedule 01.02.2016

Вызвать следующий фрагмент Отправить токен устройства и сообщение

 public void PendingNotification(string DeviceToken,string message)
    {
        try
        {
            int port = 2195;
            //Developer
            String hostname = "gateway.sandbox.push.apple.com";
            //Production
            //String hostname = "gateway.push.apple.com";
            String certificatePassword = "XXXXXX";
            string certificatePath = Server.MapPath("~/Cert.p12");
            TcpClient client = new TcpClient(hostname, port);
            X509Certificate2 clientCertificate = new X509Certificate2(System.IO.File.ReadAllBytes(certificatePath), certificatePassword);
            X509Certificate2Collection certificatesCollection = new X509Certificate2Collection(clientCertificate);
            SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
            sslStream.AuthenticateAsClient(hostname, certificatesCollection, SslProtocols.Tls, false);
            //String DeviceToken = "a5062b62aacbe6a499e02351c3f233ce87004574ff01965dff5f6bb8f15cae13";
            String LoginName = "Name";
            int Counter = 1; //Badge Count;  
            String Message = message;
            String UID = "your choice UID";
            string payload = "{\"aps\":{\"alert\":\"" + Message + "\",\"badge\":" + Counter + ",\"sound\":\"default\"},\"UID\":\"" + UID + "\",\"LoginName\":\"" + LoginName + "\"}";
            MemoryStream memoryStream = new MemoryStream();
            BinaryWriter writer = new BinaryWriter(memoryStream);
            writer.Write((byte)0);
            writer.Write((byte)0);
            writer.Write((byte)32);
            writer.Write(HexStringToByteArray(DeviceToken.ToUpper()));
            writer.Write((byte)0);
            writer.Write((byte)payload.Length);
            byte[] b1 = System.Text.Encoding.UTF8.GetBytes(payload);
            writer.Write(b1);
            writer.Flush();
            byte[] array = memoryStream.ToArray();
            sslStream.Write(array);
        }
        catch (Exception ex)
        {
            //Response.Write(ex.Message);
        }
    }
    public static byte[] HexStringToByteArray(string hex)
    {
        return Enumerable.Range(0, hex.Length)
            .Where(x => x % 2 == 0)
            .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
            .ToArray();
    }
    public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None)
            return true;
        Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
        return false;
    }

person Bharat Kumar    schedule 06.07.2018

Следуйте инструкциям по следующей ссылке, чтобы сгенерировать производственный SSL-сертификат:

Как создать сертификат APNS

Если это не сработало, дважды проверьте свой код, убедитесь, что вы читаете из правильного файла сертификата и передаете True в ApplePushChannelSettings

person Ala' Alnajjar    schedule 09.03.2015

Я бы рекомендовал использовать что-то из предварительных выпусков 3.0 nuget. Эта проблема устранена в этих выпусках и не будет перенесена в версию 2.x.

person Redth    schedule 11.01.2016
comment
Ну, 3.0 находится в бета-версии, и сертификаты APNS начали выдавать ошибку. Было бы неплохо иметь это исправление в 2.x. И не говоря уже о перезаписи библиотеки. Представьте себе программистов и их живые сервисы, которые теперь полагаются на эту библиотеку. - person Kemal Taşkın; 28.01.2016

PushSharp 2.x > Push.Apple > ApplePushChannelSettings.cs

В файле ApplePushChannelSettings.cs найдите DetectProduction() и CheckProductionCertificateMatching() и замените '.Contains("Apple Production IOS Push Services")' на '.Contains("Apple Push Services")'

Это происходит из-за того, что Apple изменила имя сертификата с «Apple Production IOS Push Services» на «Apple Push Services», PushSharp идентифицирует тип (производство/разработка) по имени сертификата.

person ISFO    schedule 14.02.2017