[phonegap/php] Push berichten versturen naar iOS lukt niet

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
edit:

Probleem opgelost. Lag aan gebruik van een verkeerd provisioning profile, het APNS-profiel moet gebruikt worden bij phonegap om te builden, en niet het gewone development provisioning profile van je dev cert!!
Want, anders staat de apns permissie niet in het profiel, wat knullig dit...


Ik probeer Apple APNS werkend te krijgen op een Phonegap app.
Om dat te bewerkstelligen heb ik de plugin phonegap-plugin-push (1.6.1) gebruikt. Allereerst heb ik de app voor Android werkend gemaakt, voor wat betreft push (met gcm).

Het aanmelden bij de server van Apple (door de app!) lukt; ik krijg een deviceId terug in de javascript functie. Dit deviceId ajax ik door naar de PHP-server.
Tot zover lukt alles, en op de iPhone wordt ook gevraagd om toestemming tot verzenden van berichten.

Als ik probeer een bericht te sturen lukt dat ook, na veel gepriegel heb ik nu een 6-liner waarmee ik i.c.m. het dashboard van Apple Developer het ssl-certificaat download en een .p12 genereer i.c.m. de private key.

Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name=developmentje

# 1 - create private key
openssl genrsa -out $name.key 2048

# 2a - generate csr
openssl req -new -key $name.key -out $name.certSigningRequest -subj "/emailAddress=development@xxx.com, CN=xxxKey"

# 2b - use csr
read -n1 -r -p "======================================================================================
Go to https://developer.apple.com/account/ios/certificate/create , 
upload $name.certSigningRequest, download SSL-certificate to '$name.cer' 
.... and press enter after placing it ! "

# Convert the .cer to a .pem format the APNS will understand.
openssl x509 -inform der -in $name.cer -out $name.pem
cat $name.pem $name.key > $name.bundle.pem

# P12 for e.g. Google GCM.
openssl pkcs12 -export -inkey $name.key -in $name.pem -out $name.p12


De server klaagt niet over het cert, maar versturen lukt niet.
Ik krijg enkel statuscode 8 op de sandbox server van apple, na verzenden.

Zelf begin ik te denken dat de client zich bij de verkeerde server aanmeldt, maar over client-side setting voor wat betreft sandbox of niet (bij de phonegap-plugin-push) , is niks te vinden... ik nam aan dat dat het probleem niet is?

Omdat ik er niet uit kwam heb ik ook geprobeerd om via Google GCM te versturen naar iOS, want daarvoor bieden zij een brug.
Dat lukte ook niet, al lukte het versturen wel zonder errors via Google. Geen bericht op de iPhone echter.
Ik verstuurde met de juiste appId van Google (SENDER_ID in config.xml voor de phonegap/cordova build), van de App die ik dus op die brug heb toegevoegd.
.

Wat ik ook nog geprobeerd heb is via een test-site een bericht met het pem-certificaat en deviceId te versturen, tevergeefs, ook daar error 8. PHP-script is oke en laat ik hier ook niet zien.

Eerlijk gezegd ben ik ten einde raad. Maakt het uit dat ik geen Apple Mac heb gebruikt? Nee toch?

Nou, ik hoop dat iemand een idee heeft in welke richting ik het vooral moet zoeken, of wellicht een keurig alternatief voor het verzenden van pushberichten naar iOS.

[edit] Hieronder een verkorte weergave van relevante code:

Phonegap
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<widget id="com.xx.yy" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0">

    <engine name="android" spec="~4.1.1" />

    <preference name="android-build-tool" value="gradle" />
    <preference name="phonegap-version" value="cli-6.0.0" />
    
    <plugin name="cordova-plugin-device" spec="~1.1.1" />
    <gap:plugin name="cordova-plugin-device" spec="1.1.1" source="npm" />
  
    <plugin name="phonegap-plugin-push" spec="~1.6.1">
        <variable name="SENDER_ID" value="1234000000000" />
    </plugin>
    <gap:plugin name="phonegap-plugin-push" spec="~1.6.1" source="npm">
        <param name="SENDER_ID" value="1234000000000" />
    </gap:plugin>
  

    <access origin="*" />

</widget>


