Не в состоянии сделать телефонный звонок
Я хочу сделать телефонный звонок и для этого использую приведенный ниже код.
- (void)callPhoneNumber:(NSString *)phoneNumber
{
UIWebView * webView2 = [[UIWebView alloc] init];
// Remove non-digits from phone number
phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];
// Make a call
NSURL * url = [NSURL URLWithString:[NSString stringWithFormat:@"tel:%@", phoneNumber]];
[webView2 loadRequest:[NSURLRequest requestWithURL:url]];
[self.view addSubview:webView2];
}
Перед тем как позвонить, я прошу пользователя выбрать вариант, используя UIActionSheet
, Когда пользователь выбирает опцию, на основании этого я делаю звонок.
Проблема в том, что приведенный выше код работает нормально, если я не отображаю UIActionSheet
и прямо позвонить. Он выдает предупреждение, запрашивающее подтверждение у пользователя, чтобы совершить звонок. Но после отображения UIActionSheet
Если я вызываю вышеупомянутый метод, то он не отображает предупреждение о подтверждении.
Странно то, что после этого, если я остановлю приложение из Xcode, тогда приложение будет помещено в фоновый режим, как и должно быть. Но также я вижу это подтверждение на главном экране устройства. Как это отображается на домашнем экране устройства, а не в приложении?
Кто-нибудь сталкивался с этим раньше? В чем может быть причина?
РЕДАКТИРОВАТЬ: я также попробовал ниже код. Но это та же проблема. Всякий раз, когда вышеуказанный код webview работает ниже, код также работает. То же самое, когда это не работает.
NSString *phoneNumberURL = [NSString stringWithFormat:@"telprompt:%@", phoneNumber];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumberURL]];
Изменить: добавление кода для листа действий и делегата.
Я сначала отображаю предупреждение. При нажатии кнопки оповещения я отображаю лист действий. И выбирая вариант из листа действий я размещаю звонок.
# pragma mark - ALERT VIEW DELEGATE
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if(alertView.tag == MY_TAG)
{
// Ask to select option
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Select Option" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Option1", @"Option2", nil];
actionSheet.actionSheetStyle = UIActionSheetStyleDefault;
[actionSheet showInView:self.view];
}
}
#pragma mark - UIActionSheet Methods
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
// If not pressed cancel button.i.e. selected one of the options
if (buttonIndex != actionSheet.cancelButtonIndex)
{
// Place a call
[self callPhoneNumber:@"1234567890"];
}
}
6 ответов
Если в вашем номере есть пробел, он не будет работать, поэтому его необходимо удалить, также при использовании tel:
а также telprompt:
это должно быть tel://
или же telprompt://
обратите внимание на дополнительные //
,
Я прокомментировал мой код с объяснением каждого шага, если вам нужно что-то еще, просто прокомментируйте, и я предоставлю больше.
- (void)callPhoneNumber:(NSString *)phoneNumber
{
// If statement to check we actually have something
if(phoneNumber) {
// Remove any unwanted whitespace, if there is any whitespace it will not work
phoneNumber = [phoneNumber stringByReplacingOccurrencesOfString:@" " withString:@""];
// Create an NSURL instance of your number
// Note the extra `//` in the string
// Also note you can also use: `telprompt://` instead of `tel://`
NSURL *urlPhoneNumber = [NSURL URLWithString:[NSString stringWithFormat:@"tel://%@", phoneNumber]];
// Check to make sure we can open this because iPad and iPod will not respond to phone calls
if([[UIApplication sharedApplication] canOpenURL:urlPhoneNumber]) {
// If we can (So if iPhone really) make the call.
[[UIApplication sharedApplication] openURL:urlPhoneNumber];
}
}
}
Изменить дополнительные заметки
Прочитайте документацию Apple об этом здесь
Отмечу, что в документации Apple сказано, что tel:
а также telprompt:
должно работать и не нужно для дополнительного //
но я обнаружил, что он все еще работает с дополнительным //
, Это меня немного смущает, так как технически tel:
а также telprompt:
являются URL Schemes
и дополнительный //
требуются в `Схемах URL. Вот хороший урок на них от iPhone Development 101
Вот немного дополнительной информации
Используйте OpenURL, чтобы сделать звонок, используя URL.
- (void)callPhoneNumber:(NSString *)phoneNumber
{
// Remove non-digits from phone number
phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];
// Make a call
NSURL * url = [NSURL URLWithString:[NSString stringWithFormat:@"tel:%@", phoneNumber]];
[[UIApplication sharedApplication] openURL:url];
}
Попробуйте позвонить didDismissWithButtonIndex:
, так что UIActionSheet уже удален, возможно, он что-то блокирует.
NSString * telephoneNumber;
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:telephoneNumber]];
[telephoneNumber release];
Вместо использования UIWebView попробуйте следующее:
NSURL *phoneUrl = [NSURL URLWithString:[NSString stringWithFormat:@"telprompt:%@",phoneNumber]];
if ([[UIApplication sharedApplication] canOpenURL:phoneUrl]) {
[[UIApplication sharedApplication] openURL:phoneUrl];
}
Отредактировано: проверьте, вызывается ли функция телефонного звонка или нет, установив точку останова. Если функция вызова по телефону не вызывается, замените функцию проверки индекса кнопки на листе действий следующим образом:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0)
{
//Code for cancel button
}
if (buttonIndex == 1)
{
//Code for calling phone call
[self callPhoneNumber:@"1234567890"];
}
}
Отредактировано 2:
Теперь сформулируйте это так:
- (void)checkCallAlert :(NSInteger)index
{
UIAlertView *checkCallAlert = [[UIAlertView alloc] initWithTitle:@"Check?" message:@"Are you sure you want to continue?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Call", nil];
[checkCallAlert setTag:index];
[checkCallAlert show];
}
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0)
{
//Code for cancel button
}
if (buttonIndex == 1)
{
[self checkCallAlert : buttonIndex];
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if(alertView.tag == 1){
//Destination 1 clicked
//Code for calling phone call
[self callPhoneNumber:@"1234567890"];
}
}
Это было бы мое окончательное решение для этого.
Попробуйте использовать следующее вместо [self callPhoneNumber ... ]
вызывать callPhoneNumber
после завершения текущего цикла обновления:
[self performSelector:@selector(callPhoneNumber:) withObject:@"1234567890" afterDelay:0];
Так же UIActionSheet
в справочном документе говорится:
В iOS 4.0 и более поздних версиях листы действий не удаляются автоматически, когда приложение перемещается в фоновый режим
Так что вам нужно проверить applicationWillResignActive
если actionSheet
отображается и отклоняется программно.