Since iOS SDK build 2.6.76, it is possible to connect to an existing websocket session on the server to accept an incoming call when push notification is received:
1. Set keepAlive
option when conection is established for the first time
- (FPWCSApi2Session *)connectWithOptions:(FPWCSApi2SessionOptions *)options { options.urlServer = _connectUrl.text; options.keepAlive = true; options.sipRegisterRequired = _sipRegRequired.control.isOn; options.sipLogin = _sipLogin.input.text; options.sipAuthenticationName = _sipAuthName.input.text; options.sipPassword = _sipPassword.input.text; options.sipDomain = _sipDomain.input.text; options.sipOutboundProxy = _sipOutboundProxy.input.text; options.sipPort = [NSNumber numberWithInteger: [_sipPort.input.text integerValue]]; options.appKey = @"defaultApp"; ... session = [FPWCSApi2 createSession:options error:&error]; ... [session connect]; return session; }
2. Keep a session token after successful connection
[session on:kFPWCSSessionStatusEstablished callback:^(FPWCSApi2Session *rSession){ _authToken.input.text = [rSession getAuthToken]; [self changeConnectionStatus:[rSession getStatus]]; [self onConnected:rSession]; if (!_sipRegRequired.control.isOn) { [self changeViewState:_callButton enabled:YES]; } }];
Then, the session can be disconnected on mobile device when application goes to background, but the session will be kept on server during 1 hour by default.
3. When push notification is received, connect to the existing session by token
- (FPWCSApi2Session *)connectWithToken { FPWCSApi2SessionOptions *options = [[FPWCSApi2SessionOptions alloc] init]; options.authToken = _authToken.input.text; return [self connectWithOptions:options]; }
4. Receive incoming call event and create answer/hangup alert dialog
[session onIncomingCallCallback:^(FPWCSApi2Call *rCall) { call = rCall; ... alert = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:@"Incoming call from '%@'", [rCall getCallee]] message:error.localizedDescription preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* answerButton = [UIAlertAction actionWithTitle:@"Answer" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { [call answer]; }]; [alert addAction:answerButton]; UIAlertAction* hangupButton = [UIAlertAction actionWithTitle:@"Hangup" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { [call hangup]; }]; [alert addAction:hangupButton]; [self presentViewController:alert animated:YES completion:nil]; }];
5. Accept the incoming call
[call on:kFPWCSCallStatusEstablished callback:^(FPWCSApi2Call *call){ [self changeCallStatus:call]; [self toHangupState]; [self changeViewState:_holdButton enabled:YES]; }];