2009-05-24 7 views
7

Mögliche Duplizieren:
iOS - Detecting whether or not device support phone calls?Wie kann ich feststellen, ob das Cocoa Touch-Gerät Anrufe tätigen kann?

Ich schreibe eine iPhone-Anwendung, die eine Schaltfläche stellt eine Telefonnummer anzurufen. Ich verwende Code wie folgt aus der Nummer zu wählen eine tel: URL in gewohnter Weise mit:

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

Es fein auf einem echten iPhone funktioniert, aber ich nur eine ‚Nicht unterstützte URL‘ Alarm im Simulator bekommen. 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ätigt.

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

Antwort

-1

Sie können [[UIDevice currentDevice] model] abfragen und prüfen, ob es ein iPhone ist.

+5

Dies ist nicht die bevorzugte Lösung. Sie sollten überprüfen, welche Funktionen das Gerät besitzt, anstatt nach einem bestimmten Modell zu suchen. Siehe neilkimmetts Antwort. –

+0

Dies ist die falsche Antwort, diese Frage ist ein Duplikat, und die richtige Antwort wird hier bereitgestellt: http://stackoverflow.com/questions/5094928/ios-detecting-whether-or-not-device-support-phone-calls –

+0

Dies sagt Ihnen nicht, ob das Gerät einen Anruf tätigen kann (dh es hat eine SIM, ist in einem Netzwerk, etc.) – ToddB

7

Von 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 
40

Von Noah Witherspoon bei Make a call from my iPhone application

der Simulator viel iOS URL-Systeme, einschließlich der nicht für das Telefon, Karten, Youtube, und SMS-Anwendungen unterstützen . Dies gilt auch für Geräte wie den iPod touch und das iPad, die keine Telefonfunktionen haben. jedes URL-Schemas über -openURL vor der Verwendung :, sollten Sie -canOpenURL für die Unterstützung prüfen für dieses Schema verwenden :, die JA zurückkehren oder NO je nachdem, ob das aktuelle Gerät des URL-Schema unterstützt sind Sie

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

+1

das ist die richtige Antwort für mich. Es sollte immer überprüft werden - [UIApplication canOpenURL] vor dem Aufruf - [UIApplication openURL] –

+0

Dies ist TRUE auf meinem iPad 2 mit iOS8.1. Auf dem 8.1-Simulator wird jedoch FALSE zurückgegeben. Das funktioniert also nicht am eigentlichen Gerät. – Alex

+0

Vielleicht hat das etwas mit der in iOS 8 hinzugefügten Kontinuitätsfunktion zu tun? – Scott

0

Hier ist ein einfaches Code-Snippet, das ich verwende, um das Gerätemodell zu überprüfen, ist ein Telefon und kein Simulator, 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] ] ]; 
}