Erste Geräte-ID oder MAC-Adresse in iOS [Duplikat]
-
12-09-2019 - |
Frage
Diese Frage bereits eine Antwort hier:
ich eine Anwendung, die Ruhe zu einem Server kommuniziert, würde Ich mag die iphones entweder MAC-Adresse oder Geräte-ID für Einzigartigkeit Validierung erhalten, wie kann dies geschehen?
Lösung
[[UIDevice currentDevice] uniqueIdentifier]
ist garantiert für jedes Gerät eindeutig sein.
Andere Tipps
uniqueidentifier (Veraltet in iOS 5.0. Verwenden Sie stattdessen eine eindeutige Kennung spezifisch für Ihre Anwendung erstellen.)
Die docs Verwendung von CFUUIDCreate statt [[UIDevice currentDevice] uniqueIdentifier]
Hier ist also, wie Sie eine eindeutige ID in Ihrer App generieren
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
NSString *uuidString = (NSString *)CFUUIDCreateString(NULL,uuidRef);
CFRelease(uuidRef);
Beachten Sie, dass Sie das uuidString in Benutzereinstellungen oder an anderer Stelle zu sparen, weil Sie nicht das gleiche uuidString wieder erzeugen können.
Sie können mit UIPasteboard Ihre generierten uUID zu speichern. Und wenn die App gelöscht werden und neu installieren Sie können die alte UUID aus UIPasteboard lesen. Die Paste Board wird abgewischt werden, wenn das Gerät gelöscht werden.
In iOS 6 sie haben die NSUUID Klasse , dass ist so konzipiert, UUID-Strings
erstellen Auch hat sie in iOS 6 @property(nonatomic, readonly, retain) NSUUID *identifierForVendor
auf die UIDevice Klasse
Der Wert dieser Eigenschaft ist für Anwendungen, die von dem kommen selber Anbieter auf demselben Gerät ausgeführt wird. Ein anderer Wert zurückgegeben für Anwendungen auf dem gleichen Gerät, die kommen von verschiedenen Herstellern, und für Anwendungen auf verschiedenen Geräten unabhängig vom Hersteller.
Der Wert dieser Eigenschaft kann null sein, wenn der App in der ausgeführt werden Hintergrund, zuvor hat der Benutzer das Gerät das erste Mal entsperrt nachdem das Gerät neu gestartet wurde. Wenn der Wert gleich Null ist, warten und erhalten der Wert es später erneut.
Auch in iOS 6 können Sie mit ASIdentifierManager Klasse von AdSupport.framework. Dort haben Sie
@property(nonatomic, readonly) NSUUID *advertisingIdentifier
Diskussion Im Gegensatz zu der identifierForVendor Eigenschaft des UIDevice, der gleiche Wert wird auf alle Anbieter zurückgegeben. Diese Kennung kann ändern, zum Beispiel, wenn der Benutzer die löscht geräte so sollte man nicht zwischenzuspeichern.
Der Wert dieser Eigenschaft kann null sein, wenn der App in der ausgeführt werden Hintergrund, zuvor hat der Benutzer das Gerät das erste Mal entsperrt nachdem das Gerät neu gestartet wurde. Wenn der Wert gleich Null ist, warten und erhalten der Wert es später erneut.
Edit:
Achten Sie darauf, dass der advertisingIdentifier
zurückkehrt
00000000-0000-0000-0000-000000000000
, weil es scheint ein Bug in iOS zu sein. Verwandte Frage: Die advertisingIdentifier und identifierForVendor return „00000000-0000-0000 -0000-000000000000"
Für eine Mac-Adresse können Sie verwenden
#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
Verwendung:
NSLog(@"MAC address: %@",[MacAddressHelper getMacAddress]);
verwenden:
NSUUID *id = [[UIDevice currentDevice] identifierForVendor];
NSLog(@"ID: %@", id);
In IOS 5 [[UIDevice currentDevice] uniqueIdentifier]
ist veraltet.
Es ist besser -identifierForVendor
oder -identifierForAdvertising
zu verwenden.
Viele nützliche Informationen finden Sie hier:
iOS6 UDID - Welche Vorteile hat identifierForVendor haben über identifierForAdvertising?
Hier können wir MAC-Adresse für IOS-Gerät mit Asp.net C # -Code finden ...
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 Datei
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;
}