2014-12-02 3 views
14

Ich möchte PushKit-Service in meiner App (Voip-App) implementieren, aber ich habe folgende Zweifel: Ich sehe, dass ich nur Produktion Voip-Zertifikat generieren kann, funktioniert es, wenn ich versuche zu testen voip Push-Benachrichtigungsdienst am Gerät entwickeln?Implementieren Sie PushKit und testen Sie im Entwicklungsverhalten

Dies ist meine Implementierung Test:

Mit dieser 3 Codezeile i Push-Token auf didUpdatePushCredentials Rückruf erhalten kann, die ich verwende in meinen Server zu speichern.

PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()]; 
pushRegistry.delegate = self; 
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP]; 

Server-Seite i erzeugt eine "normale" Nutzlast Push-Benachrichtigung mit nur Alert-Text, und ich schickte Token in meinen Server gespeichert VoIP.

Ich benutze den Rückruf mit Debug-Protokoll, aber sie werden nie aufgerufen!

- (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(NSString *)type { 

      NSLog(@"didInvalidatePushTokenForType"); 

} 

-(void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type { 

      NSLog(@"didReceiveIncomingPushWithPayload: %@", payload.description); 

} 

-(void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type { 
    if([credentials.token length] == 0) { 
      NSLog(@"voip token NULL"); 

      return; 
    } 

     NSLog(@"didUpdatePushCredentials: %@ - Type: %@", credentials.token, type); 

} 

Wenn ich versuche, eine Push-Benachrichtigung Nachricht von meinem Server VoIP-Gerät zu generieren Token zuvor hochgeladen, ich bin nie auf didReceiveIncomingPushWithPayload Rückruf benachrichtigt, sondern vom Server erhalten i 200 OK-Nachricht (Nachricht erfolgreich gesendet wurde)

+0

Ich habe keine Callbacks bekommen, die weder aufgerufen werden ... noch werden sie aufgerufen. Ich bin nicht sicher, wie ich Token bekommen soll, um es zu testen. Irgendwelche Fortschritte dabei? –

+0

Nein. Ich kann diesen Service nicht nutzen. – Pasquale

+0

Ich habe Callbacks angerufen! Ich habe es versäumt, die voip-Hintergrundfunktionen der App zu überprüfen. –

Antwort

3

Heute habe ich das sehr detailliert erforscht. Ich habe mich auch gefragt, wie man das generierte Push-Token für einen Entwicklungs-Build verwendet, wenn Apple uns nur erlaubt, ein Produktions-VoIP-Push-Zertifikat zu generieren.

Auf dem Server müssen Sie einen Produktionsschub an gateway.push.apple.com und einen Entwicklungs-/Sandbox-Push an gateway.sandbox.push.apple.com senden. Ich konnte VoIP-Pushs auf einem Entwicklungs-Build meiner App mithilfe des VoIP-Produktionszertifikats unter gateway.sandbox.push.apple.com generieren und empfangen. Ich habe es noch nicht versucht, gehe aber davon aus, dass es auch auf Ad-hoc- oder Production-Builds funktioniert und gateway.push.apple.com verwendet.

Beachten Sie auch, dass Push-Benachrichtigungen überhaupt nicht im Simulator funktionieren.

52

Gerade falls jemand auf dem Testen voip Push-Benachrichtigungen mit Pushkit interessiert ist, hier verließ ich eine kleine Prozedur, die ich erfolgreich gefolgt:

1 - Erstellen, wenn Sie es nicht bereits haben, ein CSR mit Schlüsselbund und speichern Sie Ihre CSR lokal.

2 - Gehen Sie zu Apple Developer und erhalten Sie Zugang Zertifikate, Kennzeichnungen & Profile. Auf dem Mitgliedszentrum.

  • Innen Identifiers-> App-IDs Erstellen Sie eine neue App-ID
  • Innen Geräte-> Alle Geräte hinzufügen UDID Sie zum Testen von VoIP nutzen möchten
  • Innen Zertifikate-> Alle ein Zertifikat neue Produktions erstellen schiebt: VoIP-Dienstezertifikat Wählen Sie die zuvor erstellte App-ID für Ihr VoIP-Servicezertifikat aus. Wählen Sie vorher CSR erstellt (Certificate Signing Request) und einmal erstellt herunterladen Ihre neuen voip_services.cer

Einmal heruntergeladen Doppelklick auf voip_services.cer um Schlüsselbund Anwendung zu öffnen und Export private Schlüssel für generierte Zertifikat: rechts button Export zertifikat.p12 datei.

Speichern voip_services.cer und certificate.p12 Datei in einem Ordner, um Ihren Server-Push-Benachrichtigung Generator

Schließlich Apple Entwickler-Website wieder und innerhalb Provisioning Profile- gehen erstellen> Distribution ein neuen Ad-Hoc-Verteilungsprofil erstellen einschließlich darauf alle Geräte UDID, die Sie zum Testen von VoIP-Push verwenden möchten. Laden Sie dieses Profil herunter und ziehen Sie es auf Ihren xcode, um es in Ihrer Anwendung zu verwenden.

lässt nun die iOS-App erstellen, die VoIP-Push-Benachrichtigungen erhalten:

  • Erstellen Sie eine neue Single View Anwendung von Xcode neues Projekt Menü.
  • Füllen Sie das Bündel Identifier gemäß der erstellten App-ID im vorherigen Abschnitt.
  • Fügen Sie PushKit.framework in Allgemein-> Verknüpfte Frameworks und Bibliotheken hinzu.
  • In den Funktionen Hintergrundmodus aktivieren und Voice over IP-Option auswählen.
  • In den Buildeinstellungen -> Code Signing wählen Sie das Provisionierungsprofil aus, das Sie zuvor heruntergeladen haben, und wählen Sie Verteilung als Code Signing Identity.

Lets in der App fügen Sie den Code Pasquale in seiner Frage hinzugefügt:

In Ihrem Root-View-Controller-Header (ViewController.h ) einen Import für PushKit.framework:

#import <PushKit/PushKit.h> 

Delegierten hinzufügen, um seine Funktionen zu implementieren:

@interface ViewController : UIViewController <PKPushRegistryDelegate> 
In 363.210

in viewDidLoad Funktion Ihres Root-View-Controller (ViewController.m) Push-Anmeldung:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()]; 
    pushRegistry.delegate = self; 
    pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP]; 
} 

