How to add device for push notification service GetStreamApi - flutter

I am using the getstream api and I would like to enable push notification services on both android and ios devices. The documentation just shows various excerpts on various parts of the process and I don't understand why. This is a nuanced topic and detailed step by step process should be the standard.
But essentially, I am not sure how to add a device to a client.
I have tried the below (which i'm not sure is the right way to go about it, but the documentation is not clear) but I get an unauthorized token error:
_invokeGetStreamApiFcmToken() async {
final client = StreamChatCore.of(context).client;
//listen for fcm token refresh
FirebaseMessaging.instance.onTokenRefresh.listen((token) {
client.addDevice(token, PushProvider.firebase);
print("get stream api token refreshed -- $token");
});
print(await FirebaseMessaging.instance.getToken());
print(await FirebaseMessaging.instance.getAPNSToken());
// register the device with APN (Apple only)
await client.addDevice(uid, PushProvider.apn);
// register the device with Firebase (Android only)
await client.addDevice(uid, PushProvider.firebase);
print(await client.getDevices());
}
In the client.addDevice() method, I am not sure at all what the first parameter, "device id" is meant to be. How do i get this device ID?

Related

How to get a Cloud Functions Callback URL to use during an API callback after it completes a money transaction, Flutter App

I need a callback URL so that when a mobile money API completes a payment transaction, my app can receive a message about the transaction status. I'm building a flutter app. I have seen that cloud functions may be the answer. So, I need help on how to get started on creating this callback URL.
I'm yet to try anything because all the material I have seen talks about JavaScript and websites. I need material on doing this in the flutter mobile app.
look at this snippet I hope it helps
// await for your first function t
await moneyFuntion()
.whenComplete(() async => await anotherAPIFuntion())
.onError((error, stackTrace) {
log("$error");

flutter_callkit_incoming notification isn't received in terminated or background state in iOS using Flutter

Flutter Incoming Callkit notifications are working fine on my iOS app in all states (foreground/background/terminated).
On iOS device, issue is when my app is in background or terminated state and if I open any other app after closing or minimizing my application , I stop getting callKit notification in both background/terminated state.
I don't know that which part can cause this issue i.e if its from my code or its the problem in iOS device itself. Because besides opening another app after closing/minimizing my app, I am getting call notifications in all states of my app.
[Note: Everything is working fine in the Android app]
This is the silent notification being received to the receiver from cloud function.
await admin.messaging().send({
token: token_o,
notification: {
},
data: {
imageUrl: requesterImageUrl,
chatRoomId: chatRoomId,
screenName: 'voiceScreen',
voiceCall: 'voiceCall',
callerName: requesterName,
callsDocId: callsDocId,
senderId: requesterId,
},
android: {
notification: {
click_action: "android.intent.action.MAIN"
},
},
apns: {
headers: {
apns_priority: "10",
},
payload: {
aps: {
badge: 1
},
notification: {
title: "iOVoiceCallNotification",
body: {},
},
mutable_content: true,
content_available : true,
}
}
}).then(value => {
functions.logger.log("Notification for AudioCall is sent to the Receiver");
}).catch((e) => {
functions.logger.log(e.toString());
});
I can provide anyother code or log if required.
I simply had to configure pushKit to awake iOS from background & terminated state.
Note: Even for pushKit, I had to create a token for iOS device from the getVoipToken() function that is present in flutter_call_kit incoming package.
Inorder to recieve callKit notifications perfectly in background/terminated states in IOS you have to do following necessary things:
Implement APNs (Apple push notifications) for IOS. Because IOS devices will not wake the phone and show call when you send firebase notifications in background/terminated states. IOS devices require APNs to achieve this.
Follow the instructions written in PUSHKIT.md if you are using flutter_callkit_incoming package for flutter app.
Configure your backend (from where you want to recieve notifications) to send both firebase and APN notifications depends upon the device user is using. (I recommend you to send the platform e.g "android" or "ios" along with the device token to your backend when you register the firebase token in flutter app. You can also ask for IOS deviceToken from firebase.
I know its very lengthy process but it is. I was also very disappointed when I was required to integrate call notifications in my app and I have to do all this on my frontend app and backend.

Flutter firebase messaging v9.0.0 - Not firing events

I have an app that was using firebase messaging 7.0.3 and all worked perfectly. But when I migrated to firebase messaging 9.0.0, the push notifications are not being handled.
I know that the app is correctly linked to firebase and cloud messaging because in background I see the push notification comming, the problem is when I click that notification the app don't handle this event. Also, when the app is in foreground, the event of receiving the notification is not being triggered.
Specifically, the functions FirebaseMessaging.onMessage and FirebaseMessaging.onMessageOpenedApp are not working. My code is:
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print("notification: message");
});
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print("notification: resume");
});
The prints are never called, and if I put some more code inside isn't executed too.
I also call FirebaseMessaging.getToken and I can get the token, plus when the app is in background I get the push notification, so is not a link problem with firebase. In the logs, when I receive the push I can see a message saying: Broadcast received for message. So I assumed that the push is arriving in all the occasions, and I am doing something wrong in the code.
I tested all cases in Android and iOS physical devices.
Someone know why this occurs?
I came across this exact same issue after migrating and upgrading to 9.0.0.
There is a minor issue with 9.0.0 plugin.
The fix can be found here:
https://github.com/FirebaseExtended/flutterfire/issues/4949
To cut a long story short, if you navigate to the definition of the factory
RemoteMessage.fromMap() Using Cmd+Click or Ctrl+Click while hovering over the RemoteMessage class with the mouse), in the return statement, change contentAvailable: map['contentAvailable'], to contentAvailable: map['contentAvailable']??false.
Notifications are now working for me again now.
This should work for you until the plugin is fixed.

