Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google App Engine APNS

Im developing the server side for an iOS app with Google App Engine and JDO in Java, and I just realized that GAE dont support Apple Push Notification Service, and I`m very frustrated.

I have been seen quite of solutions like Urban Airship, xtify, etc; but It`s too expensive if I reach to have an important amount of users.

Besides, I have been investigating about Javapns and similars, but GAE don`t support BouncyCastle either.

I want to know if there is a free or low cost solution for support APNS in my GAE server, because I can`t pay 200 $ per month. If there is not solution for my problem, would it been possible to build another server only for doing the Apple push notication with javapns, and that my GAE talks with it?

like image 612
Mato Reyes Castañeda Avatar asked Oct 31 '12 09:10

Mato Reyes Castañeda


2 Answers

I use the 3rd-party library notnoop/java-apns. It is easy to use. The only problem you could meet is the thread limitation on the GAE like below java exception:

java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")

The issue is solved in the version 1.0.0.Beta3 in the maven central. The detail solution is explained in this pull request #162.

So, the example code snippet to prepare and send push notification to APNs is like below, the key to solve the thread limitation is the method withErrorDetectionThreadFactory as below

// Prepare ApnsService
ClassPathResource certificate = new ClassPathResource("aps_production.p12");

ApnsService service = null;
try {
    service = APNS.newService()
      .withErrorDetectionThreadFactory(ThreadManager.currentRequestThreadFactory()) // use GAE currentRequestThreadFactory
      .withCert(certificate.getInputStream(), certificatePassword)
      .withProductionDestination()
      .build();
} catch (InvalidSSLConfig | IOException e) {
    logger.warn("Fail to initialize APNs service");
}

// Send notification
String apnsPayload = APNS.newPayload()
    .alertBody("test alert")
    .badge(1)
    .sound("default")
    .customField("type", "general")
    .build();

service.push(<your device id>, apnsPayload);
like image 100
Browny Lin Avatar answered Oct 03 '22 03:10

Browny Lin


AppEngine now supports Sockets so you should be able to use a slightly modified version of javapns now. I have successfully got PyAPNs working on AppEngine (python) which uses the new Socket functionality in 1.7.7.

If you are interested in seeing my python AppEngine project which does APNS, let me know and I will edit my answer with a link to it. Every time I post a link to it here, a moderator deletes my answer for some reason

like image 37
Garett Avatar answered Oct 03 '22 05:10

Garett