web-dev-qa-db-fra.com

Implémenter PushKit et tester le comportement de développement

j'aimerais implémenter le service PushKit dans mon application (application Voip), mais j'ai le doute suivant: je vois que je peux générer uniquement un certificat VoIP de production, cela fonctionne-t-il si j'essaie de tester le service de notification Push VoIP sur un appareil de développement?

Voici mon test d'implémentation:

Avec cette 3 ligne de code, je peux obtenir un jeton Push sur le rappel didUpdatePushCredentials que j'utilise pour enregistrer sur mon serveur.

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

Côté serveur, je génère une notification push de charge utile "normale" avec uniquement un texte d'alerte, et j'ai envoyé un jeton voip stocké sur mon serveur.

J'utilise le rappel avec le journal de débogage, mais ils ne sont jamais appelés!

- (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);

}

Si j'essaie de générer un message de notification Push à partir de mon serveur vers un jeton d'appareil VoIP précédemment téléchargé, je ne suis jamais informé du rappel de didReceiveIncomingPushWithPayload, mais du serveur, j'obtiens un message 200 ok (le message a été envoyé avec succès)

21
pasqui86

Juste au cas où quelqu'un serait intéressé à tester les notifications push voip avec Pushkit ici, j'ai laissé une petite procédure que j'ai suivie avec succès:

1 - Créez, si vous ne l'avez pas déjà, un [~ # ~] csr [~ # ~] avec Keychain Access et enregistrez votre CSR localement .

2 - Accédez à Apple Developer et obtenez des certificats d'accès, des identifiants et des profils. Sur le centre des membres.

  • Inside Identifiers-> App IDs Créez un nouvel identifiant d'application
  • À l'intérieur des appareils-> Tous Ajouter les appareils UDID que vous souhaitez utiliser pour tester les pushs VoIP
  • Inside Certificates-> All Créez un nouveau certificat de production: VoIP Services Certificate. Sélectionnez l'ID d'application créé précédemment pour votre certificat de service VoIP. Sélectionnez la CSR (demande de signature de certificat) créée précédemment et une fois créée, téléchargez votre nouveau voip_services.cer

Une fois téléchargé, double-cliquez sur voip_services.cer pour ouvrir l'application Keychain Access et exporter la clé privée du certificat généré: bouton droit Exporter fichier certificate.p12 .

Enregistrez voip_services.cer et certificate.p12 fichier dans un dossier dans l'ordre créer votre serveur Générateur de notifications push

Enfin, accédez à Apple Site Web pour développeurs à nouveau et dans Provisioning Profiles-> Distribution, créez un nouveau profil de distribution ad hoc , y compris sur celui-ci tous les appareils UDID que vous souhaitez utiliser pour tester les push voip.Téléchargez ce profil et glissez-déposez sur votre xcode afin de l'utiliser sur votre application.

Permet maintenant de créer l'application iOS qui recevra les notifications push voip:

  • Créez une nouvelle application à vue unique à partir du nouveau menu de projet Xcode.
  • Remplissez son identifiant de groupe en fonction de l'ID d'application créé dans la section précédente.
  • Ajoutez PushKit.framework dans Général-> Cadres et bibliothèques liés.
  • Dans Capacités, activez le mode Arrière-plan et sélectionnez l'option Voix sur IP.
  • Dans Paramètres de construction -> Signature de code, sélectionnez le profil d'approvisionnement que vous avez téléchargé précédemment et sélectionnez Distribution en tant qu'identité de signature de code.

Permet d'ajouter dans l'application le code Pasquale ajouté dans sa question:

Dans l'en-tête de votre contrôleur de vue racine ( ViewController.h ) une importation pour PushKit.framework:

#import <PushKit/PushKit.h>

Ajouter un délégué pour implémenter ses fonctions:

@interface ViewController : UIViewController <PKPushRegistryDelegate>

Ajoutez la fonction viewDidLoad de votre contrôleur de vue racine (ViewController.m) Enregistrement push:

- (void)viewDidLoad {
    [super viewDidLoad];

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

Mettre en œuvre les fonctions de délégué requises:

- (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");
}

Une fois que tout est compilé et ok, archivez votre projet et exportez votre fichier ipa afin de l'installer sur des appareils de test (vous pouvez utiliser par exemple Testflight pour faire le travail).

Exécutez-le et obtenez à partir des journaux les PushCredentials que nous utiliserons pour envoyer des push.

Passons maintenant au côté serveur (j'ai suivi ce grand guide de tutoriels raywenderlich ):

Revenez au dossier où vous avez placé les trois fichiers:

  • voip_services.cer
  • certificate.p12

1 - Ouvrez un terminal et créez un fichier pem à partir du fichier de certificat:

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

2 - Créez un fichier pem à partir du fichier de clé privée exporté:

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

3 - Joignez les deux fichiers pem en un:

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

Pour envoyer des push, vous pouvez utiliser Pusher de tutoriels raywenderlich tutoriel ou utiliser un simple script php:

<?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);

vous devez modifier dans le script:

  • $ deviceToken en ajoutant vos PushCredentials (à partir des journaux d'application)
  • $ passphrase par la phrase de passe que vous avez ajoutée à l'étape 2 lors de la création de PushVoipKey.pem

C'est ça. Exécutez le script php:

#php simplePushScript.php

et vous devriez recevoir votre notification push VoIP (vous devriez voir le journal de l'application: "didReceiveIncomingPushWithPayload")

Après ce test, je me suis demandé comment je pouvais recevoir des notifications Push standard via le framework pushkit, mais malheureusement je n'ai pas de réponse car lors de l'enregistrement du type Push, je n'ai trouvé aucun autre PKPushType que le PKPushTypeVoIP ...

pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];

C'est tout! Merci d'avoir lu!

64
M Penades

Aujourd'hui, j'ai exploré cela en détail. Moi aussi, je me demandais comment utiliser le jeton Push généré sur une version de développement lorsque Apple nous permet uniquement de générer un certificat Push VoIP de production.

Sur le serveur, vous devez envoyer un push de production à gateway.Push.Apple.com et un développement/sandbox Push to gateway.sandbox.Push.Apple.com. J'ai pu générer et recevoir des push VoIP sur une version de développement de mon application en utilisant le certificat VoIP de production sur gateway.sandbox.Push.Apple.com. Je n'ai pas encore essayé, mais je suppose qu'il fonctionnera également sur un build ad hoc ou de production et en utilisant gateway.Push.Apple.com.

Notez également que les notifications Push ne fonctionnent pas du tout dans le simulateur.

4
Troy

Vous devez également activer les notifications à distance, même si vous ne les utilisez pas:

  • à l'intérieur de votre identifiant App ID sur le portail des développeurs
  • recréer les profils de provisionnement de développement
  • cliquez sur Télécharger tout dans XCode -> Préférences ... -> Comptes -> votre compte
  • activer les notifications à distance dans les capacités -> modes d'arrière-plan

Terminé, vous recevrez le rappel du délégué à la fois dans Debug et dans Release.

0
Shebuka