使用Sinch VOIP的Pushkit无法使用pushkit

时间:2017-03-05 13:56:38

标签: ios objective-c voip sinch pushkit

我正在尝试在我的IOS应用程序中使用Sinch实现App-to-App调用。我已经在我的iOS应用程序中使用Sinch实现了Pushkit,但是当应用程序处于后台时推送通知不起作用。

我有两个问题。

  1. 我是否需要其他网络服务才能将推送通知单独发送到我的应用以获取传入应用,或者Sinch会自行处理。

  2. 如果它确实处​​理了自己,那么我的代码中缺少什么。

  3. #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 个答案:

答案 0 :(得分:2)

如果您集成了Pushkit和Sinch,则推送通知可能无法捕获PushKit的委托函数 - didReceiveIncomingPushWithPayload。但是你可以在SINManagedPushDelegate的函数上获得推送通知 - didReceiveIncomingPushWithPayload。 推送通知未来,但当应用程序处于后台时,您可以在那里获得来电事件。如果应用程序处于后台,您可以触发本地通知,以便让用户来电。

希望这对你有所帮助。