Pushkit with Sinch VOIP not working with pushkit

2019-03-29 19:55发布

I am trying to implement App-to-App calling with Sinch in my IOS app. I have implemented Pushkit in my iOS app with Sinch but the push notification is not working when the app is in background.

I have two questions.

  1. Do I need another web service to send push notification to my app for incoming app separately or Sinch handles it itself.

  2. If it does handle itself then what am I missing in my code.

#import "AppDelegate.h"
@interface AppDelegate ()
@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];

    [self handleLocalNotification:[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]];

    self.push = [Sinch managedPushWithAPSEnvironment:SINAPSEnvironmentAutomatic];
    self.push.delegate = self;
    [self.push setDesiredPushTypeAutomatically];

    [self.push registerUserNotificationSettings];

    return YES;
 }
 - (BOOL)application:(UIApplication *)app
        openURL:(NSURL *)url
        options:(NSDictionary *)options {
    return [[GIDSignIn sharedInstance] handleURL:url
                           sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                  annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
  }

- (BOOL)application:(UIApplication *)application
        openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
     annotation:(id)annotation {
    return [[GIDSignIn sharedInstance] handleURL:url
                           sourceApplication:sourceApplication
                                  annotation:annotation];
}

- (id<SINClient>)client {
   return _sinchClient;
}
-(void)clientDidFail:(id<SINClient>)client error:(NSError *)error{

   NSLog(@"fail");
}

-(void)clientDidStart:(id<SINClient>)client{

    NSLog(@"Start");
    [self voipRegistration];
}


- (void)client:(id<SINClient>)client
   logMessage:(NSString *)message
      area:(NSString *)area
    severity:(SINLogSeverity)severity
   timestamp:(NSDate *)timestamp {
// If you want all messages remove the if statement

    if (severity == SINLogSeverityCritical) {
        NSLog(@"%@", message);
    }
}

- (void)initSinchClientWithUserId:(NSString *)userId {
    if (!_sinchClient) {

        _sinchClient = [Sinch clientWithApplicationKey:@"<my-key>"
                                applicationSecret:@"<my-secret>"
                                  environmentHost:@"sandbox.sinch.com"
                                           userId:userId];

        _sinchClient.delegate = self;

        [_sinchClient setSupportCalling:YES];
        [_sinchClient startListeningOnActiveConnection];
        [_sinchClient enableManagedPushNotifications];
        [_sinchClient start];
    }
 }
 - (void)handleLocalNotification:(UILocalNotification *)notification {
    if (notification) {
        id<SINNotificationResult> result = [self.sinchClient      relayLocalNotification:notification];
        if ([result isCall] && [[result callResult] isTimedOut]) {
            UIAlertView *alert = [[UIAlertView alloc]
                                  initWithTitle:@"Missed call"
                                  message:[NSString stringWithFormat:@"Missed call from %@", [[result callResult] remoteUserId]]
                                  delegate:nil
                                  cancelButtonTitle:nil
                                  otherButtonTitles:@"OK", nil];
            [alert show];
        }
    }
}

-(void)voipRegistration
{
    PKPushRegistry* voipRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
    voipRegistry.delegate = self;
    voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
}

-(void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type
{
    [_sinchClient registerPushNotificationData:credentials.token];
}
-(void)pushRegistry:(PKPushRegistry *)registry   didInvalidatePushTokenForType:(PKPushType)type{

     NSLog(@"invalidated");
}
-(void)pushRegistry:(PKPushRegistry *)registry   didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:  (NSString *)type
{
    //notify
    NSDictionary* dic = payload.dictionaryPayload;
    NSString* sinchinfo = [dic objectForKey:@"sin"];
    UILocalNotification* notif = [[UILocalNotification alloc] init];
    notif.alertBody = @"incoming call";
    [[UIApplication sharedApplication] presentLocalNotificationNow:notif];
    if (sinchinfo == nil)
        return;

    dispatch_async(dispatch_get_main_queue(), ^{
        [_sinchClient relayRemotePushNotificationPayload:sinchinfo];
    });
}

1条回答
看我几分像从前
2楼-- · 2019-03-29 20:30

If you integrated Pushkit and Sinch then push notification may can't catch on PushKit's delegate function - didReceiveIncomingPushWithPayload. But you can get push notification on SINManagedPushDelegate's function - didReceiveIncomingPushWithPayload. Push notification is not coming but you can get incoming call event on there when app is in background. You can trigger local notification if app is in background to let user incoming call know.

Hope that would be helpful for you.

查看更多
登录 后发表回答