2017-05-09 23 views
5

Dla aplikacji z niektórymi funkcjami opartymi na czacie chcę dodać obsługę powiadomień push w celu otrzymywania nowych wiadomości. Co chcę zrobić, to użyć nowego uwierzytelnienia opartego na tokenie (plik .p8) od Apple, ale nie mogę znaleźć wiele informacji o części serwera.W jaki sposób zaimplementować oparte na tokenach firmy Apple powiadomienia push (przy użyciu pliku p8) w języku C#?

natknąłem się następujący wpis: How to use APNs Auth Key (.p8 file) in C#?

Jednak odpowiedź nie była satysfakcjonująca, ponieważ nie było dużo szczegółów o tym, jak:

  • nawiązać połączenia z APN
  • użyć P8 plik (z wyjątkiem pewnego rodzaju kodowania)
  • wyślij dane do usługi powiadamiania Apple Push Notification

Odpowiedz

0

Można użyć PushSharp, który jest pakietem nuget, który obsługuje powiadomienia push dla Apple, a także dla Google i Microsoft.

Oto linki do github i nuget.

To jest przykład wysyłać powiadomienia push dla Apple:

// Configuration (NOTE: .pfx can also be used here) 
var config = new ApnsConfiguration (ApnsConfiguration.ApnsServerEnvironment.Sandbox, 
"push-cert.p12", "push-cert-pwd"); 

// Create a new broker 
var apnsBroker = new ApnsServiceBroker (config); 

// Wire up events 
apnsBroker.OnNotificationFailed += (notification, aggregateEx) => { 

aggregateEx.Handle (ex => { 

    // See what kind of exception it was to further diagnose 
    if (ex is ApnsNotificationException) { 
     var notificationException = (ApnsNotificationException)ex; 

     // Deal with the failed notification 
     var apnsNotification = notificationException.Notification; 
     var statusCode = notificationException.ErrorStatusCode; 

     Console.WriteLine ($"Apple Notification Failed: ID={apnsNotification.Identifier}, Code={statusCode}"); 

    } else { 
     // Inner exception might hold more useful information like an ApnsConnectionException   
     Console.WriteLine ($"Apple Notification Failed for some unknown reason : {ex.InnerException}"); 
    } 

     // Mark it as handled 
     return true; 
    }); 
}; 

    apnsBroker.OnNotificationSucceeded += (notification) => { 
    Console.WriteLine ("Apple Notification Sent!"); 
}; 

// Start the broker 
apnsBroker.Start(); 

foreach (var deviceToken in MY_DEVICE_TOKENS) { 
// Queue a notification to send 
apnsBroker.QueueNotification (new ApnsNotification { 
    DeviceToken = deviceToken, 
    Payload = JObject.Parse ("{\"aps\":{\"badge\":7}}") 
    }); 
} 

// Stop the broker, wait for it to finish 
// This isn't done after every message, but after you're 
// done with the broker 
apnsBroker.Stop(); 
+0

Wygląda na to, że używa starego stylu uwierzytelniania, a nie nowego stylu żądanego w PO. –

1

Naprawdę nie można tego zrobić na surowej Framework w tej chwili. Nowy serwer APNS oparty na JWT używa tylko protokołu HTTP/2, który system .NET Framework jeszcze nie obsługuje.

wersja NET rdzenia z System.Net.Http jednak nie, pod warunkiem, że spełniają następujące warunki:

  • na Windows, musi być uruchomiony system Windows 10 Anniversary Edition (v1607) lub wyższy, lub równoważną kompilacji Windows Server 2016 (chyba).
  • W systemie Linux wymagana jest wersja libcurl obsługująca protokół HTTP/2.
  • Na MacOS, musisz skompilować libcurl z obsługą HTTP/2, a następnie użyć zmiennej środowiskowej DYLD_INSERT_LIBRARIES, aby załadować niestandardową kompilację libcurl.

Powinieneś być w stanie używać .NET Core w wersji System.Net.Http w .NET Framework, jeśli naprawdę chcesz.

Nie mam pojęcia, co dzieje się w Mono, Xamarin lub UWP.

Istnieje wtedy trzy rzeczy trzeba zrobić:

  1. analizowania klucz prywatny, które zostały podane. Jest to obecnie klucz ECDSA i można go załadować do obiektu System.Security.Cryptography.ECDsa.
    • W systemie Windows można używać interfejsów API CNG. Po przeanalizowaniu zakodowanej w kodowaniu base64 części DER pliku klucza można utworzyć klucz z numerem new ECDsaCng(CngKey.Import(data, CngKeyBlobFormat.Pkcs8PrivateBlob)).
    • W systemie MacOS lub Linux nie ma obsługiwanego interfejsu API i trzeba samemu przeanalizować strukturę DER lub użyć biblioteki innej firmy.
  2. Utwórz token żetona/okaziciela JSON. Jeśli korzystasz z pakietu System.IdentityModel.Tokens.Jwt od NuGet, jest to dość proste. Będziesz potrzebować identyfikatora klucza i identyfikatora zespołu od Apple.
public static string CreateToken(ECDsa key, string keyID, string teamID) 
{ 
    var securityKey = new ECDsaSecurityKey(key) { KeyId = keyID }; 
    var credentials = new SigningCredentials(securityKey, "ES256"); 

    var descriptor = new SecurityTokenDescriptor 
    { 
      IssuedAt = DateTime.Now, 
      Issuer = teamID, 
      SigningCredentials = credentials 
    }; 

    var handler = new JwtSecurityTokenHandler(); 
    var encodedToken = handler.CreateEncodedJwt(descriptor); 
    return encodedToken; 
}
  1. Wyślij/2 żądania HTTP. To jest normalne, ale trzeba zrobić dwie dodatkowe rzeczy:

    1. Ustaw yourRequestMessage.Version do new Version(2, 0) w celu uczynienia żądania za pomocą protokołu HTTP/2.
    2. Ustaw yourRequestMessage.Headers.Authorization na new AuthenticationHeaderValue("bearer", token) w celu dostarczenia tokena uwierzytelniania okaziciela/JWT wraz z żądaniem.

    Następnie wystarczy umieścić swój JSON w żądaniu HTTP i POST go pod prawidłowym adresem URL.