ios - lsapplicationqueriesschemes - CanOpenURL falla para esquemas de URL de todo el sistema
url scheme ios (7)
Estoy ejecutando iOS 9b5.
En mi aplicación, si un dispositivo puede hacer una llamada telefónica, quiero que el color del texto aparezca en azul para que se pueda cambiar. Si no, lo dejo negro.
Para determinar las capacidades del dispositivo, uso:
[[UIApplcation sharedApplication] canOpenURL:@"telprompt://5555555555"]
Como todos sabemos, iOS 9 requiere que incluyamos en la lista blanca cualquier esquema de URL que usaremos en nuestra aplicación como medida de privacidad.
Tengo esto en mi lista de información:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>telprompt</string>
</array>
No importa lo que haga, todavía puedo obtener canOpenURL: error en la URL: "telprompt: //" - error: "(nulo)". He intentado tel: // y sms: // y parece que no puedo evitar esa advertencia de syslog.
¿Alguien sabe de una manera de detectar si un dispositivo puede o no hacer una llamada telefónica sin activar estas advertencias?
Como iOS9 desaprueba stringByAddingPercentEscapesUsingEncoding, se puede usar lo siguiente para limpiar el telprompt: URL.
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];
}
Creo que deberías intentar esto en un dispositivo real, o simplemente intentarlo de nuevo. Acabo de hacer que funcione en mi iPhone 5, parece que ni siquiera necesitas agregarlo a LSApplicationQueriesSchemes. Si la aplicación está construida con Xcode 7 Beta 6 y usa canOpenURL o openURL como a continuación, parece funcionar bien en el dispositivo.
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel:555-555-5555"]]
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:555-555-5555"]]
En el sim de iOS todavía me sale el error:
LaunchServices: ERROR: No hay un controlador registrado para el esquema de URL tel
-canOpenURL: error de URL: "tel: 555-555-5555" - error: "Esta aplicación no tiene permiso para consultar el esquema de teléfono"
En iOS9 estoy usando este código y funciona:
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];
}
Mi info.plist
<key>LSApplicationQueriesSchemes</key>
<array>
<string>telprompt</string>
<string>tel</string>
</array>
Intente ejecutar esto en un dispositivo real en lugar de simulador. No es necesario agregar LSApplicationQueriesSchemes
para el esquema de tel
.
Lo que descubrí hasta ahora es que si la consola registra -canOpenURL: failed for URL: "xxx://" - error: "(null)"
, en realidad funciona. Tan pronto como haya otro error que no sea null
, puede que no funcione. Si el error es "This app is not allowed to query for scheme xxx"
, entonces debe agregar este esquema a la lista de su aplicación:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>xxx</string>
</array>
Extraño comportamiento de que la salida de la consola parezca un error aunque no haya ninguno, por cierto.
Tengo el mismo error en dispositivos IOS9. Así que he usado el siguiente fragmento de código para evitar este error.
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];
}
prueba este
NSString *phone_number = [[yourPhoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789-+()"] invertedSet]] componentsJoinedByString:@""];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"telprompt://%@", phone_number]]];