проблема с использованием tel: URL для инициирования вызова - PullRequest
25 голосов
/ 01 мая 2009

Я пытаюсь инициировать звонок из приложения для iPhone.

Этот связанный код работает и открывает Safari, как и ожидалось:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.apple.com"]];

Но, когда я заменяю URL-адрес http на URL-адрес телефона, полученный код не вызывает приложение телефона:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:3035551212"]];

Никаких исключений или предупреждений не генерируется (в симуляторе или на устройстве).

Есть идеи, в чем проблема с моим вызовом?

Спасибо.

Ответы [ 11 ]

43 голосов
/ 27 октября 2009

iphone наберет номер, используя любой из перечисленных ниже форматов. Но это ничего не даст, если вы находитесь в симуляторе. Мне потребовалось 30 минут, чтобы стучать головой, чтобы понять это.

[[UIApplication sharedApplication] 
                    openURL:[NSURL URLWithString:@"tel://15415551234"]];

[[UIApplication sharedApplication] 
                    openURL:[NSURL URLWithString:@"tel:15415551234"]];

[[UIApplication sharedApplication] 
                    openURL:[NSURL URLWithString:@"tel:1-541-555-1234"]];

Ссылка на документацию Apple по тел: схема URL

Ссылка на документацию openURL

6 голосов
/ 30 июня 2011

( и ) на самом деле не проблема, если вы используете stringByAddingPercentEscapesUsingEncoding, как предлагает samiq. То же самое касается +, / и пробелов. Это URL, поэтому экранирование кажется естественным.

Если я угадаю правильно, обычное распознавание телефонных номеров Apple будет использоваться в обработчике схемы tel:, если вы уйдете правильно.

(отсутствует репутация, чтобы оставить комментарий)

6 голосов
/ 21 июля 2010

Как сказал @bentford, кто-то может потерпеть неудачу, потому что симулятор отображает предупреждение, когда вы пытаетесь нажать на телефон в приложении контактов, это просто предупреждение, которое генерируется, потому что приложение проверяет, действительно ли tel: Протокол поддерживается на устройстве или нет.

В дополнение к тому, что он пишет, вы также можете добавить поддержку для экранирования любых специальных символов или пробелов, как в:

NSString *phoneStr = [NSString stringWithFormat:@"tel:%@",[self.contactDetails objectForKey:@"phone"]];
NSString *escaped = [phoneStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:escaped]];

Надеюсь, это поможет.

Приветствие.

4 голосов
/ 06 декабря 2010

Если ваш номер телефона содержит ( или ), приложение Телефон не запустится.

3 голосов
/ 23 июля 2011

Я обнаружил, что проблема связана с символами, которые не разрешены для tel: // URI - следующий код решил мою проблему:

NSMutableCharacterSet *charSet = [NSMutableCharacterSet new];
[charSet formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];
[charSet formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]];
[charSet formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]];
NSArray *arrayWithNumbers = [str componentsSeparatedByCharactersInSet:charSet];
NSString *numberStr = [arrayWithNumbers componentsJoinedByString:@""];
3 голосов
/ 13 мая 2009

У вас не было проблем с использованием tel:{phone-number} и вызовом его так же, как вы. Работает только на устройстве iPhone.

Одна вещь, которую я должен был сделать, - это удалить посторонние символы (такие как все скобки, пробелы, тире и точки) из телефонной строки. Некоторые из приведенных выше примеров (но не оригинальный пост) имеют тире. Это может быть проблемой.

2 голосов
/ 13 мая 2009

Я только что натолкнулся на это, когда пытался добавить кнопку «Позвонить» к UIAlertView. У меня был следующий код для обработки вызова:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex != 0)
    {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:1-602-555-1212"]];
    }
}

Ничего не откроется, как и ты. Я даже попробовал обычный http URL. Оказалось, я забыл установить delegate на self. Это, вероятно, и ваша проблема.

1 голос
/ 23 февраля 2012

дополнительная информация о телефонных звонках по схеме URL (как мне кажется, кому-то это может пригодиться)

Как использовать тел: с * (звездочка, звездочка) или # (хеш, фунт) на iOs?

1 голос
/ 04 февраля 2011

У меня возникла та же проблема, и, наконец, я обнаружил, что причина в том, что в номере телефона есть пробел (для лучшего форматирования). После удаления пробела все заработало нормально.

0 голосов
/ 12 ноября 2018

Вот обновление о том, как получить номер телефона в 2018 году (где iOS 11 и 12 являются наиболее распространенными):

NSString *phoneNumberURLString = [@"tel://" stringByAppendingString:[result.phoneNumber
                 stringByAddingPercentEncodingWithAllowedCharacters:
                                 [NSCharacterSet URLPathAllowedCharacterSet]]];
NSURL *phoneNumberURL = [NSURL URLWithString:phoneNumberURLString];

ответ samiq был тем, что я использовал изначально, пока не обнаружил, что мое приложение зависло из-за создания nil NSURL (а затем его передачи в объект коллекции) из-за невозможности правильно экранировать номер телефона отформатирован так: (###) ###-####. Вышеупомянутый код разрешает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...