APNS PUSH для нескольких идентификаторов приложений (несколько сертификатов.p12) с одного сервера Java/Tomcat
Я использую библиотеку notnoop для отправки push APNS. Мой сервер построен на Java и размещен на веб-сервере tomcat/apache (один статический IP). У меня есть 2 приложения для iphone, которые находятся в магазине приложений. Оба имеют там идентификатор приложения и сертификаты. Когда я пытаюсь отправить push с нашего сервера, он отправляет push только тому приложению, сертификат которого инициализируется впервые. Предположим, у меня есть 2 приложения, AppA и AppB, у них есть 2 разных идентификатора приложения, AppIDA и AppIDB, и у них есть собственные сертификаты (.p12) CertiA и CertiB. После того, как я перезапустил наш сервер Tomcat и, если одним нажатием инициировать, скажем, AppA, он успешно доставит на устройство. Если еще одно нажатие инициировано для другого App AppB, оно не будет доставлено на устройство. Я не могу понять, почему это произошло. Оба сертификата я тестировал индивидуально и оба работают нормально. Ниже приведен код Java.
Этот код каждый раз создает новый экземпляр для каждого App AppA и AppB.
import com.notnoop.apns.APNS;
import com.notnoop.apns.ApnsService;
import com.notnoop.apns.ApnsServiceBuilder;
//This is the class to send the PUSH
public class APNSConnectionImpl extends MessagingConnection {
//APNS Builder, using notnoop library
ApnsServiceBuilder apnsServiceBuilder = null;
//APNS Service, using notnoop library
ApnsService apnsService = null;
// This function is use to send PUSH
// Parameters:
// deviceAndPaylodiOS : List of Devices and Payload
// appRegistrationKey : Name of the certificate, It could be AppA Certificate or //AppB Certificate. The certificate comes at runtime and both certificates copy and //past in a specific folder lat say /var/apncertificate/AppACertificate.p.12 and /var/apncertificate/AppBCertificate.p.12
@Async
@Override
public HashMap<String, String> sendMessagePool(Map<String, String> deviceAndPaylodiOS, String appRegistrationKey)
throws ApplicationException {
initializeApnsServices(appRegistrationKey);
if (deviceAndPaylodiOS == null || deviceAndPaylodiOS.isEmpty()) {
return null;
}
// Sending Push to all devices,
deviceAndPaylodiOS.forEach((key, value)->{
apnsService.push(key, value);
});
if (apnsService != null) {
apnsService.stop();
apnsService = null;
apnsServiceBuilder = null;
}
return null;
}
private void initializeApnsServices(String appRegistrationKey) throws ApplicationException{
if (apnsServiceBuilder != null) {
apnsServiceBuilder = null;
}
apnsServiceBuilder = APNS.newService();
try {
String certPath = "/var/apnscertificates/"+ appRegistrationKey;
apnsServiceBuilder.withCert(certPath,Constants.APNS_PASS_CERTIFICATE).withProductionDestination();
} catch (Exception e) {
e.printStackTrace();
throw new QuinchyApplicationException("APNS certificate problem");
}
if (apnsService != null) {
apnsService.stop();
apnsService = null;
}
apnsService = apnsServiceBuilder.build();
}
}