Подтвердить что ты не робот

Ошибка canOpenURL для системных схем URL

Я запускаю iOS 9b5.

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

Чтобы определить возможности устройства, я использую:

[[UIApplcation sharedApplication] canOpenURL:@"telprompt://5555555555"]  

Как мы все знаем, iOS 9 требует, чтобы мы использовали белый URL любых схем URL, которые мы будем использовать в нашем приложении в качестве меры конфиденциальности.

У меня это в моем Info.plist:

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

Независимо от того, что я делаю, я все еще получаю canOpenURL: не удалось URL: "telprompt://" - ошибка: "(null)". Я пробовал tel://и sms://, и я не могу избежать этого предупреждения syslog.

Кто-нибудь знает, как определить, может ли устройство позвонить по телефону без запуска этих предупреждений?

4b9b3361

Ответ 1

То, что я обнаружил до сих пор, заключается в том, что если консоль регистрирует -canOpenURL: failed for URL: "xxx://" - error: "(null)", это действительно работает. Как только будет какая-либо другая ошибка, чем null, она может не работать. Если ошибка "This app is not allowed to query for scheme xxx", вы должны добавить эту схему в свое приложение .plist:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>xxx</string>
</array>

Странное поведение, которое выводит консоль как ошибка, хотя ее нет.

Ответ 2

Я думаю, вам, возможно, придется попробовать это на самом устройстве или просто попробовать еще раз. Я только что начал работать над своим iPhone 5, похоже, вам даже не нужно добавлять его в LSApplicationQueriesSchemes. Если приложение построено с помощью Xcode 7 Beta 6, и вы используете canOpenURL или openURL, как показано ниже, он, похоже, отлично работает на устройстве.

[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel:555-555-5555"]]

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:555-555-5555"]]

На iOS-симе я все еще получаю ошибку:
LaunchServices: ОШИБКА: нет зарегистрированного обработчика для схемы URL tel. -canOpenURL: не удалось URL: "tel: 555-555-5555" - ошибка: "Это приложение не разрешено запрашивать для схемы tel"

Ответ 3

У меня такая же ошибка в устройствах IOS9. Поэтому я использовал ниже фрагмент кода, чтобы избежать этой ошибки.

NSString *cleanedString = [[[PHONE NUMBER] componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789-+()"] invertedSet]] componentsJoinedByString:@""];
NSString *escapedPhoneNumber = [cleanedString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *phoneURLString = [NSString stringWithFormat:@"telprompt:%@", escapedPhoneNumber];
NSURL *phoneURL = [NSURL URLWithString:phoneURLString];

if ([[UIApplication sharedApplication] canOpenURL:phoneURL]) {
    [[UIApplication sharedApplication] openURL:phoneURL];
}

Ответ 4

Поскольку iOS9 обесценивает stringByAddingPercentEscapesUsingEncoding, для очистки URL-адреса telprompt можно использовать следующее.

NSString *cleanedString = [[[PHONE NUMBER] componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789-+()"] invertedSet]] componentsJoinedByString:@""];
//NSString *escapedPhoneNumber = [cleanedString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *escapedPhoneNumber = [cleanedString stringByAddingPercentEncodingWithAllowedCharacters: [NSCharacterSet URLQueryAllowedCharacterSet]];
NSString *phoneURLString = [NSString stringWithFormat:@"telprompt:%@", escapedPhoneNumber];
NSURL *phoneURL = [NSURL URLWithString:phoneURLString];

if ([[UIApplication sharedApplication] canOpenURL:phoneURL]) {
    [[UIApplication sharedApplication] openURL:phoneURL];
}

Ответ 5

попробуйте следующее:

NSString *phone_number = [[yourPhoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789-+()"] invertedSet]] componentsJoinedByString:@""];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"telprompt://%@", phone_number]]];

Ответ 6

В iOS9 я использую этот код, и он работает:

NSString *assistanceNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"AssistanceCallMISDN"];
    assistanceNumber= [[assistanceNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789-+()"] invertedSet]] componentsJoinedByString:@""];
    assistanceNumber = [assistanceNumber stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


    NSURL *phoneUrl = [NSURL URLWithString:[@"telprompt://" stringByAppendingString:assistanceNumber]];
    NSURL *phoneFallbackUrl = [NSURL URLWithString:[@"tel://" stringByAppendingString:assistanceNumber]];

    if ([UIApplication.sharedApplication canOpenURL:phoneUrl]) {
        [UIApplication.sharedApplication openURL:phoneUrl];
    } else if ([UIApplication.sharedApplication canOpenURL:phoneFallbackUrl]) {
        [UIApplication.sharedApplication openURL:phoneFallbackUrl];
    } else
    {
        [[[UIAlertView alloc] initWithTitle:@"" message:[NSString stringWithFormat:@"No se ha podido realizar la llamada a través de la aplicación. Puede llamar usted al %@", assistanceNumber] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil] show];
        [_viewEmergency setHidden:YES];
    }

My Info.plist

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