javapns IOS推送
package javapns.test; import java.util.*; import javapns.*; import javapns.communication.exceptions.*; import javapns.devices.*; /** * A command-line test facility for the Feedback Service. * <p>Example: <code>java -cp "[required libraries]" javapns.test.FeedbackTest keystore.p12 mypass</code></p> * * <p>By default, this test uses the sandbox service. To switch, add "production" as a third parameter:</p> * <p>Example: <code>java -cp "[required libraries]" javapns.test.FeedbackTest keystore.p12 mypass production</code></p> * * @author Sylvain Pedneault */ public class FeedbackTest extends TestFoundation { /** * Execute this class from the command line to run tests. * * @param args */ public static void main(String[] args) { /* Verify that the test is being invoked */ if (!verifyCorrectUsage(FeedbackTest.class, args, "keystore-path", "keystore-password", "[production|sandbox]")) return; /* Initialize Log4j to print logs to console */ configureBasicLogging(); /* Get a list of inactive devices */ feedbackTest(args); } private FeedbackTest() { } /** * Retrieves a list of inactive devices from the Feedback service. * @param args */ private static void feedbackTest(String[] args) { String keystore = args[0]; String password = args[1]; boolean production = args.length >= 3 ? args[2].equalsIgnoreCase("production") : false; try { List<Device> devices = Push.feedback(keystore, password, production); for (Device device : devices) { System.out.println("Inactive device: " + device.getToken()); } } catch (CommunicationException e) { e.printStackTrace(); } catch (KeystoreException e) { e.printStackTrace(); } } }
package javapns.test; import java.util.*; import javapns.*; import javapns.communication.exceptions.*; import javapns.devices.*; import javapns.devices.implementations.basic.*; import javapns.notification.*; import javapns.notification.transmission.*; import org.json.*; /** * A command-line test facility for the Push Notification Service. * <p>Example: <code>java -cp "[required libraries]" javapns.test.NotificationTest keystore.p12 mypass 2ed202ac08ea9033665e853a3dc8bc4c5e78f7a6cf8d55910df230567037dcc4</code></p> * * <p>By default, this test uses the sandbox service. To switch, add "production" as a fourth parameter:</p> * <p>Example: <code>java -cp "[required libraries]" javapns.test.NotificationTest keystore.p12 mypass 2ed202ac08ea9033665e853a3dc8bc4c5e78f7a6cf8d55910df230567037dcc4 production</code></p> * * <p>Also by default, this test pushes a simple alert. To send a complex payload, add "complex" as a fifth parameter:</p> * <p>Example: <code>java -cp "[required libraries]" javapns.test.NotificationTest keystore.p12 mypass 2ed202ac08ea9033665e853a3dc8bc4c5e78f7a6cf8d55910df230567037dcc4 production complex</code></p> * * <p>To send a simple payload to a large number of fake devices, add "threads" as a fifth parameter, the number of fake devices to construct, and the number of threads to use:</p> * <p>Example: <code>java -cp "[required libraries]" javapns.test.NotificationTest keystore.p12 mypass 2ed202ac08ea9033665e853a3dc8bc4c5e78f7a6cf8d55910df230567037dcc4 sandbox threads 1000 5</code></p> * * @author Sylvain Pedneault */ public class NotificationTest extends TestFoundation { /** * Execute this class from the command line to run tests. * * @param args */ public static void main(String[] args) { /* Verify that the test is being invoked */ if (!verifyCorrectUsage(NotificationTest.class, args, "keystore-path", "keystore-password", "device-token", "[production|sandbox]", "[complex|simple|threads]", "[#devices]", "[#threads]")) return; /* Initialize Log4j to print logs to console */ configureBasicLogging(); /* Push an alert */ try { pushTest(args); } catch (CommunicationException e) { e.printStackTrace(); } catch (KeystoreException e) { e.printStackTrace(); } } private NotificationTest() { } /** * Push a test notification to a device, given command-line parameters. * * @param args * @throws KeystoreException * @throws CommunicationException */ private static void pushTest(String[] args) throws CommunicationException, KeystoreException { String keystore = args[0]; String password = args[1]; String token = args[2]; boolean production = args.length >= 4 ? args[3].equalsIgnoreCase("production") : false; boolean simulation = args.length >= 4 ? args[3].equalsIgnoreCase("simulation") : false; boolean complex = args.length >= 5 ? args[4].equalsIgnoreCase("complex") : false; boolean threads = args.length >= 5 ? args[4].equalsIgnoreCase("threads") : false; int threadDevices = args.length >= 6 ? Integer.parseInt(args[5]) : 100; int threadThreads = args.length >= 7 ? Integer.parseInt(args[6]) : 10; boolean simple = !complex && !threads; verifyKeystore(keystore, password, production); if (simple) { /* Push a test alert */ List<PushedNotification> notifications = Push.test(keystore, password, production, token); printPushedNotifications(notifications); } else if (complex) { /* Push a more complex payload */ List<PushedNotification> notifications = Push.payload(createComplexPayload(), keystore, password, production, token); printPushedNotifications(notifications); } else if (threads) { /* Push a Hello World! alert repetitively using NotificationThreads */ pushSimplePayloadUsingThreads(keystore, password, production, token, simulation, threadDevices, threadThreads); } } /** * Create a complex payload for test purposes. * @return */ @SuppressWarnings("unchecked") private static Payload createComplexPayload() { PushNotificationPayload complexPayload = PushNotificationPayload.complex(); try { // You can use addBody to add simple message, but we'll use // a more complex alert message so let's comment it complexPayload.addCustomAlertBody("My alert message"); complexPayload.addCustomAlertActionLocKey("Open App"); complexPayload.addCustomAlertLocKey("javapns rocks %@ %@%@"); ArrayList parameters = new ArrayList(); parameters.add("Test1"); parameters.add("Test"); parameters.add(2); complexPayload.addCustomAlertLocArgs(parameters); complexPayload.addBadge(45); complexPayload.addSound("default"); complexPayload.addCustomDictionary("acme", "foo"); complexPayload.addCustomDictionary("acme2", 42); ArrayList values = new ArrayList(); values.add("value1"); values.add(2); complexPayload.addCustomDictionary("acme3", values); } catch (JSONException e) { System.out.println("Error creating complex payload:"); e.printStackTrace(); } return complexPayload; } protected static void pushSimplePayloadUsingThreads(String keystore, String password, boolean production, String token, boolean simulation, int devices, int threads) { try { System.out.println("Creating PushNotificationManager and AppleNotificationServer"); AppleNotificationServer server = new AppleNotificationServerBasicImpl(keystore, password, production); System.out.println("Creating payload (simulation mode)"); // Payload payload = PushNotificationPayload.alert("Hello World!"); Payload payload = PushNotificationPayload.test(); System.out.println("Generating " + devices + " fake devices"); List<Device> deviceList = new ArrayList<Device>(devices); for (int i = 0; i < devices; i++) { String tokenToUse = token; if (tokenToUse == null || tokenToUse.length() != 64) { tokenToUse = "123456789012345678901234567890123456789012345678901234567" + (1000000 + i); } deviceList.add(new BasicDevice(tokenToUse)); } System.out.println("Creating " + threads + " notification threads"); NotificationThreads work = new NotificationThreads(server, simulation ? payload.asSimulationOnly() : payload, deviceList, threads); //work.setMaxNotificationsPerConnection(10000); System.out.println("Linking notification work debugging listener"); work.setListener(DEBUGGING_PROGRESS_LISTENER); System.out.println("Starting all threads..."); long timestamp1 = System.currentTimeMillis(); work.start(); System.out.println("All threads started, waiting for them..."); work.waitForAllThreads(); long timestamp2 = System.currentTimeMillis(); System.out.println("All threads finished in " + (timestamp2 - timestamp1) + " milliseconds"); printPushedNotifications(work.getPushedNotifications()); } catch (Exception e) { e.printStackTrace(); } } /** * A NotificationProgressListener you can use to debug NotificationThreads. */ public static final NotificationProgressListener DEBUGGING_PROGRESS_LISTENER = new NotificationProgressListener() { public void eventThreadStarted(NotificationThread notificationThread) { System.out.println(" [EVENT]: thread #" + notificationThread.getThreadNumber() + " started with " + notificationThread.getDevices().size() + " devices beginning at message id #" + notificationThread.getFirstMessageIdentifier()); } public void eventThreadFinished(NotificationThread thread) { System.out.println(" [EVENT]: thread #" + thread.getThreadNumber() + " finished: pushed messages #" + thread.getFirstMessageIdentifier() + " to " + thread.getLastMessageIdentifier() + " toward " + thread.getDevices().size() + " devices"); } public void eventConnectionRestarted(NotificationThread thread) { System.out.println(" [EVENT]: connection restarted in thread #" + thread.getThreadNumber() + " because it reached " + thread.getMaxNotificationsPerConnection() + " notifications per connection"); } public void eventAllThreadsStarted(NotificationThreads notificationThreads) { System.out.println(" [EVENT]: all threads started: " + notificationThreads.getThreads().size()); } public void eventAllThreadsFinished(NotificationThreads notificationThreads) { System.out.println(" [EVENT]: all threads finished: " + notificationThreads.getThreads().size()); } public void eventCriticalException(NotificationThread notificationThread, Exception exception) { System.out.println(" [EVENT]: critical exception occurred: " + exception); } }; /** * Print to the console a comprehensive report of all pushed notifications and results. * @param notifications a raw list of pushed notifications */ public static void printPushedNotifications(List<PushedNotification> notifications) { List<PushedNotification> failedNotifications = PushedNotification.findFailedNotifications(notifications); List<PushedNotification> successfulNotifications = PushedNotification.findSuccessfulNotifications(notifications); int failed = failedNotifications.size(); int successful = successfulNotifications.size(); if (successful > 0 && failed == 0) { printPushedNotifications("All notifications pushed successfully (" + successfulNotifications.size() + "):", successfulNotifications); } else if (successful == 0 && failed > 0) { printPushedNotifications("All notifications failed (" + failedNotifications.size() + "):", failedNotifications); } else if (successful == 0 && failed == 0) { System.out.println("No notifications could be sent, probably because of a critical error"); } else { printPushedNotifications("Some notifications failed (" + failedNotifications.size() + "):", failedNotifications); printPushedNotifications("Others succeeded (" + successfulNotifications.size() + "):", successfulNotifications); } } /** * Print to the console a list of pushed notifications. * @param description a title for this list of notifications * @param notifications a list of pushed notifications to print */ public static void printPushedNotifications(String description, List<PushedNotification> notifications) { System.out.println(description); for (PushedNotification notification : notifications) { try { System.out.println(" " + notification.toString()); } catch (Exception e) { e.printStackTrace(); } } } }
package javapns.test; import java.io.*; import java.util.*; import javapns.*; import javapns.communication.exceptions.*; import javapns.devices.*; import javapns.devices.implementations.basic.*; import javapns.notification.*; import javapns.notification.transmission.*; import org.json.*; /** * Specific test cases intended for the project's developers. * * @author Sylvain Pedneault */ public class SpecificNotificationTests extends TestFoundation { /** * Execute this class from the command line to run tests. * * @param args */ public static void main(String[] args) { /* Verify that the test is being invoked */ if (!verifyCorrectUsage(NotificationTest.class, args, "keystore-path", "keystore-password", "device-token", "[production|sandbox]", "[test-name]")) return; /* Initialize Log4j to print logs to console */ configureBasicLogging(); /* Push an alert */ runTest(args); } private SpecificNotificationTests() { } /** * Push a test notification to a device, given command-line parameters. * * @param args */ private static void runTest(String[] args) { String keystore = args[0]; String password = args[1]; String token = args[2]; boolean production = args.length >= 4 ? args[3].equalsIgnoreCase("production") : false; boolean simulation = args.length >= 4 ? args[3].equalsIgnoreCase("simulation") : false; String testName = args.length >= 5 ? args[4] : null; if (testName == null || testName.length() == 0) testName = "default"; try { SpecificNotificationTests.class.getDeclaredMethod("test_" + testName, String.class, String.class, String.class, boolean.class).invoke(null, keystore, password, token, production); } catch (NoSuchMethodException e) { System.out.println(String.format("Error: test '%s' not found. Test names are case-sensitive", testName)); } catch (Exception e) { (e.getCause() != null ? e.getCause() : e).printStackTrace(); } } private static void test_PushHelloWorld(String keystore, String password, String token, boolean production) throws CommunicationException, KeystoreException { List<PushedNotification> notifications = Push.alert("Hello World!", keystore, password, production, token); NotificationTest.printPushedNotifications(notifications); } private static void test_Issue74(String keystore, String password, String token, boolean production) { try { System.out.println(""); System.out.println("TESTING 257-BYTES PAYLOAD WITH SIZE ESTIMATION ENABLED"); /* Expected result: PayloadMaxSizeProbablyExceededException when the alert is added to the payload */ pushSpecificPayloadSize(keystore, password, token, production, true, 257); } catch (Exception e) { e.printStackTrace(); } try { System.out.println(""); System.out.println("TESTING 257-BYTES PAYLOAD WITH SIZE ESTIMATION DISABLED"); /* Expected result: PayloadMaxSizeExceededException when the payload is pushed */ pushSpecificPayloadSize(keystore, password, token, production, false, 257); } catch (Exception e) { e.printStackTrace(); } try { System.out.println(""); System.out.println("TESTING 256-BYTES PAYLOAD"); /* Expected result: no exception */ pushSpecificPayloadSize(keystore, password, token, production, false, 256); } catch (Exception e) { e.printStackTrace(); } } private static void test_Issue75(String keystore, String password, String token, boolean production) { try { System.out.println(""); System.out.println("TESTING 257-BYTES PAYLOAD WITH SIZE ESTIMATION ENABLED"); NewsstandNotificationPayload payload = NewsstandNotificationPayload.contentAvailable(); debugPayload(payload); List<PushedNotification> notifications = Push.payload(payload, keystore, password, production, token); NotificationTest.printPushedNotifications(notifications); } catch (Exception e) { e.printStackTrace(); } } private static void test_Issue82(String keystore, String password, String token, boolean production) { try { System.out.println(""); Payload payload = PushNotificationPayload.test(); System.out.println("TESTING ISSUE #82 PART 1"); List<PushedNotification> notifications = Push.payload(payload, keystore, password, production, 1, token); NotificationTest.printPushedNotifications(notifications); System.out.println("ISSUE #82 PART 1 TESTED"); System.out.println("TESTING ISSUE #82 PART2"); AppleNotificationServer server = new AppleNotificationServerBasicImpl(keystore, password, production); NotificationThread thread = new NotificationThread(new PushNotificationManager(), server, payload, token); thread.setListener(NotificationTest.DEBUGGING_PROGRESS_LISTENER); thread.start(); System.out.println("ISSUE #82 PART 2 TESTED"); } catch (Exception e) { e.printStackTrace(); } } private static void test_Issue87(String keystore, String password, String token, boolean production) { try { System.out.println("TESTING ISSUES #87 AND #88"); InputStream ks = new BufferedInputStream(new FileInputStream(keystore)); PushQueue queue = Push.queue(ks, password, false, 3); queue.start(); queue.add(PushNotificationPayload.test(), token); queue.add(PushNotificationPayload.test(), token); queue.add(PushNotificationPayload.test(), token); queue.add(PushNotificationPayload.test(), token); Thread.sleep(10000); List<Exception> criticalExceptions = queue.getCriticalExceptions(); for (Exception exception : criticalExceptions) { exception.printStackTrace(); } Thread.sleep(10000); List<PushedNotification> pushedNotifications = queue.getPushedNotifications(); NotificationTest.printPushedNotifications("BEFORE CLEAR:", pushedNotifications); queue.clearPushedNotifications(); pushedNotifications = queue.getPushedNotifications(); NotificationTest.printPushedNotifications("AFTER CLEAR:", pushedNotifications); Thread.sleep(50000); System.out.println("ISSUES #87 AND #88 TESTED"); } catch (Exception e) { e.printStackTrace(); } } private static void test_Issue88(String keystore, String password, String token, boolean production) { try { System.out.println("TESTING ISSUES #88"); // List<String> devices = new Vector<String>(); // for (int i = 0; i < 5; i++) { // devices.add(token); // } // PushedNotifications notifications = Push.payload(PushNotificationPayload.test(), keystore, password, false, devices); PushQueue queue = Push.queue(keystore, password, false, 1); queue.start(); queue.add(PushNotificationPayload.test(), token); queue.add(PushNotificationPayload.test(), token); queue.add(PushNotificationPayload.test(), token); queue.add(PushNotificationPayload.test(), token); Thread.sleep(10000); PushedNotifications notifications = queue.getPushedNotifications(); NotificationTest.printPushedNotifications(notifications); Thread.sleep(5000); System.out.println("ISSUES #88 TESTED"); } catch (Exception e) { e.printStackTrace(); } } private static void test_Issue99(String keystore, String password, String token, boolean production) { try { System.out.println(""); System.out.println("TESTING ISSUE #99"); PushNotificationPayload payload = PushNotificationPayload.complex(); payload.addCustomAlertBody("Hello World!"); payload.addCustomAlertActionLocKey(null); debugPayload(payload); List<PushedNotification> notifications = Push.payload(payload, keystore, password, production, token); NotificationTest.printPushedNotifications(notifications); System.out.println("ISSUE #99 TESTED"); } catch (Exception e) { e.printStackTrace(); } } private static void test_Issue102(String keystore, String password, String token, boolean production) { try { System.out.println(""); System.out.println("TESTING ISSUE #102"); int devices = 10000; int threads = 20; boolean simulation = false; String realToken = token; token = null; try { System.out.println("Creating PushNotificationManager and AppleNotificationServer"); AppleNotificationServer server = new AppleNotificationServerBasicImpl(keystore, password, production); System.out.println("Creating payload (simulation mode)"); //Payload payload = PushNotificationPayload.alert("Hello World!"); Payload payload = PushNotificationPayload.test(); System.out.println("Generating " + devices + " fake devices"); List<Device> deviceList = new ArrayList<Device>(devices); for (int i = 0; i < devices; i++) { String tokenToUse = token; if (tokenToUse == null || tokenToUse.length() != 64) { tokenToUse = "123456789012345678901234567890123456789012345678901234567" + (1000000 + i); } deviceList.add(new BasicDevice(tokenToUse)); } deviceList.add(new BasicDevice(realToken)); System.out.println("Creating " + threads + " notification threads"); NotificationThreads work = new NotificationThreads(server, simulation ? payload.asSimulationOnly() : payload, deviceList, threads); //work.setMaxNotificationsPerConnection(10000); //System.out.println("Linking notification work debugging listener"); //work.setListener(DEBUGGING_PROGRESS_LISTENER); System.out.println("Starting all threads..."); long timestamp1 = System.currentTimeMillis(); work.start(); System.out.println("All threads started, waiting for them..."); work.waitForAllThreads(); long timestamp2 = System.currentTimeMillis(); System.out.println("All threads finished in " + (timestamp2 - timestamp1) + " milliseconds"); NotificationTest.printPushedNotifications(work.getSuccessfulNotifications()); } catch (Exception e) { e.printStackTrace(); } // List<PushedNotification> notifications = Push.payload(payload, keystore, password, production, token); // NotificationTest.printPushedNotifications(notifications); System.out.println("ISSUE #102 TESTED"); } catch (Exception e) { e.printStackTrace(); } } private static void test_ThreadPoolFeature(String keystore, String password, String token, boolean production) throws Exception { try { System.out.println(""); System.out.println("TESTING THREAD POOL FEATURE"); AppleNotificationServer server = new AppleNotificationServerBasicImpl(keystore, password, production); NotificationThreads pool = new NotificationThreads(server, 3).start(); Device device = new BasicDevice(token); System.out.println("Thread pool started and waiting..."); System.out.println("Sleeping 5 seconds before queuing payloads..."); Thread.sleep(5 * 1000); for (int i = 1; i <= 4; i++) { Payload payload = PushNotificationPayload.alert("Test " + i); NotificationThread threadForPayload = (NotificationThread) pool.add(new PayloadPerDevice(payload, device)); System.out.println("Queued payload " + i + " to " + threadForPayload.getThreadNumber()); System.out.println("Sleeping 10 seconds before queuing another payload..."); Thread.sleep(10 * 1000); } System.out.println("Sleeping 10 more seconds let threads enough times to push the latest payload..."); Thread.sleep(10 * 1000); } catch (Exception e) { e.printStackTrace(); } } private static void pushSpecificPayloadSize(String keystore, String password, String token, boolean production, boolean checkWhenAdding, int targetPayloadSize) throws CommunicationException, KeystoreException, JSONException { StringBuilder buf = new StringBuilder(); for (int i = 0; i < targetPayloadSize - 20; i++) buf.append('x'); String alertMessage = buf.toString(); PushNotificationPayload payload = PushNotificationPayload.complex(); if (checkWhenAdding) payload.setPayloadSizeEstimatedWhenAdding(true); debugPayload(payload); boolean estimateValid = payload.isEstimatedPayloadSizeAllowedAfterAdding("alert", alertMessage); System.out.println("Payload size estimated to be allowed: " + (estimateValid ? "yes" : "no")); payload.addAlert(alertMessage); debugPayload(payload); List<PushedNotification> notifications = Push.payload(payload, keystore, password, production, token); NotificationTest.printPushedNotifications(notifications); } private static void debugPayload(Payload payload) { System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"); try { System.out.println("Payload size: " + payload.getPayloadSize()); } catch (Exception e) { } try { System.out.println("Payload representation: " + payload); } catch (Exception e) { } System.out.println(payload.isPayloadSizeEstimatedWhenAdding() ? "Payload size is estimated when adding properties" : "Payload size is only checked when it is complete"); System.out.println("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv"); } }
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。
谢谢您的赞助,我会做的更好!
相关推荐
在本文中,我们将深入探讨JavaPNS库以及如何在Java环境中集成并使用它来实现iOS推送通知。 **JavaPNS库介绍** JavaPNS是一个轻量级、易于使用的库,旨在简化开发人员与Apple Push Notification Service之间的交互。...
Java实现iOS推送主要是通过使用第三方库,如javapns,来与Apple Push Notification Service (APNs)进行交互。下面我们将深入探讨这个话题。 首先,让我们理解APNs。APNs是苹果公司提供的一个服务,它允许开发者向...
在iOS应用开发中,为了实现实时的消息推送功能,通常会使用Apple Push Notification Service (APNS)。在Java服务端实现iOS消息推送涉及到以下几个关键步骤和技术: 1. **应用程序注册消息推送**: 当用户首次启动iOS...
JavaPNS_2.2版本是这个库的一个更新迭代,提供了对iOS和Android设备推送通知的支持。 JavaPNS_2.2.jar是该库的核心组件,包含了所有必要的类和方法,使得开发者能够轻松地在Java应用中集成远程推送通知功能。这个...
标题中的“jsp iOS推送的包”指的是一个针对iOS设备进行远程通知推送的开发资源包,主要基于Java平台。这个包包含了一系列的库文件,用于帮助开发者实现从服务器端向iOS客户端发送Push Notification服务。在iOS应用...
在iOS平台上,推送通知是一种非常...总的来说,基于Java的iOS推送通知涉及到了iOS的通知机制、JavaPNS库的使用以及与APNS服务器的交互。正确配置和使用这些组件,可以有效地实现在Java服务端向iOS设备发送推送通知。
本文将深入探讨“iOS消息推送服务端开发”,包括主流的推送方式、JavaAPNS库以及如何实现多线程推送。 首先,iOS消息推送服务(Apple Push Notification service,简称APNs)是苹果公司提供的官方服务,用于向运行...
JavaPNS是Java平台上用于实现Apple Push Notification Service (APNs)的一个开源库,版本2.2提供了对iPhone设备推送...通过深入理解和实践这些知识点,你将能够有效地使用JavaPNS-2.2为你的iOS应用实现推送通知功能。
Java进行苹果APNS(Apple Push Notification Service)消息推送是一项在iOS和macOS应用程序中实现远程通知功能的关键技术。本文将详细介绍如何使用Java实现这一过程,同时关注`javapns`库和`bcprov-jdk`加密组件的...
**iOS推送Java服务端文档详解** 在iOS应用开发中,为了实现远程通知功能,...以上文档和文件将帮助你理解和实现Java服务端的iOS推送功能,结合`javaPNS2.2`库,你可以高效地构建推送系统,为用户提供及时的通知服务。
Java iOS 消息推送依赖于特定的库,如在标题和描述中提到的 `bcprov-jdk15on-149.jar` 和 `javapns-jdk16-163.jar`,这两个库是实现Apple Push Notification Service (APNS)的关键组件。APNS是苹果公司提供的一项...
在iOS推送服务中,可能需要进行一些加密操作,如生成或验证APNs证书,这时Bouncy Castle库就显得尤为重要。 2. **commons-io-2.0.1.jar**:Apache Commons IO是Java的一个实用工具库,提供了许多I/O操作的类和方法...
描述中提到的"IOS原生推送两个必要依赖"指出了至少需要两个关键的库文件,即bcprov-jdk16-145.jar和javapns-jdk16-163.jar。 1. **Apple Push Notification Service (APNs)**:这是苹果公司提供的服务,允许开发者...
#testpush ##开发工具 下载 , ##maven配置 下载了lastest version,文件名:apache-maven-3.2.1-bin.tar.gz 将解压在当前目录下。 将解压后的apache-maven-3.2.1文件夹移到/usr/local/maven目录(不存在则新建)下...
总之,通过集成JavaPNS库,我们可以轻松地在JAVA环境中实现与APNs的交互,从而为iOS用户提供实时的消息推送服务。记得在生产环境中,确保你的证书和密钥是正确的,以及你的设备Token是有效的,否则推送可能无法正常...
java向Iphone(IOS)推送相关的五个jar包,分别是bcprov-jdk16-145.jar,commons-io-2.0.1.jar,commons-lang-2.1.jar,javapns-jdk16-163.jar, log4j-1.2.12.jar
JavaPNS是一个开源库,专为Java开发者设计,用于与Apple Push Notification Service (APNs)交互,即向iOS和watchOS设备发送推送通知。在Java后台应用中使用JavaPNS,可以简化与APNs服务器通信的过程,使得开发人员...
第一阶段:Push服务器应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。 第二阶段:APNS在自身的已注册Push服务的... 第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。
1. **Apple Push Notification Service (APNs)**:是苹果公司提供的一个服务,允许开发者将实时的信息推送到用户的iOS、iPadOS和watchOS设备上,如应用更新、消息提醒等。 2. **JavaPNS**:是一个Java实现的客户端...