Не в состоянии сделать телефонный звонок

Я хочу сделать телефонный звонок и для этого использую приведенный ниже код.

- (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 отображается и отклоняется программно.

Другие вопросы по тегам