Ошибка 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.
Кто-нибудь знает, как определить, может ли устройство позвонить по телефону без запуска этих предупреждений?
Ответы
Ответ 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>