Implementieren erforderlich delegieren Funktionen:

- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type{ 
    if([credentials.token length] == 0) { 
     NSLog(@"voip token NULL"); 
     return; 
    } 

    NSLog(@"PushCredentials: %@", credentials.token); 
} 

- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type 
{ 
    NSLog(@"didReceiveIncomingPushWithPayload"); 
} 

Sobald alles kompiliert und ok, archivieren Sie Ihre Projekt- und Export Ihre ipa-Datei, um sie auf Testgeräten zu installieren (Sie können zum Beispiel Testflight verwenden).

Führen Sie es aus und rufen Sie die PushCredentials ab, die wir verwenden werden, um Pushs zu senden.

Jetzt auf Server-Seite gehen lässt (ich diesen großen Führer von raywenderlich tutorials gefolgt):

zurück zum Ordner Erhalten Sie waren platziert Sie die drei Dateien:

  • voip_services.cer
  • Zertifikat.p12

1 - öffnen Sie einen Terminal und pem-Datei aus dem Zertifikat-Datei erstellen:

#openssl x509 -in voip_services.cer -inform der -out PushVoipCert.pem 

2 - Erstellen pem-Datei aus exportierte privaten Schlüsseldatei:

#openssl pkcs12 -nocerts -out PushVoipKey.pem -in certificate.p12 

3 - Join sowohl pem Dateien in einem:

#cat PushVoipCert.pem PushVoipKey.pem > ck.pem 

Um zu senden schiebt yo u kann Pusher von raywenderlich tutorials Tutorial oder einen einfachen PHP-Skript:

<?php 

// Put your device token here (without spaces): 
$deviceToken = '0f744707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bbad78'; 

// Put your private key's passphrase here: 
$passphrase = 'pushchat'; 

// Put your alert message here: 
$message = 'My first push notification!'; 

//////////////////////////////////////////////////////////////////////////////// 

$ctx = stream_context_create(); 
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem'); 
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

// Open a connection to the APNS server 
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err, 
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

