7 Stimmen

Wie kann man feststellen, ob ein Cocoa Touch-Gerät Anrufe tätigen kann?

Mögliches Duplikat:
iOS - Erkennen, ob das Gerät Telefonanrufe unterstützt oder nicht?

Ich schreibe eine iPhone-Anwendung, die eine Schaltfläche zum Anrufen einer Telefonnummer enthält. Ich verwende Code wie den folgenden, um die Nummer mit einer tel: URL auf die übliche Weise:

NSURL* contactTelURL = [NSURL
                        URLWithString:[NSString
                                       stringWithFormat:@"tel:%@",
                                       contactTel]];
[[UIApplication sharedApplication] openURL:contactTelURL];

Auf einem echten iPhone funktioniert es einwandfrei, aber im Simulator erhalte ich nur die Meldung "Unsupported URL". Vermutlich würde das auch auf einem iPod Touch passieren, obwohl ich das nicht getestet habe. Es wäre schön, die Schaltfläche zu entfernen, wenn sie auf einem Gerät ausgeführt wird, das keine Anrufe tätigen wird.

Gibt es eine Möglichkeit, programmatisch zu erkennen, ob ein Cocoa Touch-Gerät telefonieren kann?

40voto

neilkimmett Punkte 837

Von Noah Witherspoon unter Mit meinem iPhone-Programm anrufen

Der Simulator unterstützt viele der URL-Schemata von iOS nicht, darunter die für die Apps Telefon, Karten, Youtube und SMS. Dies gilt auch für Geräte wie den iPod touch und das iPad, die nicht über Telefonfunktionen verfügen. Bevor Sie ein URL-Schema über -openURL: verwenden, sollten Sie prüfen, ob dieses Schema von -canOpenURL: unterstützt wird, das YES oder NO zurückgibt, je nachdem, ob das aktuelle Gerät das verwendete URL-Schema unterstützt

Also Anfrage [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]] um herauszufinden, ob das Gerät Anrufe tätigen kann.

1 Stimmen

Das ist die richtige Antwort für mich. Es sollte immer -[UIApplication canOpenURL] prüfen, bevor -[UIApplication openURL] aufgerufen wird.

0 Stimmen

Auf meinem iPad 2 mit iOS8.1 wird TRUE zurückgegeben. Auf dem 8.1-Simulator, jedoch, es ist FALSE zurück. Also funktioniert dies nicht auf dem tatsächlichen Gerät.

0 Stimmen

Vielleicht hat das etwas mit der Kontinuitätsfunktion in iOS 8 zu tun?

7voto

Kriem Punkte 8623

Desde iphonedevelopment.blogspot.com

#import <sys/utsname.h>

enum {
    MODEL_IPHONE_SIMULATOR,
    MODEL_IPOD_TOUCH,
    MODEL_IPHONE,
    MODEL_IPHONE_3G
};

@interface DeviceDetection : NSObject

+ (uint) detectDevice;
+ (NSString *) returnDeviceName:(BOOL)ignoreSimulator;

@end

@implementation DeviceDetection

+ (uint) detectDevice {
    NSString *model= [[UIDevice currentDevice] model];

    // Some iPod Touch return "iPod Touch", others just "iPod"

    NSString *iPodTouch = @"iPod Touch";
    NSString *iPodTouchLowerCase = @"iPod touch";
    NSString *iPodTouchShort = @"iPod";

    NSString *iPhoneSimulator = @"iPhone Simulator";

    uint detected;

    if ([model compare:iPhoneSimulator] == NSOrderedSame) {
        // iPhone simulator
        detected = MODEL_IPHONE_SIMULATOR;
    } else if ([model compare:iPodTouch] == NSOrderedSame) {
        // iPod Touch
        detected = MODEL_IPOD_TOUCH;
    } else if ([model compare:iPodTouchLowerCase] == NSOrderedSame) {
        // iPod Touch
        detected = MODEL_IPOD_TOUCH;
    } else if ([model compare:iPodTouchShort] == NSOrderedSame) {
        // iPod Touch
        detected = MODEL_IPOD_TOUCH;
    } else {
        // Could be an iPhone V1 or iPhone 3G (model should be "iPhone")
        struct utsname u;

        // u.machine could be "i386" for the simulator, "iPod1,1" on iPod Touch, "iPhone1,1" on iPhone V1 & "iPhone1,2" on iPhone3G

        uname(&u);

        if (!strcmp(u.machine, "iPhone1,1")) {
            detected = MODEL_IPHONE;
        } else {
            detected = MODEL_IPHONE_3G;
        }
    }
    return detected;
}

+ (NSString *) returnDeviceName:(BOOL)ignoreSimulator {
    NSString *returnValue = @"Unknown";

    switch ([DeviceDetection detectDevice]) {
        case MODEL_IPHONE_SIMULATOR:
            if (ignoreSimulator) {
                returnValue = @"iPhone 3G";
            } else {
                returnValue = @"iPhone Simulator";
            }
            break;
        case MODEL_IPOD_TOUCH:
            returnValue = @"iPod Touch";
            break;
        case MODEL_IPHONE:
            returnValue = @"iPhone";
            break;
        case MODEL_IPHONE_3G:
            returnValue = @"iPhone 3G";
            break;
        default:
            break;
    }        
    return returnValue;
}

@end

0voto

Josh Peak Punkte 4948

Hier ist ein einfaches Codeschnipsel, mit dem ich prüfe, ob es sich bei dem Gerätemodell um ein Telefon und nicht um einen Simulator handelt, um sicherzustellen, dass es Anrufe tätigen kann.

if ([[[UIDevice currentDevice] model] rangeOfString:@"Phone"].location != NSNotFound &&
    [[[UIDevice currentDevice] model] rangeOfString:@"Simulator"].location == NSNotFound ) {
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel:%@", number]  ] ];
}

-1voto

henning77 Punkte 3804

Sie könnten abfragen [[UIDevice currentDevice] model] und prüfen Sie, ob es sich um ein iPhone handelt.

5 Stimmen

Dies ist nicht die bevorzugte Lösung. Sie sollten prüfen, welche Fähigkeiten das Gerät hat, anstatt für ein bestimmtes Modell zu testen. Siehe die Antwort von neilkimmett.

0 Stimmen

Dies ist die falsche Antwort, diese Frage ist ein Duplikat, und die richtige Antwort finden Sie hier: stackoverflow.com/questions/5094928/

0 Stimmen

Dies sagt nichts darüber aus, ob das Gerät einen Anruf tätigen kann (d. h. ob es eine SIM-Karte hat, sich in einem Netz befindet usw.)

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