本文应该有很多不对的地方,仅供参考 :)
一不小心,把sandbox和production的device token都放到同一个db table里了,大件事!因为sandbox的device token对于production是invalid的,反之亦然。
由于用的是c#的open source lib APNS-Sharp (https://github.com/Redth/APNS-Sharp) 来batch send notification。它的问题在于: 当你用它时,如果你要发送的device token list里有invalid的,那么在发送过程中,轮到这个token时就会close connection,之后的所有device tokens (即使是valid的)都不会收到notification。我觉得这是APNS-Sharp的bug。 解决方法是在每个与apns的connection都只发送notification给一个device token,这样就不用担心是否存在。或者寻找其他的open source lib??
我试过java版本的apns lib " javapns" (http://code.google.com/p/javapns/), 比apns sharp好多了,而且batch send notificaiton时,即使中间有invalid token,也不会影响valid token device收到notification。
那么, 有没有一个办法能从混合了sandbox and production device tokens的table里把production and sandbox的区分开来??
有! 用javapns就可以区分。原理就是用javapns + dev apns cert and password来batch send notification to device token in db table,对于那些invalid token,返回的notification object的isSuccessful是false,而且exception message为"invalide token"。
注意:不能使用javapns + production apns cert and password来做,因为这样会发送notification给production device,这样绝不能允许!
具体代码是:
String certFilePath="/Users/issliao/tomson/certs/dev/dev_cert.p12";
String certPassword="xxx";
boolean isSendingProductionNotification=false;
try {
//create payload
PushNotificationPayload payLoad= new PushNotificationPayload();
payLoad.addAlert("test");
payLoad.addSound("default");
//add device token list
List<Device> devices = new ArrayList<Device>();
devices.add(new BasicDevice("12345abcde12345abcde12345abcde12345abcde12345abcde12345abcde1112")); //wrong token
devices.add(new BasicDevice("02a2fca6e3ec1ea62aa4b6a344fb9ad7f31f491b7099c0ddf7761cea6c563980")); //iphone pro
devices.add(new BasicDevice("43fcc3cff12965bc45bf842bf9166fa60e8240c575d0aeb0bf395fb7ff86b466")); //ipod dev
devices.add(new BasicDevice("e23411a04b4851c36efbdcd3f260df3acc1820b5ca6a4270ecb43b654cb8c022")); //ipod pro
devices.add(new Ba