2013-01-08 31 views
5

Tôi cũng đã hỏi câu hỏi này trên diễn đàn nhà phát triển, nhưng khi thời gian của tôi hết, tôi hy vọng đăng trên stackoverflow có thể nhanh hơn.Thông báo đẩy trên thiết bị di động của Titan không được kích hoạt

Hiện tại tôi có thể nhận được thông báo đẩy và tôi muốn gửi thêm một số dữ liệu, sau khi tìm kiếm xung quanh, tôi kết luận rằng điều này có thể thực hiện được. Ý tưởng là đặt thông báo từ hộp thư đến của người dùng (trong ứng dụng) khi thông báo đẩy được kích hoạt, vì vậy người dùng nhận được thông báo đẩy cho biết "Tin nhắn mới" và cùng với đó là tin nhắn gửi bằng một khóa khác phải được lưu trong Applications.Properties khi chức năng thông báo đẩy callback được gọi.

Tuy nhiên, chức năng callback không bao giờ được kích hoạt. Các thông báo được gửi, huy hiệu được thiết lập để những gì php script của tôi làm như vậy là tin nhắn. Để kiểm tra xem cuộc gọi lại đã được kích hoạt hay chưa, tôi đã thay đổi huy hiệu và thông báo thành các giá trị mã hóa cứng (xem bên dưới), tôi nhận mã này từ chủ yếu từ ios muncher nhưng tôi cho rằng cảnh báo trong callback sẽ là thông báo hiển thị cho người dùng.

Một điều khác mà tôi nhận thấy, tôi chỉ nhận được thông báo đẩy khi người dùng không sử dụng ứng dụng, vì vậy khi người dùng đang chạy ở chế độ nền. Khi người dùng đang sử dụng thông báo đẩy ứng dụng không được hiển thị, tôi nghĩ rằng điều này có thể là do cuộc gọi lại không được kích hoạt.

Cảm ơn trước vì đã giúp đỡ tất cả.

Dưới đây một số mã:

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

Các kịch bản sau xử lý các phần php của thông báo 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

Câu hỏi này có vẻ không phù hợp với câu hỏi gần đây của bạn hơn khi bạn muốn tránh việc gọi lại trong tất cả các ngữ cảnh của mình. .. Bạn đã giải quyết vấn đề này chưa? http://stackoverflow.com/questions/14231470/titanium-mobile-apple-push-notifications-what-is-the-most-logical-place-to-ins –

+0

Câu hỏi mà bạn đề cập được giải quyết và câu hỏi khác được nêu ra. Có vẻ như đã xảy ra sự cố với phân tích cú pháp JSON. –

Trả lời

2

Vấn đề được giải quyết,

Có vẻ như một cái gì đó với JSON đã đi sai, vẫn không chắc chắn những gì.

Trong App.js: var data = JSON.parse(e.data); khi xóa mã JSON.parse() đã hoạt động. Vì lý do nào đó, dữ liệu JSON không cần phải được phân tích cú pháp .. do đó, dòng đã trở thành var data = e.data;

+1

Điều này làm việc cho tôi, cảm ơn. – LucasA

Các vấn đề liên quan