我正在尝试使用Apple的推送通知。我在这里使用这个教程: http://www.ibm.com/developerworks/java/library/mo-ios-push/#ibm-pcon
我正在尝试创建推送通知。示例代码在这里: http://code.google.com/p/javapns/wiki/PushNotificationBasic看起来像这样:
import javapns.Push;
public class PushTest {
public static void main(String[] args) {
Push.alert("Hello World!", "keystore.p12", "keystore_password", false, "Your token");
}
}
除了keystore.p12部分外,我已经完成了所有设置。以下是文档中关于密钥库的内容:
对象密钥库:对密钥库文件或实际密钥库内容的引用。有关如何创建密钥库的更多信息,请参阅准备证书。您可以将以下对象传递给此参数:
我不只是想在我的计算机上输入密钥库的路径(因为他们在这里Getting error while sending Push Notification to iPhone using Java-PNS?),因为我觉得这样不安全。
我应该使用哪些物品?我倾向于使用java.security.KeyStore。
最后需要注意的是,此代码需要托管在Amazon Web Service的Elastic Beanstalk上(如果重要的话)。
---------编辑1 ------------
我试图输入Richard J. Ross III的代码。但在可以了解我的.p12文件设置是否正确之前,我首先需要解决有关JavaPNS(以及我相信的文件结构)的问题。运行下面的代码会给我这个错误:HTTP Status 404 - Servlet IosSendGameServlet is not available
。当我注释掉所有JavaPNS语句时,我收到此错误:HTTP Status 500 - javax.servlet.ServletException: Parameter recievingAppleDeviceID not found.
(因为我没有输入参数)这使我相信JavaPNS的访问方式存在问题。也许它在我的文件结构中的位置错误?它与servlet-api(在lib中)位于同一位置。这可能是我上传到AWS Elastic Beanstalk服务器的方式有问题吗?
package com.google.android.gcm.demo.server;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javapns.Push; //<--gets commented out to receive 500 error
import javapns.communication.exceptions.CommunicationException;//<--gets commented out to receive 500 error
import javapns.communication.exceptions.KeystoreException;//<--gets commented out to receive 500 error
public class IosSendGameServlet extends BaseServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException,
ServletException {
String recievingAppleDeviceId = getParameter(req,
"recievingAppleDeviceID");
String sendingUser = getParameter(req, "sendingUser");
InputStream keyStore = this.getClass().getResourceAsStream("/sasSandbox.p12");
//everything below here gets commented out to receive 500 error
try {
Push.alert("Game with " + sendingUser + ": It's your turn!", keyStore, "mypassword", false,
recievingAppleDeviceId);
} catch (CommunicationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeystoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答案 0 :(得分:2)
您应该使用InputStream
,并在类路径中包含.p12文件,并使用如下:
InputStream keyStore = this.getClass().getResourceAsStream("nameOfMyKeystore.p12");