web-dev-qa-db-ja.com

システム全体のURLスキームでcanOpenURLが失敗する

IOS 9b5を実行しています。

私のアプリでは、デバイスが電話をかけることができる場合、タップ可能なようにテキストを青色にしたいです。そうでない場合は、黒のままにします。

デバイスの機能を判断するために、次を使用します。

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

ご存知のように、iOS 9では、プライバシー対策としてアプリで使用するURLスキームをホワイトリストに登録する必要があります。

Info.plistにこれがあります:

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

何をしても、canOpenURL:は失敗します。URL: "telprompt://"-エラー: "(null)"。 tel://とsms://を試しましたが、syslogの警告は避けられないようです。

デバイスがこれらの警告をトリガーせずに電話をかけることができるかどうかを検出する方法を知っている人はいますか?

25
djibouti33

これまでに発見したことは、コンソールが-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>

実際には何もありませんが、コンソール出力がエラーのように見える奇妙な動作。

9
endowzoner

実際のデバイスでこれを試してみるか、もう一度試してみてください。 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のクエリを許可されていません"

7
Polar Bear

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

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

私のInfo.plist

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

IOS9はstringByAddingPercentEscapesUsingEncodingを非推奨としているため、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];
}
2
Steve Forbes

これをシミュレータではなく実際のデバイスで実行してみてください。 LSApplicationQueriesSchemesスキームにtelを追加する必要はありません。

1
maxkonovalov

これを試してください:

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