Client
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
                var push = PushNotification.init({
        android: 
        {
            senderID: push_sender_id
        },
        ios: 
        {
            sandbox: true, //ergens gevonden.. geen idee. doet niks volgens mij
            jsCallback: mijnDeviceClass.notification, //ik denk dat deze obsolete is
            alert: "true",
            badge: "true",
            sound: "true",
            ecb: "onNotificationAPN" //?
        },
        windows: {}
    });

    push.on('registration', mijnDeviceClass.registered);  //tot zover goed, 
    push.on('notification', mijnDeviceClass.notification); //android ontvangt wel het bericht...
    push.on('error', mijnDeviceClass.error);

// ik heb de daadwerkelijke notification functie (en de hele) mijnDeviceCLass weggelaten, omdat het zover niet komt 

[ Voor 58% gewijzigd door Verwijderd op 07-04-2016 18:41 . Reden: problem solved ]

Beste antwoord (via Verwijderd op 07-04-2016 18:34)


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 14:10
BoringDay schreef op donderdag 07 april 2016 @ 13:43:
Als het om native Apps gaat dan heb je Xcode nodig (Er is wel Swift voor Linux maar of je hiermee iOS apps kan maken heb ik geen weet van, vast wel wat te vinden op google).

Dus wanneer je serieus Apps wil ontwikkelen voor iOS raad ik je echt aan om Swift/Xcode te gebruiken.
Bespaard je uiteindelijk veel meer tijd dan crossplatform gebrekkige oplossingen.
Dat is helemaal afhankelijk van je doel. Als je crossplatform wil ontwikkelen, is Swift niet zo handig als Cordova. Ook als je app niks spannends doet, is een web-app prima.

Ik gebruik iig ook de Pushplugin, bij mij werkt het ook, maar het was ook een gepriegel met certificaten en onduidelijkere errors helaas.

Mijn PushNotification init is iig een stuk simpelere:
JavaScript:
1
2
3
4
5
6
7
8
var push = PushNotification.init({
        "android": {
            "senderID": "xxxx",
        },
        "ios": {
            "badge": true
        }
});


Controleer dat je .pem zeker in het goede formaat op je server staat. Bij mij ziet het eruit als hieronder, dus certificate eerst, dan private key.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Bag Attributes
    friendlyName: Apple Development IOS Push Services: com.domain.app
    localKeyID: AA AA AA 00 00 00 00 11 11 11 AA AA AA 00 00 00 00 11 11 11
subject=/UID=com.domain.app/CN=Apple Development IOS Push Services: com.domain.app/OU=LZ123123/C=US
issuer=/C=US/O=Apple Inc./OU=Apple Worldwide Developer Relations/CN=Apple Worldwide Developer Relations Certification Authority
-----BEGIN CERTIFICATE-----
AAmmAAmmAAZZZZZZZZZXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AAmmAAmmAAZZZZZZZZZXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
Bag Attributes
    friendlyName: Your Name
    localKeyID: AA AA AA 00 00 00 00 11 11 11 AA AA AA 00 00 00 00 11 11 11
Key Attributes: <No Attributes>
-----BEGIN RSA PRIVATE KEY-----
AAAAAAAAAAAAADDDDDDDDDDXxxxxxxxxxxAAXXXXXXXXXXX
AAAAAAAAAAAAADDDDDDDDDDXxxxxxxxxxxAAXXXXXXXXXXX
-----END RSA PRIVATE KEY-----


Als je de app lokaal test (via Xcode dus), gebruik je je development certificaat. Pas als hij in Testflight of productie staat, is het production certificaat.

Je PHP stuk staat er niet bij, maar ik gebruik deze: https://github.com/zendframework/ZendService_Apple_Apns

Geeft ook iets meer feedback en weet je zeker dat de code goed is.
Uit geheugen ging passphrase bij mij niet zo lekker, dus probeer het even zonder zou ik zeggen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php

use ZendService\Apple\Apns\Client\Message as Client;
use ZendService\Apple\Apns\Message;
use ZendService\Apple\Apns\Message\Alert;
use ZendService\Apple\Apns\Response\Message as Response;
use ZendService\Apple\Exception\RuntimeException;

$client = new Client();
$client->open(Client::SANDBOX_URI, '/path/to/push-certificate.pem', 'optionalPassPhrase');

$message = new Message();
$message->setToken('DEVICE_TOKEN');
$message->setAlert("Hello device")

