2009-05-24 1 views
7

Можно создать дубликат:
iOS - Detecting whether or not device support phone calls?Как узнать, может ли Cocoa Touch устройство звонить?

Я пишу приложение iPhone, которое обеспечивает кнопку для вызова номера телефона. Я использую подобный код, чтобы набрать номер, используя tel: URL обычного способа:

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

Он отлично работает на реальный iPhone, но я просто получить уведомление, давали «URL НЕПОДДЕРЖИВАЕМОМУ» в тренажере. Предположительно, это также произойдет на iPod Touch, хотя я не тестировал это. Было бы неплохо удалить кнопку при запуске на устройстве, которое не будет звонить.

Есть ли способ автоматически определить, может ли устройство Touch Cocoa совершать телефонные звонки?

ответ

-1

Вы можете запросить [[UIDevice currentDevice] model] и проверить, является ли это iPhone.

+5

Это не предпочтительное решение. Вы должны проверить, какие возможности у устройства есть, а не тестировать определенную модель. См. Ответ Ниилкимметта. –

+0

Это неправильный ответ, этот вопрос является дубликатом, и правильный ответ предоставляется здесь: http://stackoverflow.com/questions/5094928/ios-detecting-whether-or-not-device-support-phone-calls –

+0

Это не говорит вам, может ли устройство совершать вызов (т. Е. У него есть SIM-карта, есть в сети и т. Д.) – ToddB

7

От 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

От Ноа Уизерспун в Make a call from my iPhone application

тренажер не поддерживает много схем URL IOS, в том числе тех, для телефона, Карты, YouTube и SMS-приложений , Это также относится к устройствам, таким как iPod touch и iPad, которые не имеют возможности телефона; Перед использованием любой схемы URL через -openURL :, вы должны проверить поддержку для этой схемы с использованием -canOpenURL :, которая возвращает YES или NO в зависимости от того, поддерживает ли текущее устройство схему URL, который вы используете

So запрос [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]] , чтобы узнать, может ли устройство совершать вызовы.

+1

Это правильный ответ для меня. Он всегда должен проверять - [UIApplication canOpenURL] перед вызовом - [UIApplication openURL] –

+0

Это возвращает TRUE на моем iPad 2 под управлением iOS8.1. Однако на симуляторе 8.1 он возвращает FALSE. Так что это не работает на самом устройстве. – Alex

+0

Возможно, что-то связано с функцией непрерывности, добавленной в iOS 8? – Scott

0

Вот простой фрагмент кода, который я использую для проверки модели устройства - это телефон, а не симулятор, чтобы он мог совершать звонки.

if ([[[UIDevice currentDevice] model] rangeOfString:@"Phone"].location != NSNotFound && 
    [[[UIDevice currentDevice] model] rangeOfString:@"Simulator"].location == NSNotFound) { 
      [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel:%@", number] ] ]; 
} 
Смежные вопросы