web-dev-qa-db-fra.com

Obtenir l'ID de l'appareil ou l'adresse Mac dans iOS

J'ai une application qui utilise Reste pour communiquer avec un serveur, je voudrais obtenir l'adresse IP ou l'adresse IP de l'iPhone pour la validation de l'unicité, comment procéder?

29
Daniel

[[UIDevice currentDevice] uniqueIdentifier] est garanti comme étant unique pour chaque appareil.

41
Steven Canfield

uniqueIdentifier (obsolète dans iOS 5.0. Au lieu de cela, créez un identifiant unique spécifique à votre application.)

Les documents recommandent l'utilisation de CFUUIDCreate au lieu de [[UIDevice currentDevice] uniqueIdentifier]

Voici donc comment générer un identifiant unique dans votre application

CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
NSString *uuidString = (NSString *)CFUUIDCreateString(NULL,uuidRef);

CFRelease(uuidRef);

Notez que vous devez enregistrer l'uuidString dans les valeurs par défaut de l'utilisateur ou à un autre endroit car vous ne pouvez pas générer à nouveau le même uuidString.

Vous pouvez utiliser IPasteboard pour stocker votre uuid généré. Et si l'application est supprimée et réinstallée, vous pouvez lire depuis UIPasteboard l'ancien uuid. Le panneau de pâte sera effacé lorsque l'appareil sera effacé.

Dans iOS 6, ils ont introduit la NSUUID Class qui est conçue pour créer des chaînes d'UUID

Ils ont également ajouté dans iOS 6 @property(nonatomic, readonly, retain) NSUUID *identifierForVendor à la classe IDevice

La valeur de cette propriété est la même pour les applications provenant du même fournisseur et exécutées sur le même appareil. Une valeur différente est renvoyée pour les applications sur le même appareil qui proviennent de différents fournisseurs, et pour les applications sur différents appareils quel que soit le fournisseur.

La valeur de cette propriété peut être nulle si l'application s'exécute en arrière-plan, avant que l'utilisateur n'ait déverrouillé l'appareil la première fois après le redémarrage de l'appareil. Si la valeur est nulle, attendez et récupérez-la plus tard.

Dans iOS 6, vous pouvez également utiliser la classe ASIdentifierManager d'AdSupport.framework. Voilà

@property(nonatomic, readonly) NSUUID *advertisingIdentifier

Discussion Contrairement à la propriété identifierForVendor de l'UIDevice, la même valeur est renvoyée à tous les fournisseurs. Cet identifiant peut changer, par exemple si l'utilisateur efface le périphérique, vous ne devez donc pas le mettre en cache.

La valeur de cette propriété peut être nulle si l'application s'exécute en arrière-plan, avant que l'utilisateur n'ait déverrouillé l'appareil la première fois après le redémarrage de l'appareil. Si la valeur est nulle, attendez et récupérez-la plus tard.

Éditer:

Faites attention que le advertisingIdentifier puisse retourner

00000000-0000-0000-0000-000000000000

car il semble y avoir un bug dans iOS. Question connexe: Le advertisingIdentifier et l'identificateurForVendor renvoient "00000000-0000-0000-0000-000000000000"

40
Alex Terente

Pour une adresse Mac, vous pouvez utiliser

#import <Foundation/Foundation.h>

@interface MacAddressHelper : NSObject

+ (NSString *)getMacAddress;

@end

la mise en oeuvre

#import "MacAddressHelper.h"
#import <sys/socket.h>
#import <sys/sysctl.h>
#import <net/if.h>
#import <net/if_dl.h>

@implementation MacAddressHelper

+ (NSString *)getMacAddress
{
  int                 mgmtInfoBase[6];
  char                *msgBuffer = NULL;
  size_t              length;
  unsigned char       macAddress[6];
  struct if_msghdr    *interfaceMsgStruct;
  struct sockaddr_dl  *socketStruct;
  NSString            *errorFlag = NULL;

  // Setup the management Information Base (mib)
  mgmtInfoBase[0] = CTL_NET;        // Request network subsystem
  mgmtInfoBase[1] = AF_ROUTE;       // Routing table info
  mgmtInfoBase[2] = 0;              
  mgmtInfoBase[3] = AF_LINK;        // Request link layer information
  mgmtInfoBase[4] = NET_RT_IFLIST;  // Request all configured interfaces

  // With all configured interfaces requested, get handle index
  if ((mgmtInfoBase[5] = if_nametoindex("en0")) == 0) 
    errorFlag = @"if_nametoindex failure";
  else
  {
    // Get the size of the data available (store in len)
    if (sysctl(mgmtInfoBase, 6, NULL, &length, NULL, 0) < 0) 
      errorFlag = @"sysctl mgmtInfoBase failure";
    else
    {
      // Alloc memory based on above call
      if ((msgBuffer = malloc(length)) == NULL)
        errorFlag = @"buffer allocation failure";
      else
      {
        // Get system information, store in buffer
        if (sysctl(mgmtInfoBase, 6, msgBuffer, &length, NULL, 0) < 0)
          errorFlag = @"sysctl msgBuffer failure";
      }
    }
  }
  // Befor going any further...
  if (errorFlag != NULL)
  {
    NSLog(@"Error: %@", errorFlag);
    return errorFlag;
  }
  // Map msgbuffer to interface message structure
  interfaceMsgStruct = (struct if_msghdr *) msgBuffer;
  // Map to link-level socket structure
  socketStruct = (struct sockaddr_dl *) (interfaceMsgStruct + 1);  
  // Copy link layer address data in socket structure to an array
  memcpy(&macAddress, socketStruct->sdl_data + socketStruct->sdl_nlen, 6);  
  // Read from char array into a string object, into traditional Mac address format
  NSString *macAddressString = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", 
                                macAddress[0], macAddress[1], macAddress[2], 
                                macAddress[3], macAddress[4], macAddress[5]];
  //NSLog(@"Mac Address: %@", macAddressString);  
  // Release the buffer memory
  free(msgBuffer);
  return macAddressString;
}

@end

Utilisation:

NSLog(@"MAC address: %@",[MacAddressHelper getMacAddress]);
19
Blazer

Utilisez ceci:

NSUUID *id = [[UIDevice currentDevice] identifierForVendor];
NSLog(@"ID: %@", id);
5
Alexander Volkov

Dans IOS 5 [[UIDevice currentDevice] uniqueIdentifier] est obsolète.

Il vaut mieux utiliser -identifierForVendor ou -identifierForAdvertising.

De nombreuses informations utiles peuvent être trouvées ici:

iOS6 UDID - Quels sont les avantages d’identifierForVendor par rapport à identifierForAdvertising?

4
Andrey