try {
    $response = $client->send($message);
} catch (RuntimeException $e) {
    echo $e->getMessage() . PHP_EOL;
    exit(1);
}
$client->close();

if ($response->getCode() != Response::RESULT_OK) {
     switch ($response->getCode()) {
         case Response::RESULT_PROCESSING_ERROR:
             // you may want to retry
             break;
         case Response::RESULT_MISSING_TOKEN:
             // you were missing a token
             break;
         case Response::RESULT_MISSING_TOPIC:
             // you are missing a message id
             break;
         case Response::RESULT_MISSING_PAYLOAD:
             // you need to send a payload
             break;
         case Response::RESULT_INVALID_TOKEN_SIZE:
             // the token provided was not of the proper size
             break;
         case Response::RESULT_INVALID_TOPIC_SIZE:
             // the topic was too long
             break;
         case Response::RESULT_INVALID_PAYLOAD_SIZE:
             // the payload was too large
             break;
         case Response::RESULT_INVALID_TOKEN:
             // the token was invalid; remove it from your system
             break;
         case Response::RESULT_UNKNOWN_ERROR:
             // apple didn't tell us what happened
             break;
     }
}


En deze handleiding dus volgen voor het certificaat: https://developer.apple.c.../uid/TP40012582-CH26-SW11

Alle reacties


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Verwijderd schreef op dinsdag 05 april 2016 @ 20:37:
Het aanmelden bij de server van Apple lukt; ik krijg een deviceId terug. Dit deviceId ajax ik door naar de PHP-server.
...
De meeste discussies op internet wijzen dan gelijk op 'gebruik je wel de juiste (dev) certs, en probeer je niet de productieserver te laten versturen?
Zoals jij het beschrijft probeer je volgens mij toch echt je productieserver het te laten versturen. Wat moet jouw php-server met die device-id van Apple?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gomez12 schreef op dinsdag 05 april 2016 @ 21:27:
[...]

Zoals jij het beschrijft probeer je volgens mij toch echt je productieserver het te laten versturen. Wat moet jouw php-server met die device-id van Apple?
Ik bedoel het deviceId van een gebruiker van de app. De berichten zijn specifiek aan bepaalde users gericht.
Mijn PHP-script is zoeits als dit: http://codular.com/sending-ios-push-notifications-with-php , het verbinden lukt en de statuscode terugkrijgen.
Voor het testen had ik deze site gebruikt, maar onder water doet dat script hetzelfde als mijne. Statuscode 8 teruggeven als ik voor sandbox kies i.c.m. steeds het huidige deviceId van de test-iPhone.
Certificaat is gemaakt met optie ' development apns certificaat' bij de Apple site. Gek toch? Daarom denk ik dat er een soort optie met zijn om de app zich anders te laten registreren (op de sandbox server, lijkt wel alsof ie op de productie gaat ofzo 8)7 )

Heb de omschrijving even verduidelijkt.

[ Voor 40% gewijzigd door Verwijderd op 06-04-2016 00:10 ]


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Ik zou gewoon googlen naar een kant & klaar voorbeeld en alles wat je nu hebt schrappen.

Ik heb het gevoel dat je er nu simpelweg een compleet zooitje van hebt gemaakt.

Je JS staat vol met comments dat je niet weet wat het doet, je php-script is zoiets als een link naar een low-level uitleg, de code die je terugkrijgt daaruit concludeer je maar op basis van een ander script weer dat het een code 8 moet zijn.

Ik heb als ik het zo allemaal opsom zo ongeveer het gevoel dat er 10 fouten inzitten en dat je telkens maar 1 ding verandert en als dat het niet oplost dan maar terugzetten waardoor je nooit de combinatie treft dat ze alle 10 goedstaan behalve als je er heel veel meer tijd insteekt en dan gewoon op geluk trial and error gaat doen.

Ik zou gewoon zeggen : Scrap this try and start over.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Gomez12 schreef op woensdag 06 april 2016 @ 00:17:
Ik zou gewoon googlen naar een kant & klaar voorbeeld en alles wat je nu hebt schrappen.

Ik heb het gevoel dat je er nu simpelweg een compleet zooitje van hebt gemaakt.

