}
// all good, let's build the JSON payload for APNs
final String apnsMessage = builder.build();
ApnsService service = buildApnsService(iOSVariant, callback);
if (service != null) {
try {
logger.fine("Sending transformed APNs payload: " + apnsMessage);
// send:
service.start();
Date expireDate = createFutureDateBasedOnTTL(pushMessage.getConfig().getTimeToLive());
service.push(tokens, apnsMessage, expireDate);
logger.info("Message to APNs has been submitted");
// after sending, let's ask for the inactive tokens:
final Set<String> inactiveTokens = service.getInactiveDevices().keySet();
// transform the tokens to be all lower-case:
final Set<String> transformedTokens = lowerCaseAllTokens(inactiveTokens);
// trigger asynchronous deletion:
if (! transformedTokens.isEmpty()) {
logger.info("Deleting '" + inactiveTokens.size() + "' invalid iOS installations");
clientInstallationService.removeInstallationsForVariantByDeviceTokens(iOSVariant.getVariantID(), transformedTokens);
}
callback.onSuccess();
} catch (Exception e) {
callback.onError("Error sending payload to APNs server: " + e.getMessage());
} finally {
// tear down and release resources:
service.stop();
}
} else {
callback.onError("No certificate was found. Could not send messages to APNs");
}
}