VOIP Sinch в iOS 11 не работает в фоновом режиме

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

Pubnub request SCHEDULED (ID=081E49C2-C30A-4B4B-840C-E6A6051E6F44, URL=https://rebtelsdk.pubnub.com/subscribe/sub-c-c5e52f20-d446-11e3-b488-02ee2ddab7fe/5e1e1309-136a-40d4-935f-2627ebe4e8f2B/0/0, NST-VoIP: NO)


Pubnub request STARTED (ID=081E49C2-C30A-4B4B-840C-E6A6051E6F44)
Pubnub request SUCCESS (ID=081E49C2-C30A-4B4B-840C-E6A6051E6F44):
(
        (
    ),
    15117251992031337
)

onPubSubSubscriptionSuccess: userInfo: {
    channel = "5e1e1309-136a-40d4-935f-2627ebe4e8f2B";
    subscribeSequence = 1;
    timetoken = 0;
    useVoIPNetworkServiceType = 0;
}

Я загружаю сертификаты VOIP и APNS на панель управления Sinch и использовал SINManagedPush & PushKit Мой код

  1. Настройте Push Manager и SINClient в didFinishLaunchingWithOptions
    self.push = [Sinch managedPushWithAPSEnvironment:SINAPSEnvironmentAutomatic];
    self.push.delegate = self;
    [self.push setDesiredPushTypeAutomatically];
    void (^onUserDidLogin)(NSString *) = ^(NSString *userId) {
    [self.push registerUserNotificationSettings];
    [self initSinchClientWithUserId:userId];
    };
    [[NSNotificationCenter defaultCenter]
    addObserverForName:@"UserDidLoginNotification"
    object:nil
    queue:nil
    usingBlock:^(NSNotification *note) {
     NSString *userId = note.userInfo[@"userId"];

     [[NSUserDefaults standardUserDefaults] setObject:userId     forKey:@"userId"];
     [[NSUserDefaults standardUserDefaults] synchronize];
     onUserDidLogin(userId);
     }];


     - (void)initSinchClientWithUserId:(NSString *)userId {
    if (!_client) {
    _client = [Sinch clientWithApplicationKey:@"APP-Key"
                            applicationSecret:@"APP-Secret"
                              environmentHost:@"sandbox.sinch.com"
                                       userId:userId];

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

    [_client start];
    [_client startListeningOnActiveConnection];
    _callKitProvider = [[SINCallKitProvider alloc] initWithClient:_client];


    }
    }
  1. Получить токен устройства
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{


[self.push application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}

-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
NSLog(@"User Info : %@",notification.request.content.userInfo);
completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);

[self.push application:[UIApplication sharedApplication] didReceiveRemoteNotification:notification.request.content.userInfo];
}


-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
NSLog(@"User Info : %@",response.notification.request.content.userInfo);
completionHandler();
[self.push application:[UIApplication sharedApplication] didReceiveRemoteNotification:response.notification.request.content.userInfo];
}


- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[self.push application:application didReceiveRemoteNotification:userInfo];
}
  1. PushKit
-(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
{

[_client registerPushNotificationData:credentials.token];
 }
 -(void)pushRegistry:(PKPushRegistry *)registry   didInvalidatePushTokenForType:(PKPushType)type{


NSLog(@"invalidated");

 }

4. Вызов voipRegistration при запуске SINClient

- (void)clientDidStart:(id<SINClient>)client {
NSLog(@"Sinch client started successfully (version: %@)", [Sinch version]);
[self voipRegistration];
}

5.Внедрите SINManagedPushDelegate и SINCallClientDelegate.

- (void)client:(id<SINCallClient>)client didReceiveIncomingCall:(id<SINCall>)call {

UIViewController *top = self.window.rootViewController;
while (top.presentedViewController) {
    top = top.presentedViewController;
}
[top performSegueWithIdentifier:@"callView" sender:call];
}

- (SINLocalNotification *)client:(id<SINClient>)client localNotificationForIncomingCall:(id<SINCall>)call {
SINLocalNotification *notification = [[SINLocalNotification alloc] init];
NSArray * ansAr = @[@"رد",@"Answer"];
NSArray * MsgAr = @[[NSString stringWithFormat:@"مكالمة لم يرد عليها من %@", [call remoteUserId]],[NSString stringWithFormat:@"Incoming call from %@", [call remoteUserId]]];
notification.alertAction = ansAr[self.languageID];
notification.alertBody = MsgAr[self.languageID];
return notification;
}
- (void)client:(id<SINClient>)client willReceiveIncomingCall:(id<SINCall>)call {

[self.callKitProvider reportNewIncomingCall:call];
}

Это код. Пожалуйста, помогите мне, если я что-то забыл.
Я проверил, что credentials.token не равно нулю.
Спасибо за вашу помощь.


person Hazoomo    schedule 26.11.2017    source источник


Ответы (2)


Когда вы настраиваете управляемый запуск Sinch с помощью кода ниже:

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

Sinch SDK автоматически выполнит всю регистрацию PushKit за вас. Таким образом, шаги 3 и 4 в вашем описании не нужны и не должны быть там. Часть кода на шаге 2 также не требуется. Взгляните на пример приложения Sinch CallKit из пакета загрузки SDK и ознакомьтесь с реализацией этого приложения.

Ниже приводится демонстрационное видео, снятое с помощью примера приложения 3.12.4 Sinch SDK CallKit Sample App без каких-либо настроек, устройство, используемое в демонстрации, - это iPhone7 под управлением iOS 11, он принимает входящий вызов в фоновом режиме, в режиме блокировки и блокировки экрана:

Пример демонстрационного видео приложения Sinch CallKit

Также обратите внимание, что callKit работает только с VoIP push. Вы загрузили правильный тип push-сертификата на Sinch Portal?  введите описание изображения здесь

person Bo Li    schedule 04.04.2018
comment
Привет, @Bo Li! Вы можете получать голосовые уведомления на iOS 13? - person gstream79; 10.04.2020
comment
@Bo Li сталкивается с той же проблемой - person Meet Ios Developer; 21.06.2020

Когда вы принудительно убиваете приложение, яблоко не разбудит приложение для VoIP push, если вы просто в фоновом режиме или перезагрузите телефон, яблоко разбудит его. Раздражает, но это яблоко

person cjensen    schedule 28.11.2017
comment
Спасибо за ответ. Как мне разбудить приложение или принять вызов в фоновом режиме? , Я использую pushKit и хочу получать звонки только тогда, когда я нажимаю кнопку «Домой», а статус приложения - фоновый. - person Hazoomo; 30.11.2017
comment
@cjensen, ваше описание только для iOS 11? или для всех версий iOS? - person gstream79; 30.11.2017
comment
@Hazoomo, посмотрите этот ответ - stackoverflow.com/questions/42609204/ - person gstream79; 30.11.2017
comment
@ gstream79 Спасибо, но мне не помогло, буду использовать Sinch! без уведомлений - person Hazoomo; 10.12.2017
comment
Пожалуйста, любое руководство по использованию Sinch VOIP и IM в iOS 11 ?! - person Hazoomo; 10.12.2017
comment
@cjensen последний образец SDK для iOS не работает в фоновом режиме sinchCallingPush, sinchCallKit - person Hazoomo; 09.01.2018
comment
@cjensen Hazoomo gstream79 Мне действительно нужна помощь в sinch Я застрял, пожалуйста, помогите - person Meet Ios Developer; 21.06.2020
comment
такая же проблема здесь, так плохо voip - person famfamfam; 06.10.2020