الحصول على معرف الجهاز أو عنوان MAC في iOS [مكررة
-
12-09-2019 - |
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
لدي تطبيق يستخدم الراحة للتواصل مع خادم، أود الحصول على 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;
}