Je JS staat vol met comments dat je niet weet wat het doet, je php-script is zoiets als een link naar een low-level uitleg, de code die je terugkrijgt daaruit concludeer je maar op basis van een ander script weer dat het een code 8 moet zijn.

Ik heb als ik het zo allemaal opsom zo ongeveer het gevoel dat er 10 fouten inzitten en dat je telkens maar 1 ding verandert en als dat het niet oplost dan maar terugzetten waardoor je nooit de combinatie treft dat ze alle 10 goedstaan behalve als je er heel veel meer tijd insteekt en dan gewoon op geluk trial and error gaat doen.

Ik zou gewoon zeggen : Scrap this try and start over.
Ik heb die comments toegevoegd, omdat ik inderdaad niet weet wat ik daar doe bij de iOS instellingen.
Het is geen zootje, maar probeerde alleen even de relevante code te pakken en te versimpelen voor hier als brief uitleg.

Het probleem is dat ik niet weet hoe ik kan debuggen vanaf een Ubuntu machine op een iOS device.
Eigenlijk hoop ik dat iemand gewoon zegt, je hebt ergens iets verkeerd gedaan met de certificaten, ondanks dat de Apple server ze wel slikt!
Het stopt op het server-side gedeelte bij Apple. Zou het niet zijn dat de app zich voordoet als productie o.i.d., en daarom de sandbox zegt, unknown id?

Voorbeelden kant-en-klaar? Niet te vinden !

[ Voor 14% gewijzigd door Verwijderd op 06-04-2016 00:29 ]


Acties:
  • 0 Henk 'm!

  • BoringDay
  • Registratie: Maart 2009
  • Laatst online: 13-05 21:49
Waarom gebruik je niet gewoon Xcode met Swift?
Ik zou toch maar eens een kijkje nemen van hoe dingen werken
https://developer.apple.com/notifications/

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
BoringDay schreef op donderdag 07 april 2016 @ 10:10:
Waarom gebruik je niet gewoon Xcode met Swift?
Ik zou toch maar eens een kijkje nemen van hoe dingen werken
https://developer.apple.com/notifications/
Omdat ik geen Apple Mac heb :)
Goed, ik vind ook dat dat geen vereiste zou moeten zijn, dus als het zonder niet lukt, dan maar helemaal niet.

[ Voor 16% gewijzigd door Verwijderd op 07-04-2016 13:20 ]


Acties:
  • 0 Henk 'm!

  • BoringDay
  • Registratie: Maart 2009
  • Laatst online: 13-05 21:49
Als het om native Apps gaat dan heb je Xcode nodig (Er is wel Swift voor Linux maar of je hiermee iOS apps kan maken heb ik geen weet van, vast wel wat te vinden op google).

Dus wanneer je serieus Apps wil ontwikkelen voor iOS raad ik je echt aan om Swift/Xcode te gebruiken.
Bespaard je uiteindelijk veel meer tijd dan crossplatform gebrekkige oplossingen.

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 14:10
BoringDay schreef op donderdag 07 april 2016 @ 13:43:
Als het om native Apps gaat dan heb je Xcode nodig (Er is wel Swift voor Linux maar of je hiermee iOS apps kan maken heb ik geen weet van, vast wel wat te vinden op google).

Dus wanneer je serieus Apps wil ontwikkelen voor iOS raad ik je echt aan om Swift/Xcode te gebruiken.
Bespaard je uiteindelijk veel meer tijd dan crossplatform gebrekkige oplossingen.
Dat is helemaal afhankelijk van je doel. Als je crossplatform wil ontwikkelen, is Swift niet zo handig als Cordova. Ook als je app niks spannends doet, is een web-app prima.

Ik gebruik iig ook de Pushplugin, bij mij werkt het ook, maar het was ook een gepriegel met certificaten en onduidelijkere errors helaas.

Mijn PushNotification init is iig een stuk simpelere:
JavaScript:
1
2
3
4
5
6
7
8
var push = PushNotification.init({
        "android": {
            "senderID": "xxxx",
        },
        "ios": {
            "badge": true
        }
});


Controleer dat je .pem zeker in het goede formaat op je server staat. Bij mij ziet het eruit als hieronder, dus certificate eerst, dan private key.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Bag Attributes
    friendlyName: Apple Development IOS Push Services: com.domain.app
    localKeyID: AA AA AA 00 00 00 00 11 11 11 AA AA AA 00 00 00 00 11 11 11
