APNS - Can't send notification to iOS device u

2019-09-09 21:00发布

问题:

I need to get this working but I'm completely out of options...any help would be greatly appreciated.

I'm trying to send notifications to my iOS device using Java and have followed many tutorials and forum posts, mainly these: raywenderlich.com, JavaPNS Basic Example, and the java-apns example shown below.

I am, however, able to send notifications using PHP. Can someone see anything I'm doing wrong? I've been working for several days on this and can't figure out what the issue is b/c I've copied the exact code that other people claim works. Here's my code:

public static void main(String[] args) {
    try {
        // Not my real token
        String token = "2919333333333545F19B427AE7E98307B1B2AA9390A38BC0E533E77E11111111";
        ApnsService service = APNS.newService()
                .withCert("C://code//Dev.p12", "password")  // (path to cert, password)
                .withSandboxDestination()
                //.withProductionDestination()
                .build();

        //System.out.println("Testing the connection...");
        //service.testConnection();
        //System.out.println("...Successful!");

        String payload = APNS.newPayload()
                .alertBody("Java test message!")
                .sound("default")
                .build();

        System.out.println("About to send the message...");
        service.push(token, payload);
        System.out.println("...message sent!");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Here is the exception I get:

About to send the message...
com.notnoop.exceptions.NetworkIOException: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at com.notnoop.apns.internal.Utilities.wrapAndThrowAsRuntimeException(Utilities.java:284)
at com.notnoop.apns.internal.ApnsConnectionImpl.sendMessage(ApnsConnectionImpl.java:342)
at com.notnoop.apns.internal.ApnsConnectionImpl.sendMessage(ApnsConnectionImpl.java:312)
at com.notnoop.apns.internal.ApnsServiceImpl.push(ApnsServiceImpl.java:46)
at com.notnoop.apns.internal.AbstractApnsService.push(AbstractApnsService.java:56)
at com.notnoop.apns.internal.ApnsServiceImpl.push(ApnsServiceImpl.java:36)
at com.notnoop.apns.internal.AbstractApnsService.push(AbstractApnsService.java:45)
at utilities.APNSTestUtility.main(APNSTestUtility.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:992)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
at java.io.OutputStream.write(OutputStream.java:75)
at com.notnoop.apns.internal.ApnsConnectionImpl.sendMessage(ApnsConnectionImpl.java:328)
... 11 more
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.read(InputRecord.java:505)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
... 16 more

When I include a wrong password I get an exception for an incorrect password so I know it's finding the .p12 file. I can send notifications with the PHP example I found online but there MUST be something I'm missing with the Java code. I have tried both the java-apns library (shown above) and the JavaPNS library and I get the same results.

回答1:

We should not use the private key p12 file, instead we should generate a p12 from your private key and the cert download from Apple. execute the following OpenSSL command to get the correct p12 file:

developer_identity.cer <= download from Apple
mykey.p12 <= Your private key

openssl x509 -in developer_identity.cer -inform DER -out developer_identity.pem -outform PEM
openssl pkcs12 -nocerts -in mykey.p12 -out mykey.pem
openssl pkcs12 -export -inkey mykey.pem -in developer_identity.pem -out iphone_dev.p12