2016-11-04 4 views
0

Когда приложение находится в фоновом режиме и происходит входящий звонок, и пользователь не взял его. Когда пользователь возвращается в приложение, вызывается - (void)client:(id<SINCallClient>)client didReceiveIncomingCall:(id<SINCall>)call.didReceiveIncomingCall называется, хотя это пропущенный звонок

Шаги по воспроизведению

  • пользователя о вызывающем абоненте
  • пользователя B приемник
  • Пользователь B имеет приложение в фоновом режиме
  • Пользователь B вызывает пользователь А
  • Пользователь B вешает вызов до пользователь A поднимает
  • Пользователь B открывает приложение, и - (void)client:(id<SINCallClient>)client didReceiveIncomingCall:(id<SINCall>)call получает сразу же вызов, а call.status - 0 с o SINCallStateInitiating

Это нормальное поведение? Есть ли способ узнать, что этот вызов больше не «доступен»?

Я работаю с прошивкой 10 и Sinch версии: 3.9.7-26289c8

Спасибо!

EDIT

Отображение кода, как я инициализировать Sinch клиент, сведущих Push, уведомления и т.д. Все ниже код происходит внутри AppDelegate

AppDelegate

@interface AppDelegate()<SINCallClientDelegate,SINManagedPushDelegate,SINClientDelegate>

Инициализация SINManagedPush:

AppDelegate в didFinishLaunchingWithOptions

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

Инициализация Sinch клиента: как только пользователь вошел в систему

- (void)initSinchClientWithUserId:(NSString *)userId { 

    if (!_client) { 
     _client = [Sinch clientWithApplicationKey:[BCEnvironment sinchAppKey] 
           applicationSecret:[BCEnvironment sinchAppSecret] 
            environmentHost:[BCEnvironment sinchEnvHost] 
              userId:userId]; 

     BCUser *user = [BCDataProvider loggedInUser]; 
     [self.push setDisplayName:[user displayName]]; 

     _client.delegate = self; 
     _client.callClient.delegate = self; 
     [_client setSupportCalling:YES]; 
     [_client enableManagedPushNotifications]; 
     [_client start]; 
    } 
} 

Регистрация для удаленных уведомлений

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
    [self.push application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; 
} 

Получение толчок уведомление

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    [self.push application:application didReceiveRemoteNotification:userInfo]; 
} 

SINManagedPushDelegate

- (void)managedPush:(id<SINManagedPush>)unused didReceiveIncomingPushWithPayload:(NSDictionary *)payload forType:(NSString *)pushType { 
    [self.client relayRemotePushNotification:payload]; 
} 

SINCallClientDelegate -> Это называется не имеет значения, если вызов не "существует" больше

- (void)client:(id<SINCallClient>)client didReceiveIncomingCall:(id<SINCall>)call { 
    //This opens the calling screen, even if the call is "old" and the caller has already hangup or the call timed out, etc. Here is where I am having the issue 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"DidReceiveCall" object:nil userInfo:@{@"call":call}]; 
} 
+0

Я столкнулся же вопрос. при открытии приложения после пропущенного вызова он перенаправляет меня на экран вызова, так как я получаю инициирование вызова. –

ответ

0

вы передаете данные push клиенту самостоятельно?В этом случае вы можете проверить полезную нагрузку в результате

https://download.sinch.com/docs/iOS/latest/reference/html/Protocols/SINNotificationResult.html#//api/name/isValid

Пример использования:

id result = [self.client relayLocalNotification:notification]; 
if ([result isCall] && [[result callResult] isTimedOut]) { 
    NSString remoteUserId = [[result callResult] remoteUserId]; // present  
    UIAlert indicating user has a missed call. } 
else if([result isMessage]){ 
    NSString messageId = [[result messageResult] messageId]; // show view controller that highlights the particular message 
} 
+0

Благодарим вас за ответ. Внутри 'managedPush: didReceiveIncomingPushWithPayload' Я извлекаю результат из' relayRemotePushNotification' Когда устройство находится в фоновом режиме и получает вызов, я получаю 'SINNotificationResult' со всем окном. Таким образом, '[result isValid]' is true и '[[result callResult] isTimedOut]' is false. Это имеет смысл, потому что звонок продолжается правильно, пользователь просто не подбирает. После того, как вызывающий пользователь зависает, вызываемое устройство открывает приложение и «клиент: didReceiveIncomingCall:». На данный момент у меня нет информации о статусе звонка –

+0

Привет, так это состояние гонки, где вы повесили трубку, пока вы пытаетесь подключиться? – cjensen

+0

Я бы не сказал, что это состояние гонки, так как 'client: didReceiveIncomingCall:' получает вызов, даже если звонок уже был отключен вызывающим абонентом уже некоторое время назад. –

Смежные вопросы