Akka-stream-apns is an Apple Push Notification Service (APNs) connector built on top of Akka Streams. As of version 0.2, akka-stream-apns uses the latest HTTP/2-based APNs provider API.
resolvers += Resolver.bintrayRepo("reactivehub", "maven")
libraryDependencies += "com.reactivehub" %% "akka-stream-apns" % "0.10"
To use the connector, you need a push notification client SSL certificate and a device token. See System Requirements for more details on how to choose a TLS provider.
import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.Source
import io.netty.channel.nio.NioEventLoopGroup
import reactivehub.akka.stream.apns.TlsUtil.loadPkcs12FromResource
import reactivehub.akka.stream.apns._
import reactivehub.akka.stream.apns.marshallers.SprayJsonSupport
object Main extends App with SprayJsonSupport {
implicit val system = ActorSystem("system")
implicit val _ = ActorMaterializer()
import system.dispatcher
val group = new NioEventLoopGroup()
val apns = ApnsExt(system).connection[Int](
Environment.Development,
loadPkcs12FromResource("/cert.p12", "password"),
group)
val deviceToken = DeviceToken("64-chars hex string")
val payload = Payload.Builder()
.withAlert("Hello!")
.withBadge(1)
Source.single(1 → Notification(deviceToken, payload))
.via(apns)
.runForeach(println)
.onComplete { _ ⇒
group.shutdownGracefully()
system.terminate()
}
}
Akka-stream-apns comes with a convenient payload builder. The payload is a JSON object with the required key apns
and
zero or more custom keys. The builder can use a JSON library of your choice; just mix in
SprayJsonSupport
, PlayJsonSupport
or LiftJsonSupport
or bring into scope your own PayloadMarshaller
.
val payload = Payload.Builder()
.withAlert("Bob wants to play poker")
.withLocalizedAlert("GAME_PLAY_REQUEST_FORMAT", "Jenna", "Frank")
.withTitle("Game Request")
.withLocalizedTitle("GAME_PLAY_REQUEST_TITLE")
.withLocalizedAction("PLAY")
.withLaunchImage("Default.png")
.withBadge(9)
.withSound("chime.aiff")
.withContentAvailable
.withCategory("ACCEPT_IDENTIFIER")
.withCustomField("acme1", "bar")
.withCustomField("acme2", 42)
Akka-stream-apns works with Java 8 and newer.
HTTP/2 over TLS requires the use of ALPN. Java, however, currently does not
support ALPN. As akka-stream-apns internally uses Netty's
codec-http2
to connect to APNs servers, there are two options how to do TLS:
-
Add
Xbootclasspath
JVM option with the path to the Jettyalpn-boot
jar. The Jetty-ALPN jar is specific to the version of Java you are using.java -Xbootclasspath/p:/path/to/jetty/alpn/extension.jar ...
- No reconnect/resend on error (yet)
Our professional consulting services are highly flexible to address specific issues such as troubleshooting or other services tailored to suit your needs.
Please contact us for more information.