ios - 활성화하려면 - 아이폰8 통화실패




기기가 전화 통화를 지원하는지 여부를 감지합니까? (6)

@ TheGuardian의 답을 바탕으로, 이것은 더 간단한 접근법이라고 생각합니다 :

   private final func canMakePhoneCall() -> Bool {
       guard UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Phone else {
        return false
       }

       let mobileNetworkCode = CTTelephonyNetworkInfo().subscriberCellularProvider?.mobileNetworkCode
       let isInvalidNetworkCode = mobileNetworkCode == nil || mobileNetworkCode?.characters.count <= 0
                                                        || mobileNetworkCode == "65535"
                                                        //When sim card is removed, the Code is 65535

       return !isInvalidNetworkCode
    }

장치가 전화 통화를 지원할 수 있는지 여부를 결정하는 데 사용할 수있는 아래 코드는 신뢰할 수 있습니까? 내 관심은 애플이 아이폰 문자열을 다른 것으로 바꾼다면 "아이폰 3g", "아이폰 4"등이 있다고 가정 해 봅시다.

[[UIDevice currentDevice].model isEqualToString:@"iPhone"]

iPhone은 tel : // URI 스키마를 지원합니다. 그래서 당신은 사용할 수 있습니다 :

[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]];

canOpenURL : URL이 올바른 것이 아니라 해당 URL 스키마를 열 수있는 응용 프로그램이 있는지 여부를 명시 적으로 확인합니다. 따라서 전화 번호가 지정되지 않아도 상관 없습니다. 이 메서드는 BOOL을 반환하므로 YES 또는 NO를 확인합니다.

전화를 걸 수있는 신청서가 있는지 여부를 문자 그대로 대답해야합니다. 따라서 장치 세분화의 향후 변경 사항에 대해서는 괜찮을 것입니다.


기기가 전화 통화를 "지원"하는지 확인하는 것만으로도 성취하고자하는 바에 따라 물건을 이동하는 가장 좋은 방법이 아닐 수도 있습니다. 믿거 나 말거나, 아이팟 터치처럼 오래된 아이폰을 서비스없이 사용합니다. 때때로 사람들은 iPhone에 SIM 카드가 설치되어 있지 않습니다. 내 앱에서 사용자 기기가 가능하다면 전화 번호를 걸기를 원했고 그렇지 않으면 전화 번호를 표시하고 사용자가 전화를 걸어 전화를 걸라고 요청했습니다. 지금까지 제가 해왔 던 해결책이 있습니다. 자유롭게 의견을 말하고 개선하십시오.

// You must add the CoreTelephony.framework
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <CoreTelephony/CTCarrier.h>

-(bool)canDevicePlaceAPhoneCall {
    /*

     Returns YES if the device can place a phone call

     */

    // Check if the device can place a phone call
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]]) {
        // Device supports phone calls, lets confirm it can place one right now
        CTTelephonyNetworkInfo *netInfo = [[[CTTelephonyNetworkInfo alloc] init] autorelease];
        CTCarrier *carrier = [netInfo subscriberCellularProvider];
        NSString *mnc = [carrier mobileNetworkCode]; 
        if (([mnc length] == 0) || ([mnc isEqualToString:@"65535"])) {
            // Device cannot place a call at this time.  SIM might be removed.
            return NO;
        } else {
            // Device can place a phone call
            return YES;
        }
    } else {
        // Device does not support phone calls
        return  NO;
    }
}

MobileNetworkCode가 65535인지 확인합니다. 내 테스트에서 SIM 카드를 제거하면 mobileNetworkCode가 65535로 설정됩니다. 그 이유는 100 % 확실하지 않습니다.


나는 그것이 일반적으로 생각한다. 더 일반적인 문자열 비교 (향후 업데이트의 경우 더 안전 할 것입니다)를 위해 갈 것입니다. 나는 문제없이 그것을 사용했다. (지금까지 ...).

장치에서 실제로 전화를 걸 수 있는지 여부를보다 확실하게 확인하려면 Core Telephony API를 활용해야합니다. CTCarrier 클래스는 특정 순간에 실제로 전화를 걸 수 있는지 여부를 알려줍니다.


앞으로는 장치 이름이 바뀔 수 있으므로 귀하의 방법이 신뢰할 수 있다고 생각하지 않습니다. 앱이 iPhone 이외의 장치에서 실행되는 것을 방지하려면 Info.plist의 UIRequiredDeviceCapabilities 사전에 '전화 통신'을 추가하십시오. 그러면 앱 스토어에서 앱을 다운로드하기 위해 iPhone 이외의 다른 장치를 사용할 수 없게됩니다.

또는 필요한 순간에 3G 연결을 확인하는 것이 필요한 경우 Apple의 Reachability 유틸리티 클래스를 사용하여 현재 3G / WIFI 연결 상태에 대해 문의 할 수 있습니다.


UIApplication.shared.openURL((URL(string: "tel://\(phoneNumber)")!)) 은 SIM이 있는지 여부를 말하지 않습니다. 예를 들면 : SIM을 가지고 있거나 가지지 않는 아이폰은 사실로 돌아갈 것이지만, 아이팟 터치에서는 항상 false를 반환합니다. ipad에 sim 옵션이 없으면 false를 반환합니다.

모든 것을 종합적으로 검사하는 코드가 있습니다! (스위프트 3.0 사용)

if UIApplication.shared.canOpenURL(URL(string: "tel://\(phoneNumber)")!) {
            var networkInfo = CTTelephonyNetworkInfo()
            var carrier: CTCarrier? = networkInfo.subscriberCellularProvider
            var code: String? = carrier?.mobileNetworkCode
            if (code != nil) {
                UIApplication.shared.openURL((URL(string: "tel://\(phoneNumber)")!))
            }
            else {
                var alert = UIAlertView(title: "Alert", message: "No SIM Inserted", delegate: nil, cancelButtonTitle: "ok", otherButtonTitles: "")
                alert.show()
            }
        }
        else {
            var alert = UIAlertView(title: "Alert", message: "Device does not support phone calls.", delegate: nil, cancelButtonTitle: "ok", otherButtonTitles: "")
            alert.show()
        }

이 방법으로, 우리는 장치가 호출을 지원하는지 여부를 확인할 수 있습니다.





phone-call