У меня есть приложение, которое использует отдых для связи с сервером, я хотел бы получить iphones либо MAC-адрес, либо идентификатор устройства для проверки уникальности, как это можно сделать?
Получение идентификатора устройства или адреса Mac в iOS
Ответ 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);
Ответ 5
В IOS 5 [[UIDevice currentDevice] uniqueIdentifier]
устарела.
Лучше использовать -identifierForVendor
или -identifierForAdvertising
.
Много полезной информации можно найти здесь:
iOS6 UDID - Какие преимущества имеет идентификатор forVendor над идентификатором для рекламы?
Ответ 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;
}