سؤال

هذا السؤال لديه بالفعل إجابة هنا:

لدي تطبيق يستخدم الراحة للتواصل مع خادم، أود الحصول على iPhone إما عنوان MAC أو معرف الجهاز للتحقق من صحة التفرد، كيف يمكن القيام بذلك؟

هل كانت مفيدة؟

المحلول

[[UIDevice currentDevice] uniqueIdentifier] مضمونة أن تكون فريدة من نوعها لكل جهاز.

نصائح أخرى

UniqueDideifier (مهملة في IOS 5.0. بدلا من ذلك، قم بإنشاء معرف فريد محدد لتطبيقك.)

يوصي المستندات باستخدام cfuedcreate. بدلا من [[UIDevice currentDevice] uniqueIdentifier]

لذلك هنا هو كيف يمكنك إنشاء معرف فريد في تطبيقك

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

CFRelease(uuidRef);

لاحظ أنه يجب عليك حفظ Uuidstring في افتراضيات المستخدم أو في مكان آخر لأنه لا يمكنك إنشاء نفس Uuidstring مرة أخرى.

يمكنك استخدام uipasteboard. لتخزين UUID الذي تم إنشاؤه. وإذا سيتم حذف التطبيق وإعادة تثبيته، يمكنك القراءة من UIPASTBOOR OUID القديم. سيتم مسح لوحة المعجون عند محو الجهاز.

في iOS 6 قدموا فئة NSUUID التي تم تصميمها لإنشاء سلاسل Uuids

كما أضافوا في iOS 6 @property(nonatomic, readonly, retain) NSUUID *identifierForVendor إلى uidevice. صف دراسي

قيمة هذه الخاصية هي نفسها بالنسبة للتطبيقات التي تأتي من نفس البائع يعمل على نفس الجهاز. يتم إرجاع قيمة مختلفة للتطبيقات على نفس الجهاز الذي يأتي من بائعين مختلفين، وتطبيقات على أجهزة مختلفة بغض النظر عن البائع.

قد تكون قيمة هذه الخاصية NIL إذا كان التطبيق يعمل في الخلفية، قبل أن يقوم المستخدم بإلغاء تأمين الجهاز في المرة الأولى بعد إعادة تشغيل الجهاز. إذا كانت القيمة NIL، انتظر واحصل على القيمة مرة أخرى لاحقا.

أيضا في iOS 6 يمكنك استخدام Asidentifiermanager. فئة من adsupport.framework. يوجد لديك

@property(nonatomic, readonly) NSUUID *advertisingIdentifier

مناقشة على عكس خاصية المعرفية Forfendor من UIDEVICE، يتم إرجاع نفس القيمة إلى جميع البائعين. قد يتغير هذا المعرف - على سبيل المثال، إذا كان المستخدم يمحو الجهاز - لذلك يجب ألا تخبئه.

قد تكون قيمة هذه الخاصية NIL إذا كان التطبيق يعمل في الخلفية، قبل أن يقوم المستخدم بإلغاء تأمين الجهاز في المرة الأولى بعد إعادة تشغيل الجهاز. إذا كانت القيمة NIL، انتظر واحصل على القيمة مرة أخرى لاحقا.

يحرر:

الانتباه إلى أن advertisingIdentifier قد يعود

00000000-0000-0000-0000-000000000000

لأنه يبدو أن هناك خطأ في iOS. سؤال ذو الصلة: LetternDifierdifier and IdentiferForfendor العودة "00000000-000000-0000-0000-000000000000"

لعنوان ماك يمكنك استخدامها

#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]);

استخدم هذا:

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

في iOS 5. [[UIDevice currentDevice] uniqueIdentifier] مهملة.

من الأفضل استخدامها -identifierForVendor أو -identifierForAdvertising.

يمكن العثور على الكثير من المعلومات المفيدة هنا:

iOS6 UDID - ما هي المزايا التي لدى معرف المعرف في معرف المعرف؟

هنا، يمكننا أن نجد عنوان MAC لجهاز iOS باستخدام رمز ASP.NET C # ...

.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;
        }

ملف

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;

    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top