TL;DR
iPod touchも含め、iOSデバイスで電話がかけられるかどうかを判別するためには、CoreTelephony.framework
を使う。
今までやっていた方法
let application = UIApplication.sharedApplication()
let canCall: Bool
if let URL = NSURL(string: "tel://") {
canCall = application.canOpenURL(URL)
} else {
canCall = false
}
if canCall {
application.openURL(URL)
} else {
print("can't call")
}
問題点
iPod touchでは判別できない。 (iOS 8, 9両方とも)
解決策
CoreTelephony.framework を使う。
CTCarrier Class Reference - iOS Developer Library
// CTCarrier
var isoCountryCode: String? { get }
The value for this property is nil if any of the following apply:
The device is in Airplane mode.
There is no SIM card in the device.
The device is outside of cellular service range.
isoCaountryCode
がnilの場合、下記のいずれかに該当する
- 機内モード
- SIMカードが入っていない
- 携帯電話サービスの圏外
ドキュメントには書かれていないが、iPod touchの場合、CTCarrier
が取得できず、nil
になっていた。
import CoreTelephony
let netInfo = CTTelephonyNetworkInfo()
let carrier: CTCarrier? = netInfo.subscriberCellularProvider
// SIMカードが挿入されたiPadを除外するために `userInterfaceIdiom` をチェックする
let isPhone: Bool = (UIDevice.currentDevice().userInterfaceIdiom == .Phone)
let canCall: Bool = (carrier?.isoCountryCode != nil) && isPhone
if canCall {
UIApplication.sharedApplication().openURL(URL)
} else {
print("can't call")
}