2013-01-08 12 views
5

Zadałem to pytanie również na forum programistów, ale ponieważ mój czas się kończy, miałem nadzieję, że publikowanie na stackoverflow może być szybsze.Wywołanie zwrotne tytanu Mobile Push Powiadomienia nie zostało wysłane

Obecnie jestem w stanie otrzymywać powiadomienia push i chcę wysłać kilka dodatkowych danych, po przeszukaniu stwierdziłem, że powinno to być możliwe. Chodzi o to, aby ustawić komunikaty ze skrzynki odbiorczej użytkowników (w aplikacji) po uruchomieniu powiadomienia push, aby użytkownicy otrzymali powiadomienie push, które mówi "Nowa wiadomość", a wraz z nim wiadomość jest wysyłana innym kluczem, który jest powinien być zapisany w Applications.Properties po wywołaniu funkcji powiadomień push callback.

Jednak funkcja callback nigdy nie jest wywoływana. Powiadomienia są wysyłane, znaczek jest ustawiony na to, co robi mój skrypt php, więc jest to wiadomość. Aby sprawdzić, czy wywołanie zwrotne zostało zmienione, zmieniłem znaczek i komunikat na wartości zakodowane na stałe (patrz poniżej), otrzymałem ten kod głównie z ios muncher, ale założyłem, że alert w callback byłby wyświetlany dla użytkownika.

Z innej rzeczy zauważyłem, że otrzymuję powiadomienia push tylko wtedy, gdy użytkownik nie korzysta z aplikacji, więc gdy jest uruchomiony w tle. Gdy użytkownik korzysta z aplikacji, powiadomienia push nie są wyświetlane, pomyślałem, że może to być spowodowane tym, że wywołanie zwrotne nie zostało wywołane.

Z góry dziękuję za wszelką pomoc.

Poniżej pewnego kodu:

Titanium.Network.registerForPushNotifications({ 
    types: [ 
      Titanium.Network.NOTIFICATION_TYPE_BADGE, 
      Titanium.Network.NOTIFICATION_TYPE_ALERT, 
      Titanium.Network.NOTIFICATION_TYPE_SOUND 
     ], 
     success:function(e){ 
      var deviceToken = e.deviceToken; 
      Ti.API.info("Push notification device token is: "+deviceToken); 

      //alert('device token is' +e.deviceToken); 
      var request = Titanium.Network.createHTTPClient(); 

      request.open("POST","http://*********/sendToken.php"); 
      var params = { 
       "token": e.deviceToken, 
       "username": authProperties[0].username, 
       "userId": authProperties[0].userId  
      }; 

      request.send(params); 

      Ti.API.info("Push notification types:   "+Titanium.Network.remoteNotificationTypes); 
    Ti.API.info("Push notification enabled:"+Titanium.Network.remoteNotificationsEnabled); 
}, 
error:function(e){ 
    alert("Error during registration: "+e.error); 

    Ti.API.info("Error during registration: "+e.error); 
}, 
callback:function(e) 
{ 
    // called when a push notification is received. 
    //Titanium.Media.vibrate(); 
    var data = JSON.parse(e.data); 

    request.open("POST","http://*********/callback.php"); 
    var params = { 
     "token": e.deviceToken, 
     "username": authProperties[0].username, 
     "userId": authProperties[0].userId  
    }; 

    request.send(params); 

    // Message data for the inbox 
    var inboxData = data.inbox;  

    Titanium.App.properties.setString("badgeCount",data.badge); 

    var badge = data.badge; 
    if(badge > 0){ 
     Titanium.UI.iPhone.appBadge = 202;//badge; 
    } 

    var message = data.message; 
    if(message != ''){ 
     var my_alert=Ti.UI.createAlertDialog({title:'',message:JSON.stringify(inboxData) }); 

     my_alert.show(); 
    } 
} 
}); 

Poniższy skrypt obsługuje część php powiadomienia Push:

$serverId = "81273"; 
    $name = "APNS"; 
    $apnsPort = 2195;//5223; 
    $passPhrase = ""; 
    $fwrite = ""; 
    $sslUrl = "ssl://gateway.push.apple.com:" . $apnsPort; 
    $apnsCert = "./apns-distr.pem";//give the apns.pem file path on your server 
    $badge = 22; 
$message = "[". date("d-m-Y h:i:s") . '] Er is een nieuw bericht voor u.'; 
$inboxArray = array(); 
$inboxArray["id"]= 1; 
$inboxArray["message"] = "Dit bericht dient als test"; 
$inboxArray["date"] = date("d-m-Y h:i:s"); 
$apnspayload['aps'] = array ('alert' => $message,'badge' => $badge,'sound' => 'default', 'inbox' => $inboxArray); 

$payload = json_encode($apnspayload); 

$tokens = array(); 
$tokens[] = "********** ** * * *"; 

foreach($tokens as $tokenId){ 


    $apnsMessage = chr(1) . pack('N', time()) . pack('N', time() + 86400) . chr(0) . chr(32) 
     . pack('H*', str_replace(' ', '', $tokenId)) . chr(0) . chr(strlen($payload)) . $payload; 

    $streamContext = stream_context_create(); 

    stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); 
    stream_context_set_option($streamContext, 'ssl', 'passphrase', $passPhrase); 

    $apns = stream_socket_client($sslUrl, $error, $errorString, 6, STREAM_CLIENT_CONNECT, $streamContext); 

    if($apns){ 
     $fwrite = fwrite($apns, $apnsMessage); 

     fclose($apns); 
     @socket_close($apns); 
    }else{ 
     echo 'request failed'; 
    } 
}` 
+0

To pytanie wydaje się być sprzeczne z nowszym pytaniem, w którym zastanawiasz się, jak uniknąć uruchamiania wywołań zwrotnych we wszystkich kontekstach. Czy rozwiązałeś to? http://stackoverflow.com/questions/14231470/titanium-mobile-apple-push-notifications-what-is-to-most-logical-place-to-ins –

+0

Wymieniane pytanie zostało rozwiązane, a inne narastało. Wydawało się, że coś jest nie tak z Parsing the JSON. –

Odpowiedz

2

Problem rozwiązany,

Wydaje coś z JSON poszło źle, wciąż nie jestem pewien co.

W App.js: var data = JSON.parse(e.data); po usunięciu kodu JSON.parse() zadziałał kod. Z jakiegoś powodu dane JSON nie musiały być analizowane. Tak więc linia stała się var data = e.data;

+1

To zadziałało dla mnie, dzięki. – LucasA

Powiązane problemy