Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Answer incoming call while app in background #31

Closed
josaric opened this issue Apr 28, 2021 · 5 comments
Closed

Answer incoming call while app in background #31

josaric opened this issue Apr 28, 2021 · 5 comments

Comments

@josaric
Copy link

josaric commented Apr 28, 2021

Hi, I have managed to get an incoming call and answer it while the app is in the foreground on iOS using:

TwilioPhone.acceptCallInvite("callSid");

but when I answer to call while the app is in the background or while the app is locked and in the background, Twilio does not connect

is there any example of how to answer incoming while the app is in the background?

@MrHertal
Copy link
Owner

Hi,

this should work, did you make these changes in your AppDelegate.m?

You can check the example app if you need help.

@josaric
Copy link
Author

josaric commented Apr 28, 2021

@MrHertal tnx, I have managed to get the call using your example app, I will check what I'm doing wrong and write it here and close the issue.

@josaric
Copy link
Author

josaric commented Apr 28, 2021

@MrHertal this is my AppDelegate.m
am I missing something?

// Copyright 2015-present 650 Industries. All rights reserved.
#import "AppDelegate.h"
#import <Firebase.h>
#import <PushKit/PushKit.h>
#import "RNVoipPushNotificationManager.h"
#import "RNCallKeep.h"
#import <UserNotifications/UserNotifications.h>
#import <RNCPushNotificationIOS.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Define UNUserNotificationCenter
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    center.delegate = self;
    if ([FIRApp defaultApp] == nil) {
        [FIRApp configure];
      }
    [RNVoipPushNotificationManager voipRegistration];
    [super application:application didFinishLaunchingWithOptions:launchOptions];
    return YES;
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
  [super applicationWillEnterForeground:application];
}

#pragma mark - Background Fetch

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
  [super application:application performFetchWithCompletionHandler:completionHandler];
}

#pragma mark - Handling URLs

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
  return [super application:app openURL:url options:options];
}

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler
{
    return [RNCallKeep application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
}

/* Add PushKit delegate method */

// --- Handle updated push credentials
- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(PKPushType)type {
  // Register VoIP push token (a property of PKPushCredentials) with server
  [RNVoipPushNotificationManager didUpdatePushCredentials:credentials forType:(NSString *)type];
}

- (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(PKPushType)type
{
  // --- The system calls this method when a previously provided push token is no longer valid for use. No action is necessary on your part to reregister the push type. Instead, use this method to notify your server not to send push notifications using the matching push token.
}

// --- Handle incoming pushes (for ios >= 11)
- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void (^)(void))completion {
  // --- Retrieve information from Twilio push payload
  NSString *uuid = [[[NSUUID UUID] UUIDString] lowercaseString];
  NSString *callerName = [payload.dictionaryPayload[@"twi_from"] stringByReplacingOccurrencesOfString:@"client:" withString:@""];
  NSString *handle = [payload.dictionaryPayload[@"twi_to"] stringByReplacingOccurrencesOfString:@"client:" withString:@""];

  // --- Process the received push
  [RNVoipPushNotificationManager didReceiveIncomingPushWithPayload:payload forType:(NSString *)type];
    // --- You should make sure to report to callkit BEFORE execute `completion()`
    [RNCallKeep reportNewIncomingCall:uuid
                                 handle:handle
                             handleType:@"generic"
                               hasVideo:NO
                    localizedCallerName:callerName
                        supportsHolding:YES
                           supportsDTMF:YES
                       supportsGrouping:YES
                     supportsUngrouping:YES
                            fromPushKit:YES
                                payload:payload.dictionaryPayload
                  withCompletionHandler:nil];

  completion();
}

#pragma mark - Notifications
// REGISTER PUSH NOTIFICATIONS

// Required to register for notifications
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
 [RNCPushNotificationIOS didRegisterUserNotificationSettings:notificationSettings];
}
// Required for the register event.
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
 [RNCPushNotificationIOS didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
// Required for the notification event. You must call the completion handler after handling the remote notification.
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
  [RNCPushNotificationIOS didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
// Required for the registrationError event.
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
 [RNCPushNotificationIOS didFailToRegisterForRemoteNotificationsWithError:error];
}
// Required for localNotification event
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void (^)(void))completionHandler
{
  [RNCPushNotificationIOS didReceiveNotificationResponse:response];
  completionHandler();
}

//Called when a notification is delivered to a foreground app.
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
{
  completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge);
}


@end

@MrHertal
Copy link
Owner

MrHertal commented May 2, 2021

Sorry, I can't really help because the problem could come from a lot of places.

Since you successfully managed to run the example app, the best thing you can do is trying to implement the same code in your own app step by step.

@josaric
Copy link
Author

josaric commented May 3, 2021

I had an older version of the bare expo (37), and I have updated everything to the clean react native project and I have updated all the dependecies to the latests and incoming did receive but while I tried to answered on the locked phone, callkit started but it didn't really answer until I removed this line of code from didFinishLaunchingWithOptions

[RNVoipPushNotificationManager voipRegistration];

@josaric josaric closed this as completed May 3, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants