49 Stimmen

Erkennen, ob das Gerät Telefonanrufe unterstützt oder nicht?

Ist der folgende Code zuverlässig, um festzustellen, ob ein Gerät Telefongespräche unterstützen kann oder nicht? Meine Sorge ist, wenn Apple die iphone Zeichenfolge in etwas anderes ändert, sagen wir, sie beschließen, "iphone 3g", "iphone 4" usw. zu haben.

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

2voto

Nick Toumpelis Punkte 2708

Ich denke, dass dies im Allgemeinen der Fall ist. Ich würde mich für einen allgemeineren String-Vergleich entscheiden (nur um im Falle eines zukünftigen Updates sicherer zu sein). Ich habe es ohne Probleme verwendet (bis jetzt...).

Wenn Sie mehr Gewissheit darüber haben wollen, ob das Gerät tatsächlich Anrufe tätigen kann, sollten Sie auch die Vorteile der Core Telephony API nutzen. Die Klasse CTCarrier kann Ihnen sagen, ob Sie zu einem bestimmten Zeitpunkt tatsächlich einen Anruf tätigen können.

2voto

Diese UIApplication.shared.openURL((URL(string: "tel://\(phoneNumber)")!)) sagt nicht, ob es eine SIM-Karte hat oder nicht, sondern nur, ob das Gerät die Möglichkeit hat, einen Anruf zu tätigen. Zum Beispiel : Bei einem iPhone mit oder ohne SIM wird true zurückgegeben, aber bei einem iPod Touch wird immer false zurückgegeben, genauso wie bei einem iPad, das keine SIM-Option hat, false zurückgegeben wird.

Hier ist der Code, der alles umfassend überprüft! (Verwendung von Swift 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()
        }

Auf diese Weise können wir sicherstellen, dass das Gerät Anrufe unterstützt oder nicht.

0voto

Anton Tropashko Punkte 4907

Für den Fall, dass Sie eine Telefonnummer anrufen möchten, um zu zeigen einen Fehler auf Geräten, die keine Telefonie haben:

void openURL(NSURL *url, void (^ __nullable completionHandler). (BOOL success))
{
    if (@available(iOS 10.0, *)) {
        [application openURL:url options:@{} completionHandler:^(BOOL success) {
            completionHandler(success);
        }];
    } else
    {
        if([application openURL:url]) {
            completionHandler(YES);
        } else {
            completionHandler(NO);
        }
    }
}

Verwendung

        p97openURL(phoneURL, ^(BOOL success) {
            if(!success) {
                  show message saying there is no telephony on device

            }
        }

-1voto

user1107173 Punkte 9776

Ausgehend von der Antwort von @TheGuardian denke ich, dass dies ein einfacherer Ansatz sein könnte:

   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
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X