47 votes

iOS - Détecter si le périphérique prend en charge les appels téléphoniques?

Le code ci-dessous est-il fiable pour déterminer si un appareil peut prendre en charge les appels téléphoniques ou non? Mon souci est que si apple change la chaîne iphone en autre chose, disons qu'ils décident de choisir "iphone 3g", "iphone 4", etc.

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

100voto

Tommy Points 56749

L'iPhone prend en charge le tel:// schéma d'URI. De sorte que vous pouvez utiliser:

[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]];

canOpenURL: explicitement vérifie si il y a une application capable de l'ouverture de ce schéma d'URL, pas que l'URL est correcte. Donc, il n'est pas question qu'aucun numéro de téléphone n'est spécifié. La méthode renvoie un BOOL, vérifiez donc que par OUI ou NON.

Qui devrait littéralement réponse si il n'y a aucune demande de présenter capable de faire un appel téléphonique. Donc, il devrait être correct contre toute modification ultérieure dans le dispositif de segmentation.

64voto

AlBeebe Points 3273

Simplement vérifier si un dispositif de "soutien" des appels téléphoniques peut-être pas la meilleure façon de faire les choses en fonction de ce que vous essayez d'accomplir. Croyez le ou non, certaines personnes utilisent les vieux iPhones sans service comme si ils étaient un iPod Touch. Parfois, les gens n'ont pas de cartes SIM installée dans leurs iPhones. Dans mon application, j'ai voulu composer un numéro de téléphone si les utilisateurs de l'appareil a pu, sinon, je voulais afficher le numéro de téléphone et invite l'utilisateur à saisir un téléphone à composer. Voici une solution je suis venu avec qui a travaillé jusqu'à présent. N'hésitez pas à commenter et à l'améliorer.

// You must add the CoreTelephony.framework
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <CoreTelephony/CTCarrier.h>

-(bool)canDevicePlaceAPhoneCall {
    /*

     Returns YES if the device can place a phone call

     */

    // Check if the device can place a phone call
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]]) {
        // Device supports phone calls, lets confirm it can place one right now
        CTTelephonyNetworkInfo *netInfo = [[[CTTelephonyNetworkInfo alloc] init] autorelease];
        CTCarrier *carrier = [netInfo subscriberCellularProvider];
        NSString *mnc = [carrier mobileNetworkCode]; 
        if (([mnc length] == 0) || ([mnc isEqualToString:@"65535"])) {
            // Device cannot place a call at this time.  SIM might be removed.
            return NO;
        } else {
            // Device can place a phone call
            return YES;
        }
    } else {
        // Device does not support phone calls
        return  NO;
    }
}

Vous remarquerez que je vérifie si les mobileNetworkCode est de 65535. Dans mes tests, il semble que lorsque vous retirez la carte SIM, puis les mobileNetworkCode est fixé à 65 535. Pas sûr à 100% pourquoi.

2voto

Nick Toumpelis Points 1755

Je pense que c'est généralement le cas. J'irais pour une comparaison de chaîne plus générique (juste pour être plus sûr dans le cas d'une future mise à jour). Je l'ai utilisé sans aucun problème (jusqu'à présent ...).

Si vous souhaitez être plus sûr de savoir si le périphérique peut réellement passer des appels, vous devez également tirer parti de l'API Core Telephony. La classe CTCarrier peut vous dire si vous pouvez passer un appel à un moment donné.

2voto

Julio Gorgé Points 8061

Je ne pense pas que votre méthode est fiable, que les noms de périphériques peuvent changer dans le futur. Si votre souci est d'empêcher l'application de s'exécuter sur la non-appareils iPhone, vous pouvez ajouter de la "téléphonie" à la UIRequiredDeviceCapabilities dictionnaire dans votre Info.plist. Qui empêche d'autres appareils que l'iPhone à télécharger votre application sur l'App Store.

Alternativement, si ce que vous avez besoin est la vérification de la connectivité 3G, à un moment donné, vous pouvez utiliser Apple Accessibilité classe utilitaire pour demander actuelles de la connexion 3G/WIFI, du statut.

0voto

J'ai ré-implémenté la même chose pour iOS8 de cette façon

1.Téléchargez le code exemple https://developer.apple.com/library/ios/samplecode/reachability/introduction/intro.html

2.Copiez l'accessibilité.h et l'accessibilité.m dans votre projet

  1. #import<Reachability.h>

4.utiliser ce code

 Reachability *reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];

NetworkStatus status = [reachability currentReachabilityStatus];

 if (status == ReachableViaWiFi)
{
    //No Sim
}
else if (status == ReachableViaWWAN) 
{
     //Sim
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber]];

}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X