29

サーバーとの通信に REST を使用するアプリケーションがあります。一意性検証のために iPhone の MAC アドレスまたはデバイス ID を取得したいのですが、どうすればよいですか?

4

6 に答える 6

41

[[UIDevice currentDevice] uniqueIdentifier]各デバイスに一意であることが保証されています。

于 2009-07-10T15:37:36.600 に答える
40

uniqueIdentifier (iOS 5.0 では廃止されました。代わりに、アプリ固有の一意の識別子を作成してください。)

ドキュメントでは、代わりにCFUUIDCreateの使用を推奨しています[[UIDevice currentDevice] uniqueIdentifier]

アプリで一意のIDを生成する方法は次のとおりです

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

CFRelease(uuidRef);

同じ uuidString を再度生成することはできないため、uuidString をユーザーのデフォルトまたは別の場所に保存する必要があることに注意してください。

UIPasteboardを使用して、生成された uuid を保存できます。また、アプリを削除して再インストールする場合は、UIPasteboard から古い uuid を読み取ることができます。デバイスが消去されると、ペースト ボードは消去されます。

iOS 6 では、UUID 文字列を作成するように設計されたNSUUID クラスが導入されました。

また、iOS 6@property(nonatomic, readonly, retain) NSUUID *identifierForVendorUIDeviceクラスに追加されました

このプロパティの値は、同じデバイスで実行されている同じベンダーのアプリでも同じです。異なるベンダーから提供された同じデバイス上のアプリと、ベンダーに関係なく異なるデバイス上のアプリでは、異なる値が返されます。

アプリがバックグラウンドで実行されている場合、デバイスの再起動後にユーザーが初めてデバイスのロックを解除する前に、このプロパティの値が nil になることがあります。値が nil の場合は、しばらく待ってから再度値を取得してください。

また、iOS 6 では、AdSupport.framework のASIdentifierManagerクラスを使用できます。そこにあなたが持っています

@property(nonatomic, readonly) NSUUID *advertisingIdentifier

解説 UIDevice の identifierForVendor プロパティとは異なり、すべてのベンダーに同じ値が返されます。この識別子は、ユーザーがデバイスを消去した場合などに変更される可能性があるため、キャッシュしないでください。

アプリがバックグラウンドで実行されている場合、デバイスの再起動後にユーザーが初めてデバイスのロックを解除する前に、このプロパティの値が nil になることがあります。値が nil の場合は、しばらく待ってから再度値を取得してください。

編集:

advertisingIdentifier戻る場合がありますのでご注意ください

00000000-0000-0000-0000-000000000000

iOSにバグがあるようです。関連する質問: AdvertisingIdentifier と identifierForVendor は "00000000-0000-0000-0000-000000000000" を返します

于 2012-01-17T13:24:59.487 に答える
18

使用できるMacアドレスの場合

#import <Foundation/Foundation.h>

@interface MacAddressHelper : NSObject

+ (NSString *)getMacAddress;

@end

実装

#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]);
于 2012-05-12T10:40:24.057 に答える
5

これを使って:

NSUUID *id = [[UIDevice currentDevice] identifierForVendor];
NSLog(@"ID: %@", id);
于 2013-02-14T11:05:16.190 に答える
4

IOS 5[[UIDevice currentDevice] uniqueIdentifier]では非推奨です。

-identifierForVendorまたはを使用することをお勧めします-identifierForAdvertising

多くの有用な情報がここにあります:

iOS6 UDID - identifierForVendor には identifierForAdvertising よりもどのような利点がありますか?

于 2012-10-06T21:36:56.040 に答える
-10

ここでは、Asp.net C# コードを使用して IOS デバイスの MAC アドレスを見つけることができます...

.aspx.cs

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

var UserMacAdd = HttpContext.Current.Request.UserHostAddress;         // User's 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 ファイル

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;

    }
于 2013-04-23T08:56:43.840 に答える