subject=/UID=com.domain.app/CN=Apple Development IOS Push Services: com.domain.app/OU=LZ123123/C=US
issuer=/C=US/O=Apple Inc./OU=Apple Worldwide Developer Relations/CN=Apple Worldwide Developer Relations Certification Authority
-----BEGIN CERTIFICATE-----
AAmmAAmmAAZZZZZZZZZXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AAmmAAmmAAZZZZZZZZZXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
Bag Attributes
    friendlyName: Your Name
    localKeyID: AA AA AA 00 00 00 00 11 11 11 AA AA AA 00 00 00 00 11 11 11
Key Attributes: <No Attributes>
-----BEGIN RSA PRIVATE KEY-----
AAAAAAAAAAAAADDDDDDDDDDXxxxxxxxxxxAAXXXXXXXXXXX
AAAAAAAAAAAAADDDDDDDDDDXxxxxxxxxxxAAXXXXXXXXXXX
-----END RSA PRIVATE KEY-----


Als je de app lokaal test (via Xcode dus), gebruik je je development certificaat. Pas als hij in Testflight of productie staat, is het production certificaat.

Je PHP stuk staat er niet bij, maar ik gebruik deze: https://github.com/zendframework/ZendService_Apple_Apns

Geeft ook iets meer feedback en weet je zeker dat de code goed is.
Uit geheugen ging passphrase bij mij niet zo lekker, dus probeer het even zonder zou ik zeggen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php

use ZendService\Apple\Apns\Client\Message as Client;
use ZendService\Apple\Apns\Message;
use ZendService\Apple\Apns\Message\Alert;
use ZendService\Apple\Apns\Response\Message as Response;
use ZendService\Apple\Exception\RuntimeException;

$client = new Client();
$client->open(Client::SANDBOX_URI, '/path/to/push-certificate.pem', 'optionalPassPhrase');

$message = new Message();
$message->setToken('DEVICE_TOKEN');
$message->setAlert("Hello device")

try {
    $response = $client->send($message);
} catch (RuntimeException $e) {
    echo $e->getMessage() . PHP_EOL;
    exit(1);
}
$client->close();

if ($response->getCode() != Response::RESULT_OK) {
     switch ($response->getCode()) {
         case Response::RESULT_PROCESSING_ERROR:
             // you may want to retry
             break;
         case Response::RESULT_MISSING_TOKEN:
             // you were missing a token
             break;
         case Response::RESULT_MISSING_TOPIC:
             // you are missing a message id
             break;
         case Response::RESULT_MISSING_PAYLOAD:
             // you need to send a payload
             break;
         case Response::RESULT_INVALID_TOKEN_SIZE:
             // the token provided was not of the proper size
             break;
         case Response::RESULT_INVALID_TOPIC_SIZE:
             // the topic was too long
             break;
         case Response::RESULT_INVALID_PAYLOAD_SIZE:
             // the payload was too large
             break;
         case Response::RESULT_INVALID_TOKEN:
             // the token was invalid; remove it from your system
             break;
         case Response::RESULT_UNKNOWN_ERROR:
             // apple didn't tell us what happened
             break;
     }
}


En deze handleiding dus volgen voor het certificaat: https://developer.apple.c.../uid/TP40012582-CH26-SW11

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Barryvdh schreef op donderdag 07 april 2016 @ 14:19:
[...]

Dat is helemaal afhankelijk van je doel. Als je crossplatform wil ontwikkelen, is Swift niet zo handig als Cordova. Ook als je app niks spannends doet, is een web-app prima.

Ik gebruik iig ook de Pushplugin, bij mij werkt het ook, maar het was ook een gepriegel met certificaten en onduidelijkere errors helaas.

Mijn PushNotification init is iig een stuk simpelere:
JavaScript:
1
2
3
4
5
6
7
8
var push = PushNotification.init({
        "android": {
            "senderID": "xxxx",
        },
        "ios": {
            "badge": true
        }
});


Controleer dat je .pem zeker in het goede formaat op je server staat. Bij mij ziet het eruit als hieronder, dus certificate eerst, dan private key.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Bag Attributes
    friendlyName: Apple Development IOS Push Services: com.domain.app
    localKeyID: AA AA AA 00 00 00 00 11 11 11 AA AA AA 00 00 00 00 11 11 11
