Uniqush is a free and open source software system which provides a unified push service for server side notification to apps on mobile devices.

Introduction

Uniqush (\ˈyü-nə-ku̇sh\ "uni" pronounced as in "unified", and "qush" pronounced as in "cushion") is a free and open source software system which provides a unified push service for server side notification to apps on mobile devices. The uniqush-push API abstracts the APIs of the various push services used to send push notifications to those devices. By running uniqush-push on the server side, you can send push notifications to any supported mobile platform.

Build Status

Supported Platforms

  • GCM from Google for the Android platform
  • FCM from Google for the Android platform
  • APNS from Apple for the iOS platform
  • ADM from Amazon for Kindle tablets

FAQ

  • Q: Is this a general push notification platform for all types of devices? How does this differ from services such as Urban Airship?

  • A: Urban Airship is a great service, and there are other similar services available, like OpenPush, Notificare, etc. All of them are wonderful services. However, Uniqush is different from them. Uniqush is not a service. Instead, Uniqush is a system, which runs on your own server. In fact, if you wish, you can use Uniqush to set up a service similar to Urban Airship.

  • Q: OK. Then is it a library? Like java-apns?

  • A: Well.. Not actually. I mean, it is a program, like Apache HTTP Server. You download it, you run it. It does require a Redis server, but, other than that, you don't need to worry about which language to use, package dependencies, etc.

  • Q: But wait, how can I use it anyway? I mean, if my program wants to send a push notification, I need to tell Uniqush about this action. How can I communicate with Uniqush? There must be some library so that I can use it in my program to talk with Uniqush, right?

  • A: We are trying to make it easier. uniqush-push provides RESTful APIs. In other words, you talk with uniqush-push through HTTP protocol. As long as there's an HTTP client library for your language, you can use it and talk with uniqush-push. For details about our RESTful APIs, see our API documentation.

  • Q: Then that's cool. But I noticed that you are using Go programming language. Do I need to install Go compiler and other stuff to run uniqush-push?

  • A: No. There are no installation dependencies. All you need to do is to download the binary file from the download page and install it. But you do need to set up a Redis server running somewhere, preferably with persistence, so that uniqush-push can store the user data in Redis. For more details, see the installation guide

  • Q: This is nice. I want to give it a try. But you are keep talking about uniqush-push, and I'm talking about Uniqush, are they the same thing?

  • A: Thank you for your support! Uniqush is intended to be the name of a system which provides a full stack solution for communication between mobile devices and the app's server. uniqush-push is one piece of the system. However, right now, uniqush-push is the only piece and others are under active development. If you want to know more details about the Uniqush system's plan, you can read the blog post. If you want to find out about the latest progress with Uniqush, please check out our blog. And, if you are really impatient, there's always our our GitHub account which could have brand-new stuff that hasn't been released yet.

Setting Up Redis

Redis persistence describes the details of how Redis saves data on shutdown, as well as how one might back up that data. Make sure that the Redis server you use has persistence enabled - your redis.conf should have contents similar to the section **PERSISTENCE** of redis.conf in the example config files linked in http://redis.io/topics/config

Contributing

You're encouraged to contribute to the uniqush-push project. There are two ways you can contribute.

Issues

If you encounter an issue while using uniqush-push, please report it at the project's issues tracker. Feature suggestions are also welcome.

Pull request

Code contributions to uniqush-push can be made using pull requests. To submit a pull request:

  1. Fork this project.
  2. Make and commit your changes.
  3. Submit your changes as a pull request.

Related Links

