IPhone, позвоните по другому номеру телефона в ответ на первый ответ?
Я пытаюсь создать приложение, которое инициирует обращение к контакту с приоритетом 1 в списке, подобном колл-центру.
Затем, если этот контакт не отвечает (позвольте забыть всю проблему автоответчиков здесь), я бы хотел вызвать контакт с приоритетом 2 и так далее, пока один из них не ответит, или я не исчерпаю свой список.
Возможно ли это?
Я пробовал следующее:
- Подключитесь к событию
CTCallCenter.CallEventHandler
и проверьте состояние вызова для CTCallStateConnected
и CTCallStateDisconnected
, и я получаю его, чтобы ответить на тот факт, что вызов отключен, не подключаясь, а затем попытаться инициировать другой вызов как я сделал первый, но эта вторая попытка просто сидит в воде.
- Переопределите метод
DidEnterBackground
и периодически проверяйте свойство CTCall.CallState
, в основном снова пытающееся ответить на отключенное соединение, которое никогда не было подключено, но это не работает либо
Я также попытался добавить короткую задержку (1 секунду, 2,5 секунды и 10 секунд) после обнаружения отключенного состояния перед тем, как попытаться сделать следующий диск, чтобы телефонное приложение "успокоилось" после прерывания вызова, это не изменить что-нибудь.
Ответы
Ответ 1
Я считаю, что это лучше решить в пункте назначения телефонного звонка. Я бы либо попросил телефонную компанию настроить "следовать за мной", использовать Twilio или какой-либо другой сторонний сервис (как уже было предложено) или настроить мою собственную УАТС, используя что-то вроде Asterisk (Asterisk включает в себя возможность настройки типа "следовать за мной" ). Это обеспечивает вам большую гибкость и контроль, даже если вы нашли способ сделать это изначально в iOS.
Сказав это, я получил это, чтобы работать в iOS, предполагая следующее:
- Ваше приложение инициирует вызов.
- Открывается телефонное приложение, набирает номер и отключается.
- Пользователь явно возвращается в ваше приложение. Если вам удалось получить информацию о событиях во время вашего приложения, я хочу узнать больше: -).
- При возврате управления вашему приложению события телефона отправляются и инициируется новый вызов.
У меня есть следующий фрагмент кода в моем методе UIApplicationDelegate didFinishLaunchingWithOptions:
// In appdelegate header, ct is declared as @property (strong, nonatomic) CTCallCenter *ct;
self.ct = [[CTCallCenter alloc] init];
self.ct.callEventHandler = ^(CTCall *call) {
if (call.callState == CTCallStateConnected) {
// do some state management to track the call
} else if (call.callState == CTCallStateDisconnected) {
// check that this is the expected call and setup the
// new phone number
NSURL *telURL = [NSURL URLWithString:myNewNumberURL];
[application openURL:telURL];
}
};
Это вызовет новый вызов. Я использую IOS 5 SDK; протестирован на iPhone 4s.
ИЗМЕНИТЬ
Использование В качестве отправной точки для возврата в поведение приложения после разговора по телефону в собственном коде, чем UIWebView, мне удалось заставить это работать. Обратите внимание, что для ясности я отслеживал управление памятью. Предполагая, что вы используете технику веб-просмотра для возврата в приложение после завершения вызова, попробуйте что-то подобное в завершенном блоке:
else if (call.callState == CTCallStateDisconnected) {
// check that this is the expected call and setup the
// new phone number
NSURL *telURL = [NSURL URLWithString:myNewNumberURL];
dispatch_async(dispatch_get_main_queue(), ^{
UIWebView *callWebview = [[UIWebView alloc] init] ;
[self.window.rootViewController.view addSubview:callWebview];
[callWebview loadRequest:[NSURLRequest requestWithURL:telURL]];
// and now callWebView sits around until the app is killed....so don't follow this to the letter.
});
}
Однако это может не совсем дать вам то, что вы хотите. Пользователь будет получать оповещение по каждому запросу, предоставляя возможность отменить вызов.
Ответ 2
Вы можете использовать http://labs.twilio.com/twimlets/findme. Вы могли бы назвать приложение номером Twilio, и он мог бы использовать findme для вызова всех номеров в порядке.
Ответ 3
Я не смотрел на него глубже, но SDK Deutsche Telekom может содержать то, что вы ищете:
http://www.developergarden.com/fileadmin/microsites/ApiProject/Dokumente/Dokumentation/ObjectiveC-SDK-2.0/en/interface_voice_call_service.html
Я действительно не уверен, хотя (у меня нет времени, чтобы действительно посмотреть на него в данный момент). Я просто вспомнил, что где-то читал, что у них есть SDK для iOS, который также должен обрабатывать управление вызовами, поэтому я 'm размещая ссылку здесь для вас, чтобы узнать (и, надеюсь, скажите нам, если она работает).
Ответ 4
#pragma mark -
#pragma mark Call Handler Notification
-(void)notificationCallHandler {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callReceived:) name:CTCallStateIncoming object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callEnded:) name:CTCallStateDisconnected object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callConnected:) name:CTCallStateConnected object:nil];
}
-(void)callEnded:(NSNotification*)notification {
NSLog(@"callEnded");
}
-(void)callReceived:(NSNotification*)notification {
NSLog(@"callReceived");
}
-(void)callConnected:(NSNotification*)notification {
NSLog(@"callConnected");
}
Пусть это поможет вам
Ответ 5
если вы хотите настроить новый вызов, в то время как приложение находится в фоновом режиме, я не вижу правильного пути для этого, может быть, взломать lil, получить обновление местоположения (потому что u может получать обновления местоположения, когда приложение находится в фоновом режиме), и служба определения местоположения автоматически пробуждает ваше приложение, когда поступают новые данные о местоположении, и небольшое количество времени предоставляется приложению, в котором вы можете выполнить какой-либо код, в это время вы можете начать новый вызов.
u можно прочитать здесь:
выполните поиск по этой ссылке "Запуск службы определения значимых изменений" в этой ссылке Location Aware Programming guide
, и прочитайте абзац, который записывается после блока кода.