wake-up-neo.com

canOpenURL schlägt für systemweite URL-Schemas fehl

Ich verwende iOS 9b5.

Wenn ein Gerät in meiner App einen Anruf tätigen kann, möchte ich den Text blau färben, damit er anklappbar ist. Wenn nicht, lasse ich es schwarz.

Um die Gerätefunktionen zu ermitteln, verwende ich:

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

Wie wir alle wissen, setzt iOS 9 voraus, dass wir alle URL-Schemata, die wir in unserer App verwenden, als Datenschutzmaßnahme aufführen.

Ich habe dies in meiner Info.plist:

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

Egal was ich mache, ich bekomme trotzdem canOpenURL: Fehler bei URL: "telprompt: //" - Fehler: "(null)". Ich habe tel: // und sms: // ausprobiert und ich kann diese Syslog-Warnung nicht vermeiden.

Kennt jemand eine Möglichkeit, zu erkennen, ob ein Gerät einen Anruf tätigen kann, ohne diese Warnungen auszulösen?

25
djibouti33

Was ich bisher entdeckt habe ist, dass die Konsole tatsächlich funktioniert, wenn sie -canOpenURL: failed for URL: "xxx://" - error: "(null)" protokolliert. Sobald ein anderer Fehler als null auftritt, funktioniert er möglicherweise nicht. Wenn der Fehler "This app is not allowed to query for scheme xxx" ist, müssen Sie dieses Schema zur .plist Ihrer App hinzufügen:

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

Seltsames Verhalten, dass die Konsolenausgabe wie ein Fehler aussieht, obwohl es tatsächlich keinen gibt.

9
endowzoner

Ich denke, Sie müssen dies möglicherweise auf einem tatsächlichen Gerät versuchen oder es einfach noch einmal versuchen. Ich habe das gerade auf meinem iPhone 5 zum Laufen gebracht, es scheint, dass Sie es nicht einmal zu den LSApplicationQueriesSchemes hinzufügen müssen. Wenn die App mit Xcode 7 Beta 6 erstellt wurde und Sie canOpenURL oder openURL wie unten verwenden, scheint es auf dem Gerät gut zu funktionieren. 

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

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

Auf der iOS-SIM bekomme ich immer noch den Fehler:
LaunchServices: FEHLER: Es ist kein registrierter Handler für das URL-Schema tel registriert
- canOpenURL: Fehler bei URL: "tel: 555-555-5555" - Fehler: "Diese App darf das Schema tel nicht abfragen"

7
Polar Bear

Ich habe den gleichen Fehler bei IOS9-Geräten erhalten. Daher habe ich den folgenden Code-Ausschnitt verwendet, um diesen Fehler zu vermeiden.

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];
}
5
Anooj VM

In iOS9 verwende ich diesen Code und es funktioniert: 

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];
    }

Meine Info.plist

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

Da iOS9 stringByAddingPercentEscapesUsingEncoding nicht mehr unterstützt, kann Folgendes zum Löschen des Telprompt verwendet werden: 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];
}
2
Steve Forbes

probier diese:

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

Versuchen Sie, dies auf einem echten Gerät anstelle eines Simulators auszuführen. Sie müssen keine LSApplicationQueriesSchemes für das tel-Schema hinzufügen.

0
maxkonovalov