Получение идентификатора устройства или адреса Mac в iOS

У меня есть приложение, которое использует отдых для связи с сервером, я хотел бы получить iphones либо MAC-адрес, либо идентификатор устройства для проверки уникальности, как это можно сделать?

Ответ 1

[[UIDevice currentDevice] uniqueIdentifier] гарантированно будет уникальным для каждого устройства.

Ответ 2

uniqueIdentifier (устарел в iOS 5.0, вместо этого создайте уникальный идентификатор, специфичный для вашего приложения.)

Документы рекомендуют использовать CFUUIDCreate вместо [[UIDevice currentDevice] uniqueIdentifier]

Итак, вот как вы создаете уникальный идентификатор в своем приложении

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

CFRelease(uuidRef);

Обратите внимание, что вы должны сохранить uuidString в настройках по умолчанию или в другом месте, потому что вы не можете снова создать ту же uuidString.

Вы можете использовать UIPasteboard для хранения вашего сгенерированного uuid. И если приложение будет удалено и переустановлено, вы можете прочитать из UIPasteboard старый uuid. Плата пасты будет уничтожена, когда устройство будет удалено.

В iOS 6 они внедрили класс NSUUID, который предназначен для создания строк UUID

Также они добавили в iOS 6 @property(nonatomic, readonly, retain) NSUUID *identifierForVendor в UIDevice class

Значение этого свойства одинаково для приложений, которые поступают из тот же самый поставщик работает на одном устройстве. Возвращается другое значение для приложений на том же устройстве, что и у разных поставщиков, и для приложений на разных устройствах независимо от поставщика.

Значение этого свойства может быть nil, если приложение запущено в перед тем, как пользователь разблокирует устройство в первый раз после перезапуска устройства. Если значение равно нулю, подождите и получите значение снова позже.

Также в iOS 6 вы можете использовать ASIdentifierManager класс из AdSupport.framework. Там вы

@property(nonatomic, readonly) NSUUID *advertisingIdentifier

Обсуждение В отличие от свойства identifierForVendor UIDevice, то же самое значение возвращается всем поставщикам. Этот идентификатор может изменить, например, если пользователь стирает устройство, поэтому вы не должны кешируйте его.

Значение этого свойства может быть nil, если приложение запущено в перед тем, как пользователь разблокирует устройство в первый раз после перезапуска устройства. Если значение равно нулю, подождите и получите значение снова позже.

Edit:

Обратите внимание, что advertisingIdentifier может вернуться

00000000-0000-0000-0000-000000000000

потому что, похоже, ошибка в iOS. Связанный с этим вопрос: Идентификатор рекламы и идентификаторForVendor return " 00000000-0000-0000-0000-000000000000

Ответ 3

Для адреса Mac вы можете использовать

#import <Foundation/Foundation.h>

@interface MacAddressHelper : NSObject

+ (NSString *)getMacAddress;

@end

implentation

#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

Использование:

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

Ответ 4

Используйте это:

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

Ответ 6

Здесь мы можем найти адрес mac для устройства IOS, используя код Asp.net С#...

.aspx.cs

-
 var UserDeviceInfo = HttpContext.Current.Request.UserAgent.ToLower(); // User Iphone/Ipad Info.

var UserMacAdd = HttpContext.Current.Request.UserHostAddress;         // User Iphone/Ipad Mac Address



  GetMacAddressfromIP macadd = new GetMacAddressfromIP();
        if (UserDeviceInfo.Contains("iphone;"))
        {
            // iPhone                
            Label1.Text = UserDeviceInfo;
            Label2.Text = UserMacAdd;
            string Getmac = macadd.GetMacAddress(UserMacAdd);
            Label3.Text = Getmac;
        }
        else if (UserDeviceInfo.Contains("ipad;"))
        {
            // iPad
            Label1.Text = UserDeviceInfo;
            Label2.Text = UserMacAdd;
            string Getmac = macadd.GetMacAddress(UserMacAdd);
            Label3.Text = Getmac;
        }
        else
        {
            Label1.Text = UserDeviceInfo;
            Label2.Text = UserMacAdd;
            string Getmac = macadd.GetMacAddress(UserMacAdd);
            Label3.Text = Getmac;
        }

.class File

public string GetMacAddress(string ipAddress)
    {
        string macAddress = string.Empty;
        if (!IsHostAccessible(ipAddress)) return null;

        try
        {
            ProcessStartInfo processStartInfo = new ProcessStartInfo();

            Process process = new Process();

            processStartInfo.FileName = "arp";

            processStartInfo.RedirectStandardInput = false;

            processStartInfo.RedirectStandardOutput = true;

            processStartInfo.Arguments = "-a " + ipAddress;

            processStartInfo.UseShellExecute = false;

            process = Process.Start(processStartInfo);

            int Counter = -1;

            while (Counter <= -1)
            {                  
                    Counter = macAddress.Trim().ToLower().IndexOf("mac address", 0);
                    if (Counter > -1)
                    {
                        break;
                    }

                    macAddress = process.StandardOutput.ReadLine();
                    if (macAddress != "")
                    {
                        string[] mac = macAddress.Split(' ');
                        if (Array.IndexOf(mac, ipAddress) > -1)                                
                        {
                            if (mac[11] != "")
                            {
                                macAddress = mac[11].ToString();
                                break;
                            }
                        }
                    }
            }
            process.WaitForExit();
            macAddress = macAddress.Trim();
        }

        catch (Exception e)
        {

            Console.WriteLine("Failed because:" + e.ToString());

        }
        return macAddress;

    }