Closed GoogleCodeExporter closed 8 years ago
A ResponsePacket will only be attached if an actual error response packet was
received from the server. If no error occurred, there won't be any response
packet attached. The isSuccessful() method will return true if no error
response packet was received, so there shouldn't be any need to get the
response packet itself.
If you are getting a NullPointerException from the library though, please
provide a stack trace so the issue can be investigated.
Original comment by sype...@gmail.com
on 4 Nov 2011 at 1:54
Thank you for your answering. The null pointer exception is caused by the null
response :) Is it that only a enhanced notification will get a respose? How to
send a enhanced notification?
Thank you very much!
Original comment by wangyana...@gmail.com
on 4 Nov 2011 at 2:00
And I have removed the application on the iphone, but I still can't get a error
response(it is always null). please help me.
thank you!
Original comment by wangyana...@gmail.com
on 4 Nov 2011 at 2:33
JavaPNS always uses the enhanced notification format.
Please provide a full stack trace for your exception. Without it, I don't
understand where you're getting it from exactly in your code.
Original comment by sype...@gmail.com
on 4 Nov 2011 at 4:59
this is all the console output:
log4j:WARN No appenders could be found for logger
(javapns.devices.DeviceFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more
info.
Exception in thread "main" java.lang.NullPointerException
at javaApnsTest.main(javaApnsTest.java:37)
here is the source code:
public static void main(String args[]) throws JSONException
{
PushNotificationPayload payload = new PushNotificationPayload("message+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+soundmessage+badge+sound", 1, "default");
payload.setExpiry(1);
List<PushedNotification> notifications = Push.payload(payload, "apns-key+cert-exported-from-mac.p12", "hadoop",
false,
"cef981279b88xxxxxxxxxxxxxxxx0679ad5bd880"); //for privacy
ResponsePacket response=null;
for (PushedNotification notification : notifications) {
response = notification.getResponse();
{
response.getMessage();
System.out.println(response.getMessage());
}
if (notification.isSuccessful()) {
/* Apple accepted the notification and should deliver it */
System.out.println("Push notification sent successfully to: " +
notification.getDevice().getToken());
/* Still need to query the Feedback Service regularly */
} else {
String invalidToken = notification.getDevice().getToken();
/* Add code here to remove invalidToken from your database */
}
}
List<Device> devList = Push.feedback("apns-key+cert-exported-from-mac.p12", "hadoop", false);
for(Device basicDevice: devList)
{
System.out.println(basicDevice.getToken());
System.out.println(basicDevice.getDeviceId());
}
System.out.println("end push");
}
thanks again!
Original comment by wangyana...@gmail.com
on 4 Nov 2011 at 5:12
Well, the code you just pasted is different from the one you provided
initially. The "if(response!=null)" condition is missing, so if response is
null (which it will always be if no error occurs), your code will indeed throw
a NullPointerException. If you put back the condition like you had before,
your code will work fine.
Original comment by sype...@gmail.com
on 4 Nov 2011 at 5:15
yes, I removed the "if(response!=null)" statement just to show you the
exception I initially said about. But I didn't get a non-null response still
even when I have removed the client application from my phone and I have send a
invalid payload which is too long as in the later code. I want to get a error
response to show it to my team leader, but I can't get it. this is the problem.
thank you for your patience!
Original comment by wangyana...@gmail.com
on 4 Nov 2011 at 5:22
Ok, I understand a little bit more what you are trying to accomplish (get an
actual error-response packet). However, your attempts are not even making it
to the transmission phase because the library has safeguards against malformed
tokens, payload size, etc. It would be quite inefficient to let Apple servers
throw errors for these kinds of basic specs violations while the library can do
basic validations first. So, what's happening in your case is that the library
is detecting your oversize payload and is rejecting it without even trying to
send it to Apple servers. The "isSuccessful()" method returning false does
hint at an error, but your errors are not reported by Apple (as error response
packets), they are reported as exceptions, which you can get using
"getException()" on the PushedNotification object.
Had you enabled logging as stated on the "Troubleshooting" wiki page here, you
would have seen a nice exception in your log output that would have explained
that your payload was rejected by the library.
If you want to get an error response packet from Apple, try pushing a proper
payload to a 64-bytes device token that does not exist. Since it is 64 bytes
long, the library will accept it, and Apple will return an error-response
packet because it will find that the token does not correspond to a valid
device. I just ran your code with a cut-down payload and an invalid 64-bytes
token, and I got a nice error-response packet as expected.
Original comment by sype...@gmail.com
on 4 Nov 2011 at 5:40
yes, I have got a error-response packet using the method that you told me. I
want to check the state of the notifications, like a pending or failing to
deliver state. How should I do that? Is the code under enough?
List<Device> devList = Push.feedback("apns-key+cert-exported-from-mac.p12",
"hadoop", false);
for(Device basicDevice: devList)
{
System.out.println(basicDevice.getToken());
System.out.println(basicDevice.getDeviceId());
}
Or should wait for some time to excute the Push.feedback method? I'm really a
freshmen to java. Thanks a lot for your patience!
Original comment by wangyana...@gmail.com
on 4 Nov 2011 at 5:57
The purpose of the Feedback Service is not to check on the status of a
notification delivery. It is simply to get a list of device tokens which
should no longer be used by your provider. But the how and when a device gets
listed there is entirely up to Apple and to a lot of undocumented technical
reasons. You should query the Feedback Service from time to time to cleanup
your own list of device tokens, but that is all it is useful for.
There's a lot of useful information in the Wiki on this site (including more
detailed information about what I just wrote about), so I would strongly
suggest you read the entire wiki before going any further. This will probably
save you a lot of time by understanding what you can and cannot do with Apple's
Push Notification Service.
Original comment by sype...@gmail.com
on 4 Nov 2011 at 6:05
OK. That's very kind of you to answer my questions and I will read the wiki
more. Thank you very much again!
Original comment by wangyana...@gmail.com
on 4 Nov 2011 at 6:10
My pleasure!
Original comment by sype...@gmail.com
on 4 Nov 2011 at 6:11
Original issue reported on code.google.com by
wangyana...@gmail.com
on 4 Nov 2011 at 1:17