Вызов Sinch IOS, когда приложение находится в автономном режиме с использованием APN (получение ранее инициированного клиента)

Я успешно интегрировал Sinch SDK, и он отлично работает, когда приложение открыто, теперь я обрабатываю вызов, когда мое приложение находится в автономном режиме.

Используя приведенный ниже метод, я вижу пары push-уведомлений и отправляю эту пару push-уведомлений на сервер для доставки push-уведомлений.

- (void)call:(id<SINCall>)call shouldSendPushNotifications:(NSArray *) pushPairs {

}

В методе didFinishLaunchingWithOptions() Appdelegate.m я получаю полезную нагрузку, специфичную для синча.

 NSDictionary* remotePush = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    NSLog(@"%@",remotePush);
    if (remotePush) {
        NSLog(@"Entery ****");
        // Extract the Sinch-specific payload from the Apple Remote Push Notification
        NSString* payload = [[remotePush valueForKey:@"aps"] valueForKey:@"SIN"];

    //    [[userInfo valueForKey:@"aps"] valueForKey:@"content-available"];
        NSLog(@"Payload :%@",payload);
        // Get previously initiated Sinch client
        id<SINClient> client = _client;
        NSLog(@"Client ID %@",[client userId]);
        id<SINNotificationResult> result = [client relayRemotePushNotificationPayload:payload];
        NSLog(@"Result :%@",result);
        if (result.isCall && result.callResult.isTimedOut) {
            // Present alert notifying about missed call
        } else if (!result.isValid) {
            // Handle error
        }
    }

Вот полные данные Push-уведомления:

{
        aps =     {
            SIN = "AgEBdeibxmJBSK2Y7Nh/fz50VMhVBVQMKzkxODg0NzE4MjQx";
            alert = "";
            "content-available" = 1;
            type = 2;
        };
    }

Переходя к этому коду:

// Get previously initiated Sinch client
    id<SINClient> client = _client;
    NSLog(@"Client ID %@",[client userId]);

Когда я печатаю идентификатор клиента, он равен нулю. Как мне получить ранее инициированный клиент Sinch? поскольку приложение закрыто, экземпляр клиента освобождается.


person krish    schedule 02.09.2014    source источник


Ответы (1)


Вам нужно сохранить идентификатор пользователя самостоятельно, а затем, когда приложение перезапустится, инициализировать SinchClient с помощью идентификатора пользователя, который вы сохранили при последнем закрытии приложения.

Самым простым, вероятно, является использование NSUserDefaults и сохранение поля «userId», которое вы пишете, когда пользователь входит в систему, и удаляете, если пользователь выходит из вашего приложения.

Например, при запуске:

[[NSUserDefaults standardUserDefaults] setObject:userId forKey:@"userId"];

а затем, когда ваше приложение запускается через APN:

NSString *persistedUserId = [[NSUserDefaults standardUserDefaults] objectForKey:@"userId"];
if (persistedUserId != nil) {
  _client = [Sinch clientWithApplicationKey:APPLICATION_KEY
                          applicationSecret:APPLICATION_SECRET
                            environmentHost:ENVIRONMENT
                                     userId:persistedUserId];
}
person frals    schedule 02.09.2014
comment
Спасибо за быстрый ответ, я сделал в соответствии с вами, теперь я вижу идентификатор пользователя, клиент инициируется, но вызов не ретранслируется. Когда я печатаю результат id‹SINNotificationResult› = [client relayRemotePushNotificationPayload:payload]; NSLog(@Результат:%@,результат); Результат: SINNotificationResultImpl: 0x146ee9c0›. Тем не менее Звонок не ретранслируется. - person krish; 02.09.2014
comment
@krish Я думаю, что это отдельный вопрос, но см. stackoverflow.com/questions/25451427/, если это может помочь - person frals; 02.09.2014