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)
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.
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:
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:
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:
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!
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.
Vous devez également activer les notifications à distance, même si vous ne les utilisez pas:
Terminé, vous recevrez le rappel du délégué à la fois dans Debug et dans Release.