как открыть номеронабиратель телефона в iOS 9?

Я нашел решение, что мне нужно добавить код в info.plist. Я сделал это, как показано ниже:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>tel</string>
</array>

все равно не поможет. Я получаю эту ошибку:

"-canOpenURL: ошибка для URL-адреса: "tel://4806501708" - ошибка: "Этому приложению не разрешено запрашивать телефон схемы"

мой код для открытия номеронабирателя:

NSString *phoneNumber = [@"tel://" stringByAppendingString:lblVenPhoneValue.text];
if ([UIApplication.sharedApplication canOpenURL:[NSURL URLWithString:phoneNumber]]) {
        [UIApplication.sharedApplication openURL:[NSURL URLWithString:phoneNumber]];

Что мне нужно сделать?
Заранее спасибо


person Hiren Prajapati    schedule 04.03.2016    source источник
comment
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@tel:%@,@digits]]]; попробуй так, без //   -  person MOHAMMAD ISHAQ    schedule 04.03.2016
comment
NSString *phoneNumber = [@telprompt://stringByAppendingString:@number]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber]]; проверьте это тоже, если выше не работает   -  person MOHAMMAD ISHAQ    schedule 04.03.2016
comment
не повезло. все еще получаю: этому приложению не разрешено запрашивать схему telprompt   -  person Hiren Prajapati    schedule 04.03.2016
comment
мой info.plist правильный? вот   -  person Hiren Prajapati    schedule 04.03.2016
comment
telprompt попробуйте это в info.plist   -  person MOHAMMAD ISHAQ    schedule 04.03.2016
comment
вы тестируете это на устройстве? , потому что это не будет работать на симуляторе. И в устройстве должна быть сим-карта.   -  person MOHAMMAD ISHAQ    schedule 04.03.2016
comment
‹dict› ‹key›CFBundleDevelopmentRegion‹/key› ‹string›en‹/string› ‹key›CFBundleExecutable‹/key› ‹string›$(EXECUTABLE_NAME)‹/string› ‹key›CFBundleIdentifier‹/key› ‹string›$ (PRODUCT_BUNDLE_IDENTIFIER)‹/string› ‹key›CFBundleInfoDictionaryVersion‹/key› ‹string›6.0‹/string› ‹key›CFBundleName‹/key› ‹string›$(PRODUCT_NAME)‹/string› ‹key›CFBundleSignature‹/key› ‹string›????‹/string› ‹key›CFBundleVersion‹/key› ‹string›1‹/string› ‹key›LSApplicationQueriesSchemes‹/key› ‹array› ‹string›tel‹/string› ‹string›telprompt ‹/string› ‹/массив› ‹/dict› ‹/plist›   -  person Hiren Prajapati    schedule 04.03.2016
comment
Я забыл упомянуть, что я использую симулятор. Может в этом причина неудачи. Я должен проверить на устройстве.   -  person Hiren Prajapati    schedule 04.03.2016
comment
вроде все нормально, надо тестить на устройстве (с сим картой)   -  person MOHAMMAD ISHAQ    schedule 04.03.2016


Ответы (4)


Вы тестируете это на устройстве? , потому что это не будет работать на симуляторе. И в устройстве должна быть сим-карта.

После подтверждения выше попробуйте следующее

В инфо.plist

<key>LSApplicationQueriesSchemes</key>
<array>
<string>tel</string>
<string>telprompt</string>
</array>

Где хотите открыть номеронабиратель телефона

 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel:%@",@"digits"]]]; 

or

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"telprompt:%@",@"digits"]]];
person MOHAMMAD ISHAQ    schedule 04.03.2016
comment
без добавления LSApplicationQueriesSchemes тоже работает нормально - person Durai Amuthan.H; 28.02.2017

просто удалите "//" из @"tel://" должно работать

NSString *phoneNumber = [@"tel:" stringByAppendingString:lblVenPhoneValue.text];
if ([UIApplication.sharedApplication canOpenURL:[NSURL URLWithString:phoneNumber]]) {
        [UIApplication.sharedApplication openURL:[NSURL URLWithString:phoneNumber]];

Для более качественных проверок вы можете использовать

if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:[NSString stringWithFormat:phoneNumber]]])
{
  CTTelephonyNetworkInfo *networkInfo = [CTTelephonyNetworkInfo new];
  CTCarrier *carrier = [networkInfo subscriberCellularProvider];
  NSString *_code = [carrier mobileNetworkCode];
  if(_code)
  {
    [[UIApplication sharedApplication] openURL:phoneNumber]];
  }
  else
  {
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"no_sim" message:@"" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
    [alert show];
  }
}
else
{
  UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"alert" message:@"alert_device_not_support" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
  [alert show];
}
person aman.sood    schedule 04.03.2016
comment
Я забыл упомянуть, что я использую симулятор. Может в этом причина неудачи. Я должен проверить на устройстве. - person Hiren Prajapati; 04.03.2016
comment
Ох. Это должно быть причиной, тогда вы должны добавить проверку/оповещение для таких условий - person aman.sood; 04.03.2016

для Swift 4.0 используйте это (убедитесь, что вы не на симуляторе)

        let cleanPhoneNumber = phone.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "")
        let urlString:String = "tel://\(cleanPhoneNumber)"

        if let phoneCallURL = URL(string: urlString) {
            if (UIApplication.shared.canOpenURL(phoneCallURL)) {
                UIApplication.shared.open(phoneCallURL, options: [:], completionHandler: nil)
            }
        }
person ShrikantWalekar    schedule 26.09.2018

Это не будет работать в симуляторе, но отлично работает на устройстве iPhone.

частная функция makeCall(number:String){ let number = "9876543210"

    if let url = URL(string: "tel://\(number)"), UIApplication.shared.canOpenURL(url) {
        if #available(iOS 10, *) {
            UIApplication.shared.open(url)
        } else {
            UIApplication.shared.openURL(url)
        }
    }
}
person Nirbhay Singh    schedule 03.05.2019