Comments
  • Using asterisk to send to all takes too long to prepare

    Using asterisk to send to all takes too long to prepare

    Hi,

    We got a pretty huge number of users and we try to send the * to send to all. Unfortunately doing an http requests will timeout the client because the server will try to prepare its stuff.

    I like how the gcm push works because its so fast. Except for APNS which is so slow.

  • Uniqush doesn't handle invalid payload received by apns server

    Uniqush doesn't handle invalid payload received by apns server

    GCM is ok but apns has restrictions of maximum payload of 256 bytes. This happens when the user sends a huge message or simply messages that are utf8-encoded. Uniqush should complain about this issue.

    Uniqush will be OOM killed by the kernel if handling this 'invalid payload'. We tested this with concurrent connections sending messages via celery. We had 8 workers and with 4 concurrency running each worker. When trying to send an invalid payload size, uniqush will crash and killed by the kernel.

  • Uniqush having problems with concurrency

    Uniqush having problems with concurrency

    Hi @monnand our uniqush seems to be failing at some point. Probably because of the load we give to it. Before, we had load balancer between two uniqush servers and it seems ok. Our setup today was just having only 1 servers and having multiple workers requesting to push. The following is the log error: ( Sorry if its too long)

    goroutine 4510 [select]: net/http.(_persistConn).writeLoop(0xc201b72680) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 4883 [IO wait]: net.runtime_pollWait(0x7f305c2805a0, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc201d847d0, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read(0xc201d84750, 0xc201650000, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc200399b00, 0xc201650000, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc2013b13f0, 0xc2000fd690, 0xc200399b00, 0x5, 0xc200399b00, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201d0e280, 0x17, 0x0, 0x413ae5) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201d0e280, 0xc2016ed000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc2008bfc00) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc2008bfc00, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc201e4dc00) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 5114 [semacquire]: sync.runtime_Semacquire(0xc2025ff7e8) /home/monnand/soft/golang/go/src/pkg/runtime/zsema_linux_amd64.c:165 +0x2e sync.(_WaitGroup).Wait(0xc202310e20) /home/monnand/soft/golang/go/src/pkg/sync/waitgroup.go:109 +0xf2 main.(_PushBackEnd).pushImpl(0xc2000fa440, 0xc20231a060, 0x24, 0xc202315407, 0x10, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:269 +0x497 main.(_PushBackEnd).Push(0xc2000fa440, 0xc20231a060, 0x24, 0xc202315407, 0x10, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:199 +0xd7 main.(_RestAPI).pushNotification(0xc2000fea50, 0xc20231a060, 0x24, 0xc202317780, 0xc2023177c0, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/restapi.go:242 +0x9ef main.(_RestAPI).ServeHTTP(0xc2000fea50, 0xc2000fa9c0, 0xc2023147e0, 0xc2023190d0) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/restapi.go:338 +0xc52 net/http.(_ServeMux).ServeHTTP(0xc2000b7540, 0xc2000fa9c0, 0xc2023147e0, 0xc2023190d0) /home/monnand/soft/golang/go/src/pkg/net/http/server.go:1416 +0x11d net/http.serverHandler.ServeHTTP(0xc2000feaa0, 0xc2000fa9c0, 0xc2023147e0, 0xc2023190d0) /home/monnand/soft/golang/go/src/pkg/net/http/server.go:1517 +0x16c net/http.(_conn).serve(0xc20202b870) /home/monnand/soft/golang/go/src/pkg/net/http/server.go:1096 +0x765 created by net/http.(_Server).Serve /home/monnand/soft/golang/go/src/pkg/net/http/server.go:1564 +0x266

    goroutine 4689 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201ca0a80, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5005 [IO wait]: net.runtime_pollWait(0x7f305c2d10a0, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc2017c0350, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read(0xc2017c02d0, 0xc201a82000, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc2001ec880, 0xc201a82000, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc20191dcc0, 0xc2000fd690, 0xc2001ec880, 0x5, 0xc2001ec880, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201061500, 0x17, 0x0, 0x413ae5) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201061500, 0xc20168e000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc2012c6de0) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc2012c6de0, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc20041f500) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 4905 [IO wait]: net.runtime_pollWait(0x7f305c22f1e0, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc20125d620, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read(0xc20125d5a0, 0xc2013a2000, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc20031add0, 0xc2013a2000, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc2003e5630, 0xc2000fd690, 0xc20031add0, 0x5, 0xc20031add0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201d0ea00, 0x17, 0x0, 0x41efd0) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201d0ea00, 0xc201a11000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc200943de0) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc200943de0, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc2005d1b80) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 4624 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc2019164e0, 0xc2019e0000, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4622 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc2014e4540, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4660 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201a70a80, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4768 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc201928c30, 0xc201b684b0, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4759 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc20190fc40, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4766 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201d74f50, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4864 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc200578b10, 0xc200268460, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4796 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc201bdd3f0, 0xc201a464b0, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4794 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201c49b60, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4862 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc200e7f150, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4920 [IO wait]: net.runtime_pollWait(0x7f305c22f000, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc20125d860, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read[Push][Info] 2013/07/25 11:44:17 RequestId=ca04e629-aa9e-44b6-62e0-18aacd554e86 From=54.215.171.37:13298 Service=7883932819531353 Subscribers="[518a9dc63dc9e1468444bbdb]" [Push][Info] 2013/07/25 11:44:17 RequestId=4123f2da-7663-4454-5450-89129c595896 From=54.215.167.223:46202 Service=7883932819531353 Subscribers="[5180a8293dc9e107b1533f2a]" [Push][Info] 2013/07/25 11:44:17 RequestId=34b80aba-1fe5-47e6-4d08-10ace9e192a8 From=54.215.171.37:13300 Service=7883932819531353 Subscribers="[518deb683dc9e12c476d41f6]" (0xc20125d7e0, 0xc201062000, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc2000002f8, 0xc201062000, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc2003e5c90, 0xc2000fd690, 0xc2000002f8, 0x5, 0xc2000002f8, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201061000, 0x17, 0x0, 0x413ae5) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201061000, 0xc201a35000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc201d5c9c0) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc201d5c9c0, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc2005d1d00) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 5103 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc201cc73c0, 0xc2017cca50, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4921 [select]: net/http.(_persistConn).writeLoop(0xc2005d1d00) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 4909 [IO wait]: net.runtime_pollWait(0x7f305c22f140, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc20125d6b0, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read(0xc20125d630, 0xc2015c9000, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc20031ae58, 0xc2015c9000, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc201696ba0, 0xc2000fd690, 0xc20031ae58, 0x5, 0xc20031ae58, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201d0ec80, 0x17, 0x0, 0x41efd0) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201d0ec80, 0xc201e4e000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc20195b540) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc20195b540, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc2005d1c80) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 4910 [select]: net/http.(_persistConn).writeLoop(0xc2005d1c80) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 4959 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc2017098c0, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5293 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc203e792d0, 0xc203e74370, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 5096 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc201cc71e0, 0xc2017cc960, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4881 [IO wait]: net.runtime_pollWait(0x7f305c22fbe0, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc201d84860, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read(0xc201d847e0, 0xc2018c7400, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc200399aa0, 0xc2018c7400, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc2013b1120, 0xc2000fd690, 0xc200399aa0, 0x5, 0xc200399aa0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201d0e000, 0x17, 0x0, 0x41efd0) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201d0e000, 0xc2018e7000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc2008bf360) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc2008bf360, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc201e4db00) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 4882 [select]: net/http.(_persistConn).writeLoop(0xc201e4db00) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 4884 [select]: net/http.(_persistConn).writeLoop(0xc201e4dc00) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 5039 [select]: net/http.(_persistConn).writeLoop(0xc201cd2d80) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 4972 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc201656390, 0xc2012c5050, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4970 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc20155c310, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4946 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc20191d0c0, 0xc201bb0b90, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4944 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201a348c0, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5249 [select]: net/http.(_persistConn).writeLoop(0xc203816580) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 5277 [chan receive]: main.(_PushBackEnd).collectResult(0xc2000fa440, 0xc203e00780, 0x24, 0xc203e1f097, 0x10, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:161 +0x51 main.func·003() /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:259 +0x79 created by main.(_PushBackEnd).pushImpl /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:261 +0xbc6

    goroutine 5162 [semacquire]: sync.runtime_Semacquire(0xc2000fd314) /home/monnand/soft/golang/go/src/pkg/runtime/zsema_linux_amd64.c:165 +0x2e sync.(_Mutex).Lock(0xc2000fd310) /home/monnand/soft/golang/go/src/pkg/sync/mutex.go:66 +0xbb sync.(_RWMutex).Lock(0xc2000fd310) /home/monnand/soft/golang/go/src/pkg/sync/rwmutex.go:78 +0x25 github.com/uniqush/uniqush-push/db.(_pushDatabaseOpts).RemoveDeliveryPointFromService(0xc2000fd300, 0xc202937c40, 0x10, 0xc2029374e0, 0x18, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/db/pushdb.go:197 +0x102 main.(_PushBackEnd).Unsubscribe(0xc2000fa440, 0xc202937c40, 0x10, 0xc2029374e0, 0x18, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:77 +0x65 main.(_PushBackEnd).fixError(0xc2000fa440, 0xc20290ad50, 0x24, 0xc2003960c0, 0xc20352a6f0, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:148 +0x101d main.(_PushBackEnd).collectResult(0xc2000fa440, 0xc20290ad50, 0x24, 0xc20291d147, 0x10, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:174 +0x560 main.func·003() /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:259 +0x79 created by main.(*PushBackEnd).pushImpl /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:261 +0xbc6

    goroutine 5072 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201d36a80, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4983 [IO wait]: net.runtime_pollWait(0x7f305c280c80, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc2017c0110, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read(0xc2017c0090, 0xc201a33400, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc200229c30, 0xc201a33400, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc201bb1d50, 0xc2000fd690, 0xc200229c30, 0x5, 0xc200229c30, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201061280, 0x17, 0x0, 0x413ae5) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201061280, 0xc201d9f000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc201a08420) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc201a08420, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc20041f300) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 4984 [select]: net/http.(_persistConn).writeLoop(0xc20041f300) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 5015 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc2013de620, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5031 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc20083a180, 0xc2002121e0, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 5085 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc201bd0360, 0xc201d325f0, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 5083 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201bd1310, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5025 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc20059bf50, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5030 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc20083a0c0, 0xc200212190, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 5027 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc2006cb000, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5101 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201ccd460, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5094 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201ccd000, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5108 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201ccd930, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

  • Failed: BadDeliveryPoint

    Failed: BadDeliveryPoint

    Hello,

    I'm using uniqush-push and after sometimes when I send a push message I got the following error:

    [Push][Info] 2014/03/25 00:49:58 
    RequestId=5330d2b6-kMqh8mR2TH6-ey5wgumQ6w== From=127.0.0.1:50509 Service=meetapp 
    Subscribers=\"[100002076768728]\"\n[Push][Error] 2014/03/25 00:49:58 RequestID=5330d2b6-kMqh8mR2TH6-ey5wgumQ6w== Service=meetapp Subscriber=100002076768728 PushServiceProvider=apns:531023ac704aca3571969e739a1faa35dc59a0ff 
    DeliveryPoint=apns:e63490774c4147962068b4338b95263c6281e77a Failed: BadDeliveryPoint apns:e63490774c4147962068b4338b95263c6281e77a: encoding/hex: invalid byte: U+0028 '('\n[Push][Info] 2014/03/25 00:49:58 RequestID=5330d2b6-kMqh8mR2TH6-ey5wgumQ6w== Service=meetapp Subscriber=100002076768728 PushServiceProvider=apns:531023ac704aca3571969e739a1faa35dc59a0ff DeliveryPoint=apns:1cc8ea4cec388ba5df6c8ddd0b9f42c40a853666 MsgId=apns:apns:531023ac704aca3571969e739a1faa35dc59a0ff-126 Success!
    

    The error occur only sometimes, but when it happen, all the nexts push aren't delivery with the same error. After a while the pushs notifications start working again (the previous messages aren't delivered).

    Just for the record, my messages does not have parentheses '(' (U+0028). And I'm able to send messages with parentheses.

  • Failed lookup on gcm on autoscale

    Failed lookup on gcm on autoscale

    Hi @monnand

    We have problems when we try to autoscale the uniqush servers: Here's the error:

    [Push][Error] 2014/02/14 12:29:22 RequestID=52fd9ba2-oP7j5BcX4kTn4Ls1-YAgQw== Service=0839899613932562 Subscriber=52db1f733dc9e12b8c5e271a PushServiceProvider=gcm:321c686a5eb5a03ef5d447d19182de600a69e65d DeliveryPoint=gcm:27f83d2a6ae6dec20e57e99aad2968fac6a37f3b Failed: Post https://android.googleapis.com/gcm/send: dial tcp: lookup android.googleapis.com: no such host

    These errors only happen on new instances spawned by the Amazon AutoScale. The only remedy was to restart uniqush manually. We also tested it launching the instance with uniqush manually it seems to be having the same problem.

    Errors on GCM only.

  • Unable to Download Uniqush tar File

    Unable to Download Uniqush tar File

    Hi,

    im trying to download the tar file for Uniqush from the following page yet i keep getting bad request page (502)

    error uni

    is there any alternative link? or is there fixing for this issue soon?

    Thanks

  • Migration problem with version 2.x

    Migration problem with version 2.x

    Thank you for maintaining uniqush!

    The full APNS payload is important to me, so I upgraded uniqush from version 1.5.2 to 2.1.0. And I also did the migration command URL: /rebuildserviceset.

    For APNS it worked fine, but GCM pushes were not delivered anymore. The log is: [Push][Info] 2016/05/03 15:51:44 RequestId=5728acf0-HsY2tFkTaKrdpKovS92c1Q== From=127.0.0.1:45544 Service=ajoy NrSubscribers=1 Subscribers="[myAndroidNumber]" [Push][Error] 2016/05/03 15:51:44 RequestID=5728acf0-HsY2tFkTaKrdpKovS92c1Q== Service=ajoy Subscriber= PushServiceProvider=gcm:myPspNumber DeliveryPoint=Unknown Failed: BadPushServiceProvider gcm:myPSPNumber

    Then I checked the psps and I saw only the APNS entry. {"services":{"aJoy":[{"addr":"gateway.push.apple.com:2195","cert":"/mylocalserverpath/myCert.pem","key":"/mylocalserverpath/myKey.pem","service":"aJoy"},{"addr":"gateway.push.apple.com:2195","cert":"/etc/uniqush/sandbox/myCert.pem","key":"/etc/uniqush/sandbox/myKey.pem","service":"aJoy"}],"ajoy":[{"addr":"gateway.push.apple.com:2195","cert":"/etc/uniqush/production/myCert.pem","key":"/etc/uniqush/production/myKey.pem","service":"ajoy"},{"apikey":"myAPIKey","projectid":"myProjectID","service":"ajoy"},{"addr":"gateway.sandbox.push.apple.com:2195","cert":"/etc/uniqush/sandbox/myCert.pem","key":"/etc/uniqush/sandbox/myKey.pem","service":"ajoy"}]},"code":"UNIQUSH_SUCCESS"}

    I tried to add the GCM psp again. curl http://localhost:9898/addpsp -d service=ajoy -d pushservicetype=gcm -d projectid=myProjectID -d apikey=myAPIKey {"type":"AddPushServiceProvider","date":1462296389,"status":0,"details":{"service":"ajoy","from":"127.0.0.1:48268","pushServiceProvider":"gcm:pushServiceProviderNumber","code":"UNIQUSH_SUCCESS"}} But when I checked the psps again, the GCM entry was still missing and GCM push still did not work.

    The migration did also fail with version 2.0.0. Finally I reverted uniqush back to version 1.5.2 and it worked again.

  • Remove expired registrations on send

    Remove expired registrations on send

    From time to time, we have invalid device registrations, especially if the app was uninstalled. If an app is no longer registered in the target device and a message is pushed to the device, the GCM returns a NotRegistered error message. It would be convenient if the server could remove those outdated registrations from its database.

  • apns bulk sent problem

    apns bulk sent problem

    I am getting the following error messages after trying to send ~ 12K messages at once using the -d subscribers=* switch, at first sight i thought it is getting failed 20 secs after receiving the push request, any suggestions?

    [Push][Info] 2014/12/05 17:22:36 RequestId=5481cdbc-lVovkUXZnkdyEESlJtweSw== From=127.0.0.1:57883 Service=ios NrSubscribers=1 Subscribers="[*]" [Push][Error] 2014/12/05 17:22:56 RequestID=5481cdbc-lVovkUXZnkdyEESlJtweSw== Service=ios Subscriber= PushServiceProvider=apns:50a00baec3fb2191f08de251c42f46c8c1ff3542 DeliveryPoint=Unknown Failed: error on connection with 17.172.233.37:2195: write tcp 17.172.233.37:2195: broken pipe. Will retry within 20s [Push][Info] 2014/12/05 17:22:56 Connection closed by APNS: EOF [Push][Info] 2014/12/05 17:22:56 Connection closed by APNS: EOF [Push][Info] 2014/12/05 17:22:57 Connection closed by APNS: EOF [Push][Info] 2014/12/05 17:22:57 Connection closed by APNS: EOF [Push][Error] 2014/12/05 17:22:57 RequestID=5481cdbc-lVovkUXZnkdyEESlJtweSw== Service=ios Subscriber= PushServiceProvider=apns:50a00baec3fb2191f08de251c42f46c8c1ff3542 DeliveryPoint=Unknown Failed: error on connection with 17.172.234.16:2195: use of closed network connection. Will retry within 20s [Push][Error] 2014/12/05 17:22:57 RequestID=5481cdbc-lVovkUXZnkdyEESlJtweSw== Service=ios Subscriber= PushServiceProvider=apns:50a00baec3fb2191f08de251c42f46c8c1ff3542 DeliveryPoint=Unknown Failed: error on connection with 17.172.232.40:2195: use of closed network connection. Will retry within 20s [Push][Error] 2014/12/05 17:22:57 RequestID=5481cdbc-lVovkUXZnkdyEESlJtweSw== Service=ios Subscriber= PushServiceProvider=apns:50a00baec3fb2191f08de251c42f46c8c1ff3542 DeliveryPoint=Unknown Failed: error on connection with 17.172.233.39:2195: use of closed network connection. Will retry within 20s

  • Delivery Success but not receiving on device.

    Delivery Success but not receiving on device.

    I subscribe correctly and the message gets delivered correctly in iOS, but not on android.

    Any help?

    [Push][Info] 2018/08/24 20:58:44 RequestID=5b807184-OMVeEChySKhLWxZZEg1UCA== Service=promogo Subscriber=lube PushServiceProvider=fcm:ee074643b5ae0c11ee93147348a181e40edaec81 DeliveryPoint=fcm:4c7dbcde37312b03c0fad825a2509642e9150cb7 MsgID=fcm:ee074643b5ae0c11ee93147348a181e40edaec81:0:1535144324485530%fd0791fdf9fd7ecd Success!

  • Title in push notification

    Title in push notification

    The following describes how to push a message to a subscriber.

    Parameter | Description -- | -- service | Service Name. subscriber | Subscriber ID. Could be more than one subscriber. Comma separated. Asterisk (*) could be used as a wildcard to match any string msg | Optional. Message Body ttl | Optional. Time to live. How long (in seconds) the message should be kept on push service provider’s server if the device is offline badge | Optional. Badge img | Optional. Image sound | Optional. Sound loc-key | Optional. loc-key for APNS loc-args | Optional. loc-args for APNS. It is a comma-separated string. action-loc-key | Option. action-loc-key for APNS. Reserved Parameter | Any parameter whose name starts with “uniqush.” is reserved by Uniqush. Users should avoid using those parameter names. User Defined Parameter | Optional. Any other parameter is accepted which will be sent to mobile devices

    Can we add a title? I know that push notification payload can also have a title, but it isn't listed here. am I missing something?

  • Support UnifiedPush on Android devices

    Support UnifiedPush on Android devices

    Description

    UnifiedPush allows to receive Push Notifications on Android devices that do not have Google Play Services installed. In a free and open world there needs to be a way to free you and your customers from Google, if they choose to. Firebase integration is a no-go on the F-Droid store. Many FOSS apps, like Telegram, fall back to Foreground Service Workers and/or polling with the result of massive battery drain and a permanent annoying foreground notification.

    UnifiedPush simply offers the user the option to install alternative push distributors such as ntfy or even NextPush. The benefit of this approach is that more than one application can leverage the UnifiedPush interface, but only one push receiver has to be installed and run in the foreground (i.e. ntfy or NextPush as mentioned above).

    UnifiedPush also offers an Embedded FCM Distributor that you can automatically fallback to, if no other push distributors can be found.

    Approach

    The idea is to either run all Android oriented operations of Uniqush through UnifiedPush with a proper Embedded FCM Distributor or to try to run through UnifiedPush and fall back to the own FCM integration that Uniqush offers.

  • Switch to api.sandbox.push.apple.com

    Switch to api.sandbox.push.apple.com

    srv/apns/http_api/processor.go has http2UrlHost = "https://api.development.push.apple.com"

    https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns/

  • Make FCM/APNS timeouts configurable?

    Make FCM/APNS timeouts configurable?

    Timeouts may depend on available bandwidth and burstiness of requests, but if a client expects a response from uniqush within 5 seconds then it may be useful to reduce it below the default of 20 seconds.

    Enforce a minimum of 1 second

    This may be useful to speed up detection and recovery from networking errors

    srv/apns/http_api/processor.go
    76:             // Note: Do not set IdleTimeout, it may be a cause of errors in setups where pushes are infrequent.
    79:             TLSHandshakeTimeout:   10 * time.Second,
    80:             ExpectContinueTimeout: 1 * time.Second,
    98:             Timeout:   20 * time.Second,
    
  • Document how to support new root CAs for APNs servers with uniqush

    Document how to support new root CAs for APNs servers with uniqush

    From https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server

    Establish a Trusted Connection to APNs Communication between your provider server and APNs must take place over a secure connection. Creating that connection requires installing the GeoTrust Global CA root certificate (until March 29, 2021) and the AAA Certificate Services root certificate (starting March 29, 2021) on each of your provider servers.

    If your provider server runs macOS, the GeoTrust Global CA root certificate is in the keychain by default. If your provider server runs macOS 10.14 or later, the AAA Certificate Services root certificate is in the keychain by default. On other systems, you might need to install this certificate yourself. You can download the GeoTrust Global CA root certificate from the GeoTrust Root Certificates website. You can download the “AAACertificateServices 5/12/2020” certificate from the Sectigo KnowledgeBase website.

    (developer.apple.com has the official download links)

    https://stackoverflow.com/questions/40051213/where-is-golang-picking-up-root-cas-from

    For example, on linux

    // Copyright 2015 The Go Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style
    // license that can be found in the LICENSE file.
    
    package x509
    
    // Possible certificate files; stop after finding one.
    var certFiles = []string{
        "/etc/ssl/certs/ca-certificates.crt",                // Debian/Ubuntu/Gentoo etc.
        "/etc/pki/tls/certs/ca-bundle.crt",                  // Fedora/RHEL 6
        "/etc/ssl/ca-bundle.pem",                            // OpenSUSE
        "/etc/pki/tls/cacert.pem",                           // OpenELEC
        "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", // CentOS/RHEL 7
        "/etc/ssl/cert.pem",                                 // Alpine Linux
    }
    

    In cases where it is not possible to update the certificate store, look into whether it'd be viable to include those certificate stores manually, e.g. as a CLI flag to add to the OS's certificate store

  • What about an open server-side events/REST protocol for apps on any platform?

    What about an open server-side events/REST protocol for apps on any platform?

    I couldn't help but notice that all the protocols implemented so far seem to be proprietary ones for use with closed SDKs only (like the Android one, while the system is open the SDK is not). Even the Web Push API I saw suggested seems quite intertwined with the idea of signed Java apps and use through node.js libraries, rather than e.g. a more generally usable C lib for regular apps on maybe even laptops or desktops.

    Are there any plans to support an open protocol maybe alike to Ubuntu Push, with more universal desktop or mobile native client tooling that works with stuff like OpenSSL and winapi and posix sockets? Such a C API could also be used from Java, for example, with a thin wrapper. Laptops in particular appear to be left out of push usage and many other battery optimizations for some reason, as well as the new growing niche of Linux phones, and as an app developer using a proper cross-platform language it seems a bit silly too to reinvent the wheel on every single quirky mobile platform with a new API. Why not use the same push client lib on all of them and on laptops and desktops too? The lock-in to platform specific protocols for the apps seems easy at first, but mostly littered with downsides and odd exclusions further down the road. It's not like a laptop benefits by wasting more energy on notifications compared to a phone.

    I don't know, just makes me wonder that all the "open" push solutions seem to be rushing to stay in those weird EULA SDKs instead of actually making a proper universal app client spec. It's just a bit weird to me

The Xiaomi message push service is a system-level channel on MIUI and is universal across the platform, which can provide developers with stable, reliable, and efficient push services.

Go-Push-API MiPush、JiPush、UMeng MiPush The Xiaomi message push service is a system-level channel on MIUI and is universal across the platform, which c

Oct 20, 2022
💨 A real time messaging system to build a scalable in-app notifications, multiplayer games, chat apps in web and mobile apps.
💨 A real time messaging system to build a scalable in-app notifications, multiplayer games, chat apps in web and mobile apps.

Beaver A Real Time Messaging Server. Beaver is a real-time messaging server. With beaver you can easily build scalable in-app notifications, realtime

Jan 1, 2023
May 11, 2023
Simple push notification system (android/fcm, apns/slideshow) written by Golang

Golang Push Notification Simple system push notification for android/fcm and apn

Dec 20, 2021
Go-notification - Realtime notification system with golang

Realtime notification system Used Apache kafka gRPC & PROTOBUF MongoDB restapi w

Aug 19, 2022
A push notification server written in Go (Golang).
A push notification server written in Go (Golang).

gorush A push notification micro server using Gin framework written in Go (Golang) and see the demo app. Contents gorush Contents Support Platform Fea

Jan 8, 2023
The Bhojpur MDM is a software-as-a-service product used as a Mobile Device Manager based on Bhojpur.NET Platform for application delivery.

Bhojpur MDM - Mobile Device Manager The Bhojpur MDM is a software-as-a-service product used as a Mobile Device Manager based on Bhojpur.NET Platform f

Dec 31, 2021
Bark is an iOS App which allows you to push customed notifications to your iPhone.
Bark is an iOS App which allows you to push customed notifications to your iPhone.

Bark is an iOS App which allows you to push customed notifications to your iPhone.

Jan 3, 2023
a unified representation of buffered, unbuffered, and unbounded channels in Go

chann a unified representation of buffered, unbuffered, and unbounded channels in Go import "golang.design/x/chann" This package requires Go 1.18. Us

Oct 31, 2022
ntfy is a super simple pub-sub notification service. It allows you to send desktop notifications via scripts.

ntfy ntfy (pronounce: notify) is a super simple pub-sub notification service. It allows you to send desktop and (soon) phone notifications via scripts

Jan 9, 2023
Golang push server cluster
Golang push server cluster

gopush-cluster gopush-cluster is a go push server cluster. Features light weight high performance pure golang implementation message expired offline m

Dec 28, 2022
Converter EPG XMLTV to OTT-play (by Alex) server side JSON

EPG converter for OTT-play FOSS Описание Инструмент создания телепрограммы для OTT-Play FOSS, использует 1 поток, и буферное чтение из файла, что позв

Jan 6, 2023
Chanify is a safe and simple notification tools. This repository is command line tools for Chanify.

Chanify is a safe and simple notification tools. For developers, system administrators, and everyone can push notifications with API.

Dec 29, 2022
cisasntyi: check iphone stock and send notification to your iphone

for buy iphone 13 notification cisasntyi: check iphone stock and send notification to your iphone install Bark app in your iphone first before you run

Aug 3, 2022
Namecoin calendar notification daemon (ICS, CalDAV)

nccald nccald is a simple daemon to provide calendar notifications for Namecoin name expirations. The daemon periodically queries a Namecoin Core inst

Dec 11, 2021
Arjuns-urgent-notification-backend - A simple Golang app that handles form JSON POST requests

Arjun's Urgent Notification Backend This is intended to let people urgently noti

Jan 7, 2022
An little library to create notification files with golang.

notifile With this no library you can easily create notification files for your Go projects. These must then be stored in the directory you specify so

Oct 5, 2022
Open source Observability Platform. 👉 SigNoz helps developers find issues in their deployed applications & solve them quickly
Open source Observability Platform. 👉 SigNoz helps developers find issues in their deployed applications & solve them quickly

SigNoz SigNoz is an opensource observability platform. SigNoz uses distributed tracing to gain visibility into your systems and powers data using Kafk

Jan 4, 2023
yt-dl but for free sms services

recvsms - use free sms services through cli You can think of recvsms as yt-dl for free sms services. It will support many SMS "backends" eventually. I

Dec 29, 2021