2009-05-24 8 views
7

Eventuali duplicati:
iOS - Detecting whether or not device support phone calls?Come sapere se il dispositivo Cocoa Touch può effettuare chiamate?

Sto scrivendo un'applicazione per iPhone che fornisce un pulsante per chiamare un numero di telefono. Sto utilizzando il codice simile al seguente per comporre il numero utilizzando un URL tel: nel solito modo:

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

Funziona bene su un vero e proprio iPhone, ma ho appena ottenere alert un 'non supportato URL' nel simulatore. Presumibilmente ciò avverrebbe anche su un iPod Touch, sebbene non l'abbia provato. Sarebbe bello rimuovere il pulsante quando si esegue su un dispositivo che non effettuerà chiamate.

C'è un modo per rilevare in modo programmatico se un dispositivo Cocoa Touch può effettuare chiamate?

risposta

-1

È possibile richiedere [[UIDevice currentDevice] model] e verificare se si tratta di un iPhone.

+5

Questa non è la soluzione preferita. Dovresti controllare quali funzionalità ha il dispositivo, piuttosto che testare per un modello specifico. Vedi la risposta di neilkimmett. –

+0

Questa è la risposta sbagliata, questa domanda è un duplicato e la risposta giusta è fornita qui: http://stackoverflow.com/questions/5094928/ios-detecting-whether-or-not-device-support-phone-calls –

+0

Questo non ti dice se il dispositivo può effettuare una chiamata (cioè ha una SIM, è in rete, ecc.) – ToddB

7

Da 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

Da Noè Witherspoon a Make a call from my iPhone application

il simulatore non supporta un sacco di schemi URL di iOS, tra cui quelli per il telefono, Maps, YouTube, e le applicazioni SMS . Questo è anche il caso per dispositivi come iPod touch e iPad, che non hanno funzionalità telefoniche; prima di utilizzare qualsiasi schema URL tramite -openURL :, si dovrebbe verificare per il supporto per tale regime usando -canOpenURL :, che restituirà SI o NO a seconda che il dispositivo corrente supporta lo schema URL che si sta utilizzando

Così query [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]] per scoprire se il dispositivo può effettuare chiamate.

+1

questa è la risposta corretta per me. Dovrebbe sempre verificare - [UIApplication canOpenURL] prima di chiamare - [UIApplication openURL] –

+0

Ciò restituisce TRUE sul mio iPad 2 con iOS8.1. Sul simulatore 8.1, tuttavia, restituisce FALSE. Quindi questo non funziona sul dispositivo reale. – Alex

+0

Forse questo ha qualcosa a che fare con la funzionalità di continuità aggiunta in iOS 8? – Scott

0

Ecco un semplice frammento di codice che uso per verificare che il modello del dispositivo sia un telefono e non un simulatore per assicurarsi che possa effettuare chiamate.

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