प्रोग्राम को आईफोन का मैक एड्रेस और आईपी एड्रेस कैसे प्राप्त करें?
02:00:00:00:00:00
किसी भी डिवाइस पर मैक पते के लिए पूछने पर मूल्य वापस करता है। नीचे मेरे जवाब की जाँच करें।
प्रोग्राम को आईफोन का मैक एड्रेस और आईपी एड्रेस कैसे प्राप्त करें?
02:00:00:00:00:00
किसी भी डिवाइस पर मैक पते के लिए पूछने पर मूल्य वापस करता है। नीचे मेरे जवाब की जाँच करें।
जवाबों:
नोट iOS7 के रूप में, आप डिवाइस मैक पते को पुनः प्राप्त नहीं कर सकते हैं। वास्तविक मैक के बजाय एक निश्चित मान लौटाया जाएगा
कुछ समय पहले मैंने ठोकर खाई थी। मूल रूप से यहां से मैंने इसे थोड़ा संशोधित किया और चीजों को साफ किया।
और इसका उपयोग करने के लिए
InitAddresses();
GetIPAddresses();
GetHWAddresses();
int i;
NSString *deviceIP = nil;
for (i=0; i<MAXADDRS; ++i)
{
static unsigned long localHost = 0x7F000001; // 127.0.0.1
unsigned long theAddr;
theAddr = ip_addrs[i];
if (theAddr == 0) break;
if (theAddr == localHost) continue;
NSLog(@"Name: %s MAC: %s IP: %s\n", if_names[i], hw_addrs[i], ip_names[i]);
//decided what adapter you want details for
if (strncmp(if_names[i], "en", 2) == 0)
{
NSLog(@"Adapter en has a IP of %s", ip_names[i]);
}
}
एडाप्टर के नाम सिम्युलेटर / डिवाइस के साथ-साथ डिवाइस पर वाईफ़ाई या सेल के आधार पर भिन्न होते हैं।
ether_ntoa
चेतावनी के संबंध में , देखें: stackoverflow.com/a/13412265/88597
अद्यतन: यह iOS 7 पर काम नहीं करेगा। आपको ASIdentifierManager का उपयोग करना चाहिए ।
MobileDeveloperTips वेबसाइट पर अधिक स्वच्छ समाधान :
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>
...
- (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;
}
IdentifierManager
02:00:00:00:00:00
में Apple द्वारा प्राइवेसी एहतियात के तौर पर हमेशा एक ही पते पर मिलेगा ।
मुझे पता था कि वाईफाई सक्षम किया गया था या नहीं, इसके बावजूद पते को वापस करने के लिए कुछ चाहिए, इसलिए चुना हुआ समाधान मेरे लिए काम नहीं करता था। मैंने एक और कॉल का इस्तेमाल किया जिसे मैंने कुछ फोरम पर कुछ ट्विकिंग के बाद पाया। मैं निम्नलिखित के साथ समाप्त हुआ (मेरी जंग सी देखें):
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <net/if_dl.h>
#include <ifaddrs.h>
char* getMacAddress(char* macAddress, char* ifName) {
int success;
struct ifaddrs * addrs;
struct ifaddrs * cursor;
const struct sockaddr_dl * dlAddr;
const unsigned char* base;
int i;
success = getifaddrs(&addrs) == 0;
if (success) {
cursor = addrs;
while (cursor != 0) {
if ( (cursor->ifa_addr->sa_family == AF_LINK)
&& (((const struct sockaddr_dl *) cursor->ifa_addr)->sdl_type == IFT_ETHER) && strcmp(ifName, cursor->ifa_name)==0 ) {
dlAddr = (const struct sockaddr_dl *) cursor->ifa_addr;
base = (const unsigned char*) &dlAddr->sdl_data[dlAddr->sdl_nlen];
strcpy(macAddress, "");
for (i = 0; i < dlAddr->sdl_alen; i++) {
if (i != 0) {
strcat(macAddress, ":");
}
char partialAddr[3];
sprintf(partialAddr, "%02X", base[i]);
strcat(macAddress, partialAddr);
}
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
return macAddress;
}
और फिर मैं इसे en0 के लिए पूछ रहा हूँ , इस प्रकार है:
char* macAddressString= (char*)malloc(18);
NSString* macAddress= [[NSString alloc] initWithCString:getMacAddress(macAddressString, "en0")
encoding:NSMacOSRomanStringEncoding];
free(macAddressString);
IOS 7 से शुरू, सिस्टम हमेशा 02:00:00:00:00:00
किसी भी डिवाइस पर मैक पते के लिए पूछने पर मूल्य वापस करता है।
IOS 7 और बाद में, यदि आप iOS डिवाइस का मैक पता पूछते हैं, तो सिस्टम 02: 00: 00: 00: 00: 00 का मान लौटाता है। यदि आपको डिवाइस की पहचान करने की आवश्यकता है, तो इसके बजाय UIDevice के पहचानकर्ताForVendor गुण का उपयोग करें। (ऐसे ऐप्स जिन्हें अपने स्वयं के विज्ञापन उद्देश्यों के लिए एक पहचानकर्ता की आवश्यकता है, इसके बजाय ASIdententManager की विज्ञापन-प्रसारकर्ता संपत्ति का उपयोग करने पर विचार करना चाहिए।)
संदर्भ: releasenotes
इस बारे में अलग-अलग समाधान हैं, लेकिन मुझे पूरी बात नहीं मिली। इसलिए मैंने अपना समाधान खुद बनाया:
कैसे इस्तेमाल करे :
NICInfoSummary* summary = [[[NICInfoSummary alloc] init] autorelease];
// en0 is for WiFi
NICInfo* wifi_info = [summary findNICInfo:@"en0"];
// you can get mac address in 'XX-XX-XX-XX-XX-XX' form
NSString* mac_address = [wifi_info getMacAddressWithSeparator:@"-"];
// ip can be multiple
if(wifi_info.nicIPInfos.count > 0)
{
NICIPInfo* ip_info = [wifi_info.nicIPInfos objectAtIndex:0];
NSString* ip = ip_info.ip;
NSString* netmask = ip_info.netmask;
NSString* broadcast_ip = ip_info.broadcastIP;
}
else
{
NSLog(@"WiFi not connected!");
}
यह एक बहुत साफ समाधान की तरह दिखता है: UIDevice BIdentifier
// Return the local MAC addy
// Courtesy of FreeBSD hackers email list
// Accidentally munged during previous update. Fixed thanks to erica sadun & mlamb.
- (NSString *) macaddress{
int mib[6];
size_t len;
char *buf;
unsigned char *ptr;
struct if_msghdr *ifm;
struct sockaddr_dl *sdl;
mib[0] = CTL_NET;
mib[1] = AF_ROUTE;
mib[2] = 0;
mib[3] = AF_LINK;
mib[4] = NET_RT_IFLIST;
if ((mib[5] = if_nametoindex("en0")) == 0) {
printf("Error: if_nametoindex error\n");
return NULL;
}
if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
printf("Error: sysctl, take 1\n");
return NULL;
}
if ((buf = malloc(len)) == NULL) {
printf("Could not allocate memory. error!\n");
return NULL;
}
if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
printf("Error: sysctl, take 2");
free(buf);
return NULL;
}
ifm = (struct if_msghdr *)buf;
sdl = (struct sockaddr_dl *)(ifm + 1);
ptr = (unsigned char *)LLADDR(sdl);
NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",
*ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
free(buf);
return outstring;
}
अब iOS 7 डिवाइस - हमेशा 02: 00: 00: 00: 00: 00 का मैक एड्रेस लौटा रहे हैं।
इसलिए बेहतर उपयोग [UIDevice IdentifierForVendor]।
एप्लिकेशन विशिष्ट अद्वितीय कुंजी प्राप्त करने के लिए इस पद्धति को कॉल करना बेहतर है
श्रेणी अधिक उपयुक्त होगी
आयात "UIDevice + Identifier.h"
- (NSString *) identifierForVendor1
{
if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) {
return [[[UIDevice currentDevice] identifierForVendor] UUIDString];
}
return @"";
}
अब अद्वितीय पता प्राप्त करने के लिए विधि के ऊपर कॉल करें
NSString *like_UDID=[NSString stringWithFormat:@"%@",
[[UIDevice currentDevice] identifierForVendor1]];
NSLog(@"%@",like_UDID);
@ गै्रंडलैंड यह "सुंदर स्वच्छ समाधान" iPhoneDeveloperTips समाधान पर मेरे अपने सुधार के समान दिखता है।
आप यहाँ अपना कदम देख सकते हैं: https://gist.github.com/1409855/
/* Original source code courtesy John from iOSDeveloperTips.com */
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>
+ (NSString *)getMacAddress
{
int mgmtInfoBase[6];
char *msgBuffer = NULL;
NSString *errorFlag = NULL;
size_t length;
// 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";
// Get the size of the data available (store in len)
else if (sysctl(mgmtInfoBase, 6, NULL, &length, NULL, 0) < 0)
errorFlag = @"sysctl mgmtInfoBase failure";
// Alloc memory based on above call
else if ((msgBuffer = malloc(length)) == NULL)
errorFlag = @"buffer allocation failure";
// Get system information, store in buffer
else if (sysctl(mgmtInfoBase, 6, msgBuffer, &length, NULL, 0) < 0)
{
free(msgBuffer);
errorFlag = @"sysctl msgBuffer failure";
}
else
{
// Map msgbuffer to interface message structure
struct if_msghdr *interfaceMsgStruct = (struct if_msghdr *) msgBuffer;
// Map to link-level socket structure
struct sockaddr_dl *socketStruct = (struct sockaddr_dl *) (interfaceMsgStruct + 1);
// Copy link layer address data in socket structure to an array
unsigned char macAddress[6];
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;
}
// Error...
NSLog(@"Error: %@", errorFlag);
return nil;
}
IOS 7.0 या उसके बाद वाले उपकरणों पर यह संभव नहीं है, इस प्रकार स्विफ्ट में मैक एड्रेस प्राप्त करने के लिए अनुपलब्ध है।
जैसा कि Apple ने कहा:
IOS 7 और बाद में, यदि आप iOS डिवाइस का मैक पता पूछते हैं, तो सिस्टम 02: 00: 00: 00: 00: 00 का मान लौटाता है। यदि आपको डिवाइस की पहचान करने की आवश्यकता है, तो इसके बजाय UIDevice के पहचानकर्ताForVendor गुण का उपयोग करें। (ऐसे ऐप्स जिन्हें अपने स्वयं के विज्ञापन उद्देश्यों के लिए एक पहचानकर्ता की आवश्यकता है, उन्हें इसके बजाय ASIdententman के विज्ञापन-प्रसारकर्ता संपत्ति का उपयोग करने पर विचार करना चाहिए।)
#import <sys/socket.h>
#import <net/if_dl.h>
#import <ifaddrs.h>
#import <sys/xattr.h>
#define IFT_ETHER 0x6
...
- (NSString*)macAddress
{
NSString* result = nil;
char* macAddressString = (char*)malloc(18);
if (macAddressString != NULL)
{
strcpy(macAddressString, "");
struct ifaddrs* addrs = NULL;
struct ifaddrs* cursor;
if (getifaddrs(&addrs) == 0)
{
cursor = addrs;
while (cursor != NULL)
{
if ((cursor->ifa_addr->sa_family == AF_LINK) && (((const struct sockaddr_dl*)cursor->ifa_addr)->sdl_type == IFT_ETHER) && strcmp("en0", cursor->ifa_name) == 0)
{
const struct sockaddr_dl* dlAddr = (const struct sockaddr_dl*) cursor->ifa_addr;
const unsigned char* base = (const unsigned char*)&dlAddr->sdl_data[dlAddr->sdl_nlen];
for (NSInteger index = 0; index < dlAddr->sdl_alen; index++)
{
char partialAddr[3];
sprintf(partialAddr, "%02X", base[index]);
strcat(macAddressString, partialAddr);
}
}
cursor = cursor->ifa_next;
}
}
result = [[[NSString alloc] initWithUTF8String:macAddressString] autorelease];
free(macAddressString);
}
return result;
}
IOS 6 में डिवाइस की विशिष्ट पहचानकर्ता के आधार पर एक विशिष्ट स्ट्रिंग बनाने के लिए:
#import <AdSupport/ASIdentifierManager.h>
NSString *uniqueString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
NSLog(@"uniqueString: %@", uniqueString);
इनमें से बहुत सारे प्रश्न केवल मैक पते को संबोधित करते हैं। अगर आपको भी आईपी पते की आवश्यकता है जो मैंने अभी लिखा है, तो कुछ काम की आवश्यकता हो सकती है, लेकिन लगता है कि मेरी मशीन पर काम करना अच्छा है ...
- (NSString *)getLocalIPAddress
{
NSArray *ipAddresses = [[NSHost currentHost] addresses];
NSArray *sortedIPAddresses = [ipAddresses sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
numberFormatter.allowsFloats = NO;
for (NSString *potentialIPAddress in sortedIPAddresses)
{
if ([potentialIPAddress isEqualToString:@"127.0.0.1"]) {
continue;
}
NSArray *ipParts = [potentialIPAddress componentsSeparatedByString:@"."];
BOOL isMatch = YES;
for (NSString *ipPart in ipParts) {
if (![numberFormatter numberFromString:ipPart]) {
isMatch = NO;
break;
}
}
if (isMatch) {
return potentialIPAddress;
}
}
// No IP found
return @"?.?.?.?";
}