subject=/UID=com.domain.app/CN=Apple Development IOS Push Services: com.domain.app/OU=LZ123123/C=US
issuer=/C=US/O=Apple Inc./OU=Apple Worldwide Developer Relations/CN=Apple Worldwide Developer Relations Certification Authority
-----BEGIN CERTIFICATE-----
AAmmAAmmAAZZZZZZZZZXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AAmmAAmmAAZZZZZZZZZXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
Bag Attributes
    friendlyName: Your Name
    localKeyID: AA AA AA 00 00 00 00 11 11 11 AA AA AA 00 00 00 00 11 11 11
Key Attributes: <No Attributes>
-----BEGIN RSA PRIVATE KEY-----
AAAAAAAAAAAAADDDDDDDDDDXxxxxxxxxxxAAXXXXXXXXXXX
AAAAAAAAAAAAADDDDDDDDDDXxxxxxxxxxxAAXXXXXXXXXXX
-----END RSA PRIVATE KEY-----


Als je de app lokaal test (via Xcode dus), gebruik je je development certificaat. Pas als hij in Testflight of productie staat, is het production certificaat.

Je PHP stuk staat er niet bij, maar ik gebruik deze: https://github.com/zendframework/ZendService_Apple_Apns

Geeft ook iets meer feedback en weet je zeker dat de code goed is.
Uit geheugen ging passphrase bij mij niet zo lekker, dus probeer het even zonder zou ik zeggen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php

use ZendService\Apple\Apns\Client\Message as Client;
use ZendService\Apple\Apns\Message;
use ZendService\Apple\Apns\Message\Alert;
use ZendService\Apple\Apns\Response\Message as Response;
use ZendService\Apple\Exception\RuntimeException;

$client = new Client();
$client->open(Client::SANDBOX_URI, '/path/to/push-certificate.pem', 'optionalPassPhrase');

$message = new Message();
$message->setToken('DEVICE_TOKEN');
$message->setAlert("Hello device")

try {
    $response = $client->send($message);
} catch (RuntimeException $e) {
    echo $e->getMessage() . PHP_EOL;
    exit(1);
}
$client->close();

if ($response->getCode() != Response::RESULT_OK) {
     switch ($response->getCode()) {
         case Response::RESULT_PROCESSING_ERROR:
             // you may want to retry
             break;
         case Response::RESULT_MISSING_TOKEN:
             // you were missing a token
             break;
         case Response::RESULT_MISSING_TOPIC:
             // you are missing a message id
             break;
         case Response::RESULT_MISSING_PAYLOAD:
             // you need to send a payload
             break;
         case Response::RESULT_INVALID_TOKEN_SIZE:
             // the token provided was not of the proper size
             break;
         case Response::RESULT_INVALID_TOPIC_SIZE:
             // the topic was too long
             break;
         case Response::RESULT_INVALID_PAYLOAD_SIZE:
             // the payload was too large
             break;
         case Response::RESULT_INVALID_TOKEN:
             // the token was invalid; remove it from your system
             break;
         case Response::RESULT_UNKNOWN_ERROR:
             // apple didn't tell us what happened
             break;
     }
}


En deze handleiding dus volgen voor het certificaat: https://developer.apple.c.../uid/TP40012582-CH26-SW11
Bedankt, ik heb hier zeker wat aan. Het probleem is nu opgelost!
Echter lag het aan het provisioning profile, facepalm.. |:(
Ik dacht dat ze m.b.v. het dev-certificaat om te builden, wel wisten welke telefoons toegestaan waren...

Niet dus; blijkbaar vertelt het profiel ook nog wat er mag gebeuren, en niet alleen wie.... Opnieuw de dev-sleutel en cert geupload, maar nu met het apns-provisioning profile.
Werkt nu helemaal goed!

Bedankt allemaal. Deze mag op slot, maar denk dat anderen hier nog wel wat aan zullen hebben.

Ik ben het ook helemaal met je eens voor wat betreft Phonegap; het doel is hier een app waarbij mensen notificaties ontvangen van reacties op hun vraag. En mensen kunnen publiek vragen stellen waarop geantwoord kan worden.
Dit is zo web-ish als het maar kan :)
Pagina: 1