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の警告は避けられないようです。
デバイスがこれらの警告をトリガーせずに電話をかけることができるかどうかを検出する方法を知っている人はいますか?
これまでに発見したことは、コンソールが-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>
実際には何もありませんが、コンソール出力がエラーのように見える奇妙な動作。
実際のデバイスでこれを試してみるか、もう一度試してみてください。 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のクエリを許可されていません"
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];
}
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>
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];
}
これをシミュレータではなく実際のデバイスで実行してみてください。 LSApplicationQueriesSchemes
スキームにtel
を追加する必要はありません。
これを試してください:
NSString *phone_number = [[yourPhoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789-+()"] invertedSet]] componentsJoinedByString:@""];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"telprompt://%@", phone_number]]];