if (!$fp) 
    exit("Failed to connect: $err $errstr" . PHP_EOL); 

echo 'Connected to APNS' . PHP_EOL; 

// Create the payload body 
$body['aps'] = array(
    'alert' => $message, 
    'sound' => 'default' 
    ); 

// Encode the payload as JSON 
$payload = json_encode($body); 

// Build the binary notification 
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; 

// Send it to the server 
$result = fwrite($fp, $msg, strlen($msg)); 

if (!$result) 
    echo 'Message not delivered' . PHP_EOL; 
else 
    echo 'Message successfully delivered' . PHP_EOL; 

// Close the connection to the server 
fclose($fp); 

Sie in Skript ändern sollten:

  • $ deviceToken von Ihrem PushCredentials Zugabe (von App-Protokollen)
  • $ Passwort durch die Passphrase, die Sie in Schritt 2 bei der Erstellung von PushVoipKey.pem hinzugefügt haben

Das war's. Führen Sie PHP-Skript:

#php simplePushScript.php 

und Sie sollten Ihre VoIP-Push-Benachrichtigung erhalten (Sie sollten App Protokoll anzeigen: "didReceiveIncomingPushWithPayload")

Nach diesem Test habe ich gefragt, wie ich Standard-Push-Benachrichtigungen durch pushkit Rahmen empfangen konnten, aber leider habe ich keine Antwort, wenn die Push-Typ Registrierung ich keine andere PKPushType finden konnten, aber die PKPushTypeVoIP ...

pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP]; 

das ist alles! Danke fürs Lesen!

+0

Sehr nette Antwort. :) –

+0

Ich folgte diesem und die 'didUpdatePushCredentials' Methode wurde nie aufgerufen.Muss ich mich auch für Remote Notifications registrieren mit '[UIApplication registerForRemoteNotificationTypes:]'? –

+0

Ich kann diesen Kommentar nicht mehr bearbeiten, aber ich habe versucht, mich für Push-Benachrichtigungen durch Aufruf von 'registerUserNotificationSettings' und' registerForRemoteNotifications' zu registrieren, bekomme aber immer noch keine Aufrufe von 'didUpdatePushCredentials' oder' didReceiveIncomingPushWithPayload'. –

0

Sie müssen auch Remote-Benachrichtigungen ermöglichen, auch wenn Sie sie nicht benutzen:

  • in Ihrer App-ID-Kennung auf Entwickler-Portal
  • neu die Entwicklung Provisioning Profile
  • Hit Downloaden All XCode -> Einstellungen ... -> Konten -> Ihr Konto
  • ermöglichen Remote-Benachrichtigungen in Capabilities -> Hintergrund Modes

Erledigt erhalten Sie den Delegaten-Rückruf sowohl in Debug als auch in Release.

+0

"Remote-Benachrichtigungen in Funktionen -> Hintergrund-Modi aktivieren" ist nicht unbedingt notwendig. Das ist für das Anfordern von Hintergrundzeit, um Inhalt herunterzuladen. Unsere PushKit-Benachrichtigung funktioniert einwandfrei, ohne dass sie gesetzt wird. – chadbag

+0

Das ist nicht korrekt, Sie müssen "Remote Notifications in Capabilities -> Background Modes" aktivieren, wenn Sie die Push-Benachrichtigung bearbeiten möchten, während sich Ihre App im Hintergrund befindet. Das Verhalten, über das Sie sprechen, ist "Hintergrund holen in den Fähigkeiten -> Hintergrund-Modi". – Shebuka

+0

Nein, ich spreche über "Remote-Benachrichtigungen in Funktionen -> Hintergrund-Modi" und ich paraphrasiere direkt die Apple-Dokumente hier: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution /HintergrundExecution.html. Nun hätte ich etwas expliziter sagen können, dass es Zeit war, Inhalte herunterzuladen, wenn eine Push-Benachrichtigung eintraf. Ich war nicht klar. Sie benötigen keine "Remote-Benachrichtigungen in den Funktionen -> Hintergrundmodi", damit Push-Benachrichtigungen funktionieren. Kann es brauchen, wenn Sie möchten, dass PN Sie für die bkgrnd-Verarbeitung aufweckt – chadbag

Verwandte Themen