It’s a swift lib that gives ability to send push notifications through Firebase Cloud Messaging.
Built for Vapor4 and depends on JWT Vapor lib.
💡Vapor3 version is available in vapor3 branch and from 1.0.0 tag
If you have great ideas of how to improve this package write me (@iMike#3049) in Vapor’s discord chat or just send pull request.
Hope it’ll be useful for someone :)
Install through Swift Package Manager ❤️
Edit your Package.swift
//add this repo to dependencies
.package(url: "https://github.com/MihaelIsaev/FCM.git", from: "2.7.0")
//and don't forget about targets
.product(name: "FCM", package: "FCM")
How it works ?
First of all you should configure FCM in configure.swift
import FCM
// Called before your application initializes.
func configure(_ app: Application) throws {
/// case 1
/// with service account json file
/// put into your environment variables the following key:
/// FCM_SERVICE_ACCOUNT_KEY_PATH=path/to/serviceAccountKey.json
app.fcm.configuration = .envServiceAccountKey
/// case 2
/// with service account json string
/// put into your environment variable the following key:
/// FCM_SERVICE_ACCOUNT_KEY="{"prohect_id": "my_project123",...}"
app.fcm.configuration = .envServiceAccountKey
/// case 3
/// put into your environment variables the following keys:
/// FCM_EMAIL=... // `client_email` in service.json
/// FCM_PROJECT_ID=... // `project_id` in service.json
/// FCM_PRIVATE_KEY=... // `private_key` in service.json
app.fcm.configuration = .envServiceAccountKeyFields
/// case 4
/// put into your environment variables the following keys:
/// FCM_EMAIL=...
/// FCM_PROJECT_ID=...
/// FCM_KEY_PATH=path/to/key.pem
app.fcm.configuration = .envCredentials
/// case 5
/// manually
app.fcm.configuration = .init(email: "...", projectId: "...", key: "...")
}
⚠️ TIP:serviceAccountKey.json you could get from Firebase Console
🔑 Just go to Settings -> Service Accounts tab and press Create Private Key button in e.g. NodeJS tab
OPTIONAL: Set default configurations, e.g. to enable notification sound
Add the following code to your configure.swift after app.fcm.configuration = ...
Then you could send push notifications using token, topic or condition.
Here’s an example route handler with push notification sending using token
import FCM
func routes(_ app: Application) throws {
app.get("testfcm") { req -> EventLoopFuture<String> in
let token = "<YOUR FIREBASE DEVICE TOKEN>" // get it from iOS/Android SDK
let notification = FCMNotification(title: "Vapor is awesome!", body: "Swift one love! ❤️")
let message = FCMMessage(token: token, notification: notification)
return req.fcm.send(message, on: req.eventLoop).map { name in
return "Just sent: \(name)"
}
}
}
fcm.send returns message name like projects/example-3ab5c/messages/1531222329648135
Go to Firebase Console -> Project Settings -> Cloud Messaging tab
Copy Server Key from Project Credentials area
Put server key into environment variables as FCM_SERVER_KEY=<YOUR_SERVER_KEY> (or put it into serviceAccountKey.json file as server_key)
Sending
// get it from iOS/Android SDK
let token1 = "<YOUR FIREBASE DEVICE TOKEN>"
let token2 = "<YOUR FIREBASE DEVICE TOKEN>"
let token3 = "<YOUR FIREBASE DEVICE TOKEN>"
...
let token100500 = "<YOUR FIREBASE DEVICE TOKEN>"
let notification = FCMNotification(title: "Life is great! 😃", body: "Swift one love! ❤️")
let message = FCMMessage(notification: notification)
application.fcm.batchSend(message, tokens: [token1, token2, token3, ..., token100500]).map {
print("sent!")
}
APNS to Firebase token conversion
You can throw away Firebase libs from dependencies of your iOS apps because you can send pure APNS tokens to your server and it will register it in Firebase by itself.
It is must have for developers who don’t want to add Firebase libs into their apps, and especially for iOS projects who use Swift Package Manager cause Firebase doesn’t have SPM support for its libs yet.
How to use
Preparation
Go to Firebase Console -> Project Settings -> Cloud Messaging tab
Copy Server Key from Project Credentials area
Next steps are optional
Put server key into environment variables as FCM_SERVER_KEY=<YOUR_SERVER_KEY> (or put it into serviceAccountKey.json file as server_key)
Put your app bundle identifier into environment variables as FCM_APP_BUNDLE_ID=<APP_BUNDLE_ID>
Tokens registration
/// The simplest way
/// .env here means that FCM_SERVER_KEY and FCM_APP_BUNDLE_ID will be used
application.fcm.registerAPNS(.env, tokens: "token1", "token3", ..., "token100").flatMap { tokens in
/// `tokens` is array of `APNSToFirebaseToken` structs
/// which contains:
/// registration_token - Firebase token
/// apns_token - APNS token
/// isRegistered - boolean value which indicates if registration was successful
}
/// instead of .env you could declare your own identifier
extension RegisterAPNSID {
static var myApp: RegisterAPNSID { .init(appBundleId: "com.myapp") }
}
/// Advanced way
application.fcm.registerAPNS(
appBundleId: String, // iOS app bundle identifier
serverKey: String?, // optional server key, if nil then env variable will be used
sandbox: Bool, // optional sandbox key, false by default
tokens: [String], // an array of APNS tokens
on: EventLoop? // optional event loop, if nil then application.eventLoopGroup.next() will be used
).flatMap { tokens in
/// the same as in above example
}
💡 Please note that push token taken from Xcode while debugging is for sandbox, so either use .envSandbox or don’t forget to set sandbox: true
Contributors
Special thanks to @grahamburgsma for GoogleError and FCMError #10
Intro 👏
It’s a swift lib that gives ability to send push notifications through Firebase Cloud Messaging.
Built for Vapor4 and depends on
JWT
Vapor lib.If you have great ideas of how to improve this package write me (@iMike#3049) in Vapor’s discord chat or just send pull request.
Hope it’ll be useful for someone :)
Install through Swift Package Manager ❤️
Edit your
Package.swift
How it works ?
First of all you should configure FCM in
configure.swift
OPTIONAL: Set default configurations, e.g. to enable notification sound
Add the following code to your
configure.swift
afterapp.fcm.configuration = ...
Let’s send first push notification! 🚀
Then you could send push notifications using token, topic or condition.
Here’s an example route handler with push notification sending using token
fcm.send
returns message name likeprojects/example-3ab5c/messages/1531222329648135
FCMMessage
struct is absolutely the same asMessage
struct in Firebase docs https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages So you could take a look on its source code to build proper message.Batch sending
Preparation
Server Key
fromProject Credentials
areaFCM_SERVER_KEY=<YOUR_SERVER_KEY>
(or put it intoserviceAccountKey.json
file asserver_key
)Sending
APNS to Firebase token conversion
You can throw away Firebase libs from dependencies of your iOS apps because you can send pure APNS tokens to your server and it will register it in Firebase by itself.
It is must have for developers who don’t want to add Firebase libs into their apps, and especially for iOS projects who use Swift Package Manager cause Firebase doesn’t have SPM support for its libs yet.
How to use
Preparation
Server Key
fromProject Credentials
areaNext steps are optional
FCM_SERVER_KEY=<YOUR_SERVER_KEY>
(or put it intoserviceAccountKey.json
file asserver_key
)FCM_APP_BUNDLE_ID=<APP_BUNDLE_ID>
Tokens registration
Contributors