Why is onTokenRefresh not firing?

I'm new to firebase messaging and flutter. According to the flutter firebase_messaging package docs, onTokenRefresh is fired when a new FCM token is generated. And according to Google's firebase docs there are two scenarios that triggers token generation:
When a new token is generated on initial app startup
Whenever an existing token is changed
Here is a simplified version of the main function of my application. After each execution, I delete the app from the emulator and the displayed token does indeed change. Despite this, onTokenRefresh is never fired and it should if my understanding of the documentation is correct.
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseMessaging.instance.onTokenRefresh.listen((String token) {
print("New token: $token");
});
String token = await FirebaseMessaging.instance.getToken();
print("Token: $token");
//runApp(MyApp());
}
As I said, I'm new to flutter, dart and firebase messaging, is there something I'm fundamentally misunderstanding? Thanks.
So I think I figured it out. I noticed that sometimes, the onTokenRefresh does indeed fire. And I was wondering if it had something to do with how the flutter application is launched onto the emulator, in the sense that there is a race condition between when the token is generated and the listener attached.
To get the app to appear to start for the first time, I wiped the app data. Unfortunately this causes the flutter to automatically disconnect from the app which means I won't see the output of the print statement. So instead of trying to print when the token generation occurs, I assigned a value from the onTokenRefresh listener to a variable. I then updated a text widget with the value of the variable. And onTokenRefresh does indeed fire each time at start up if the app data has previously been wiped.

Identify users / generate token for Ionic.io Push

I have an inherited Ionic framework app that is using Ionic.io
The app authorises against our API, and is given an API token to use in future requests.
I'm trying to work on push notifications - I've set up ionic push, and can trigger push notifications out to all users with no problems.
I'd like the ability to target specific users / devices to send notifications, and I understand that to do this, I have to register the device to generate a token.
Within my $ionicPlatform.ready function, I have:
$ionicPush.register().then(function(t) {
return $ionicPush.saveToken(t);
}).then(function(t) {
console.log('Token saved:', t.token);
});
This however does not seem to be returning a token, and calling
console.log($ionicPush);
Shows that the token is not set.
Any ideas here? What am I missing?
So after digging though some documentation, I found that the issue was linked with the ionic user.
In the main run function, I fire off a
if ($ionicAuth.isAuthenticated()) {
If this fails, I try a login of a user, and a register of the user if appropriate. (user is already logged in using a custom auth token against our api)
Before I attempt to register the token, I then have to reload the user in order to have the app save off and push back up to ionic.io.
$ionicUser.load().then(function() {
$ionicPush.register().then(function(t) {
console.log('Token sent:', t.token);
return $ionicPush.saveToken(t);
}).then(function(t) {
console.log('Token saved:', t.token);
});
});