{"id":13713741,"url":"https://github.com/sger/go-apns2","last_synced_at":"2025-04-22T13:31:43.959Z","repository":{"id":57485557,"uuid":"53595328","full_name":"sger/go-apns2","owner":"sger","description":"Go package for HTTP/2  Apple Push Notification Service.","archived":false,"fork":false,"pushed_at":"2017-06-01T15:49:53.000Z","size":54537,"stargazers_count":55,"open_issues_count":1,"forks_count":7,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-08-03T23:28:16.341Z","etag":null,"topics":["apns","apns2","apple","channels","go","golang","http2","ios","notification-service"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sger.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-03-10T15:28:22.000Z","updated_at":"2023-09-19T10:02:47.000Z","dependencies_parsed_at":"2022-09-02T00:10:19.443Z","dependency_job_id":null,"html_url":"https://github.com/sger/go-apns2","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sger%2Fgo-apns2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sger%2Fgo-apns2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sger%2Fgo-apns2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sger%2Fgo-apns2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sger","download_url":"https://codeload.github.com/sger/go-apns2/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223896938,"owners_count":17221475,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apns","apns2","apple","channels","go","golang","http2","ios","notification-service"],"created_at":"2024-08-02T23:01:43.249Z","updated_at":"2024-11-10T00:12:28.860Z","avatar_url":"https://github.com/sger.png","language":"Go","funding_links":[],"categories":["Repositories"],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.org/sger/go-apns2.svg?branch=master)](https://travis-ci.org/sger/go-apns2)\n[![GoDoc](https://godoc.org/github.com/sger/go-apns2?status.svg)](https://godoc.org/github.com/sger/go-apns2)\n[![Coverage Status](https://coveralls.io/repos/github/sger/go-apns2/badge.svg?branch=master)](https://coveralls.io/github/sger/go-apns2?branch=master)\n# Go Apns2\n\nGo package for HTTP/2 [Apple Push Notification Service](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html).\n\n## Installation\n\n Via `go-get`:\n\n```sh\n$ go get github.com/sger/go-apns2\n$ cd go-apns2/_examples\n$ cd basic\n$ go build\n$ ./basic\n```\n\n## Documentation\n\n```sh\n$ godoc .\n$ godoc -http=:6060\n```\n\n## Usage\n\n## Simple example\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\n\t\"github.com/sger/go-apns2\"\n\t\"github.com/sger/go-apns2/certificate\"\n)\n\nfunc main() {\n\tvar deviceToken = \"c7800a79efffe8ffc01b280717a936937cb69f8ca307545eb6983c60f12e167a\"\n\tvar filename = \"../certs/PushChatKey.p12\"\n\tvar password = \"pushchat\"\n\n\t// Setup payload must contains an aps root label and alert message\n\tpayload := apns2.Payload{\n\t\tAlert: apns2.Alert{\n\t\t\tBody: \"Testing HTTP 2\"},\n\t\tBadge: 5,\n\t}\n\n\t// Parse the certificate\n\tcert, err := certificate.ReadP12File(filename, password)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Setup a new http client with pass the Certificate\n\t// and host environment (apns2.Development, apns2.Production)\n\tclient, err := apns2.NewClient(cert, apns2.Development)\n\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Send the Push Notification\n\tresp, err := client.SendPush(payload, deviceToken, \u0026apns2.Headers{})\n\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Returns ApnsResponse struct\n\t/*\n\t\ttype ApnsResponse struct {\n\t\tStatusCode            int\n\t\tStatusCodeDescription string\n\t\tApnsID                string `json:\"apns-id,omitempty\"`\n\t\tReason                string `json:\"reason,omitempty\"`\n\t}*/\n\tfmt.Println(resp)\n}\n```\n\n## Goroutines and channels example\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"github.com/sger/go-apns2\"\n\t\"github.com/sger/go-apns2/certificate\"\n)\n\nvar status bool\nvar payloads []apns2.Payload\nvar payloadsProcessed int\nvar totalPayloads int\nvar apns []*apns2.ApnsResponse\n\nfunc main() {\n\tstatus = true\n\tstatusChannel := make(chan int)\n\tpayloadChannel := make(chan *apns2.ApnsResponse)\n\ttotalPayloads = 0\n\n\t// Creating 1000 payloads\n\tfor i := 0; i \u003c 1000; i++ {\n\t\tmessage := fmt.Sprintf(\"Hello World %v!\", i)\n\t\tpayload := apns2.Payload{\n\t\t\tAlert: apns2.Alert{\n\t\t\t\tBody: message},\n\t\t}\n\t\tpayloads = append(payloads, payload)\n\t}\n\n\tpayloadsProcessed = 0\n\ttotalPayloads = len(payloads)\n\n\t// goroutines\n\tgo sendPayloads(statusChannel, payloadChannel)\n\tgo processPayloadResponses(payloadChannel)\n\n\tfor {\n\t\tif status == false {\n\t\t\tfor _, id := range apns {\n\t\t\t\tfmt.Println(id)\n\t\t\t}\n\t\t\tfmt.Println(\"Done sending \", totalPayloads, \" payloads\")\n\t\t\tbreak\n\t\t}\n\t\tselect {\n\t\tcase sC := \u003c-statusChannel:\n\t\t\tfmt.Println(\"Payload received on StatusChannel\", sC)\n\t\t\tpayloadsProcessed++\n\t\t\tif payloadsProcessed == totalPayloads {\n\t\t\t\tfmt.Println(\"Received all Payloads\")\n\t\t\t\tstatus = false\n\t\t\t\tclose(statusChannel)\n\t\t\t\tclose(payloadChannel)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc sendPayloads(statusChannel chan int, payloadChannel chan *apns2.ApnsResponse) {\n\ttime.Sleep(time.Millisecond * 1)\n\tfmt.Println(\"Sending\", len(payloads), \"payloads\")\n\n\tvar deviceToken = \"c7800a79efffe8ffc01b280717a936937cb69f8ca307545eb6983c60f12e167a\"\n\tvar filename = \"../certs/PushChatKey.p12\"\n\tvar password = \"pushchat\"\n\n\tcert, err := certificate.ReadP12File(filename, password)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Setup a new http client\n\tclient, err := apns2.NewClient(cert, apns2.Development)\n\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tfor i := 0; i \u003c totalPayloads; i++ {\n\t\tfmt.Println(\"sending payload \", i, payloads[i])\n\t\tresp, err := client.SendPush(payloads[i], deviceToken, \u0026apns2.Headers{})\n\t\tif err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\t\tpayloadChannel \u003c- resp\n\t\tstatusChannel \u003c- 0\n\t}\n}\n\nfunc processPayloadResponses(payloadChannel chan *apns2.ApnsResponse) {\n\tfor {\n\t\tselect {\n\t\tcase pC := \u003c-payloadChannel:\n\t\t\tapns = append(apns, pC)\n\t\t}\n\t}\n}\n```\n\n## TODO\n- [x] Pem Support\n- [x] Tests\n- [x] Error Handling\n- [x] Support for Feedback service\n\nAuthor\n-----\n\n__Spiros Gerokostas__ \n\n- [![](https://img.shields.io/badge/twitter-sger-brightgreen.svg)](https://twitter.com/sger) \n- :email: spiros.gerokostas@gmail.com\n\nLicense\n-----\n\nGo Apns2 is available under the MIT license. See the LICENSE file for more info.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsger%2Fgo-apns2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsger%2Fgo-apns2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsger%2Fgo-apns2/lists"}