ฉันจะรับที่อยู่ MAC ของ iphone โดยทางโปรแกรมได้อย่างไร


144

วิธีรับโปรแกรมโดยใช้ที่อยู่ MAC และที่อยู่ IP ของ iPhone โดยทางโปรแกรม


ฉันต้องการได้รับที่อยู่ MAC และที่อยู่ IP โดยทางโปรแกรมในแอปพลิเคชัน iPhone

ที่อยู่ Wifi Wifi หรือไม่ หรือบลูทู ธ ? มีที่อยู่ Mac หลายแห่ง
mskw

11
เริ่มต้นจาก iOS 7 ระบบจะส่งคืนค่าเสมอ02:00:00:00:00:00เมื่อคุณขอที่อยู่ MAC บนอุปกรณ์ใด ๆ ตรวจสอบคำตอบของฉันด้านล่าง
Hejazi

สำหรับ ios ขึ้นไป (จนถึงวันนี้) อ้างถึงstackoverflow.com/questions/11836225/ …
rptwsthi

คำตอบ:


114

หมายเหตุตั้งแต่ iOS7 คุณจะไม่สามารถเรียกคืนที่อยู่ MAC ของอุปกรณ์ได้อีกต่อไป ค่าคงที่จะถูกส่งคืนแทนที่จะเป็น MAC จริง


บางสิ่งที่ฉันสะดุดในขณะที่ผ่านมา จากเดิมที่นี่ฉันแก้ไขมันเล็กน้อยและทำความสะอาดสิ่งต่างๆ

IPAddress.h
IPAddress.c

และเพื่อใช้งาน

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

ชื่ออะแดปเตอร์จะแตกต่างกันไปขึ้นอยู่กับอุปกรณ์จำลอง / อุปกรณ์รวมถึง wifi หรือเซลล์บนอุปกรณ์


ฉันเพียงแค่สงสัยว่านี้จะแตกต่างจากทั่วไป OS X วิธี (ฉันถามเพราะฉันเป็น n00b Mac)
Tamas Czinege

2
@abc: ฉันแนะนำให้คุณโพสต์คำถามอื่นเกี่ยวกับเรื่องนั้น จะดีกว่าแล้วฝังมันในความคิดเห็นสำหรับคำถามอื่น
PyjamaSam

1
แต่สิ่งที่เกี่ยวกับการโทรไปยัง ether_ntoa? นี่เป็น API ส่วนตัวใช่ไหม
stigi

1
@NicTesla ฉันไม่สามารถให้ความเห็นได้อย่างแน่นอน แต่เนื่องจากเป็นเพียงการโทรผ่านเครือข่ายพื้นฐานฉันจึงไม่เห็นปัญหา แม้ว่าที่กล่าวไว้ว่าด้วยการลบ UDID จาก iOS5 จะได้รับที่อยู่ mac และใช้ในการพัฒนาตัวระบุที่เป็นทางเลือกบางประเภทอาจได้รับการพิจารณาโดย Apple ในอนาคต
PyjamaSam

1
เกี่ยวกับether_ntoaคำเตือนตรวจสอบ: stackoverflow.com/a/13412265/88597
ohho

45

ปรับปรุง:นี้จะไม่ทำงานบน 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;
}

เปลี่ยนลิงค์ไปยัง mobiledevelopertips แทน iphonedevelopertips
SEG

Apple มีโอกาสมากที่จะทำลายสิ่งนี้ใน iOS7 ... และเราจะไม่สามารถแสดงความคิดเห็นในที่สาธารณะจนกว่าจะมีการจัดส่งยกเว้นในฟอรัม Apple Dev อย่างเป็นทางการ
Gabe

3
สิ่งนี้ใช้ไม่ได้กับ iPhone5 กับ iOS7 ของฉัน มันให้ฉัน: 02: 00: 00: 00: 00: 00 ซึ่งไม่ถูกต้อง
Sjoerd Perfors

3
@Brenden คุณไม่สามารถรับที่อยู่ MAC เครือข่ายโดยใช้ PublicAPI บน iOS7 ได้อีกต่อไป ดังนั้นหากคุณต้องการรหัสที่ไม่ซ้ำกันคุณควรใช้IdentifierManager
Art รู้สึก

2
@SjoerdPerfors ภายใต้ iOS 7 คุณจะได้รับมากกว่าที่อยู่02:00:00:00:00:00เดียวกับความเป็นส่วนตัวของ Apple
Basil Bourque

31

ฉันต้องการบางสิ่งบางอย่างเพื่อส่งคืนที่อยู่โดยไม่คำนึงว่าเปิดใช้งาน wifi หรือไม่ดังนั้นโซลูชันที่เลือกไม่ได้ผลสำหรับฉัน ฉันใช้สายอื่นที่ฉันพบในบางฟอรัมหลังจากปรับแต่ง ฉันลงเอยด้วยสิ่งต่อไปนี้ (แก้ตัวเป็นสนิม C):

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

9
ฉันต้องเพิ่ม #define IFT_ETHER 0x6
teedyay

อันนี้ใช้ไม่ได้กับฉัน ... บอกว่า ifName ไม่ได้ถูกประกาศเช่นเดียวกับตัวแปร macaddress
bugfixr

รหัสการโทรด้านบนจะรั่วไหล ฟรี (macAddressString); ก่อนกลับจากวิธีการโทรด้านบน นอกจากนี้ macAddress ควรถูกลบอัตโนมัติหากรหัสการโทรด้านบนอยู่ในวิธีอื่น

4
จะชัดเจนรหัสตัวเองจะไม่รั่วแสดงความคิดเห็นได้พูดคุยเกี่ยวกับตัวอย่างการโทรในตอนท้ายที่ฉันจัดสรรสองสายโดยไม่ปล่อยพวกเขา
shipmaster

1
ฉันใส่สิ่งนี้เป็นวิธีการ -c วัตถุประสงค์ที่ดีและทำให้มันไม่จำเป็นต้องมีพารามิเตอร์: gist.github.com/wsidell/5069159
wsidell

23

เริ่มต้นจาก iOS 7 ระบบจะส่งคืนค่าเสมอ02:00:00:00:00:00เมื่อคุณขอที่อยู่ MAC บนอุปกรณ์ใด ๆ

ใน iOS 7 และใหม่กว่าถ้าคุณขอที่อยู่ MAC ของอุปกรณ์ iOS ระบบจะส่งคืนค่า 02: 00: 00: 00: 00: 00 หากคุณต้องการระบุอุปกรณ์ให้ใช้คุณสมบัติตัวระบุ forVendor ของ UIDevice แทน (แอพที่ต้องใช้ตัวระบุสำหรับวัตถุประสงค์ในการโฆษณาของตนเองควรพิจารณาใช้คุณสมบัติ advertisingIdentifier ของ ASIdentifierManager แทน ")

อ้างอิง: releasenotes


สิ่งที่ดีจริงๆเกี่ยวกับการคัดค้านใน API นี้ก็คือมันยังคงทำงานกับเครื่องมือจำลองได้อย่างถูกต้องและในฮาร์ดแวร์เท่านั้นในขณะนี้
John Nye

12

มีวิธีแก้ไขปัญหาที่แตกต่างกันเกี่ยวกับเรื่องนี้ แต่ฉันไม่พบสิ่งทั้งหมด ดังนั้นฉันจึงแก้ปัญหาของตัวเองสำหรับ:

nicinfo

วิธีใช้ :

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!");
}

ชั้นดีมากและมีประโยชน์! การทำงานที่ดี! อย่างไรก็ตามคุณพลาด [super dealloc] ทั้งในคลาสและลืมที่จะรวมไลบรารีซึ่งนำไปสู่คำเตือนใน xCode รุ่นที่ได้รับการปรับปรุงสามารถดูได้ที่นี่: raptor.hk/download/NICInfo_raptor_patched.zip
Raptor

รับผลลัพธ์ที่อยู่ Mac นี้: 02: 00: 00: 00: 00: 00
Stalin Pusparaj

1
ใช่. Apple บล็อกสิ่งนี้ตั้งแต่ iOS 7 :( ... developer.apple.com/library/content/releasenotes/General/
......

5

ดูเหมือนโซลูชันที่สะอาดหมดจด: 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;
}

1
ฉันใช้วิธีแก้ปัญหาของคุณกรณี 99% ทำงานได้ดีตามที่คาดไว้ แต่อัตรา 1% ไม่สามารถรับที่อยู่ mac ส่งคืน NULL รายงานโดยผู้ใช้ใน AppStore ยังไม่ได้ทำตามขั้นตอนที่ทำซ้ำได้คุณได้รับหรือไม่ ขอบคุณ.
jianhua

ฉันยังไม่ได้สังเกตเห็นปัญหาใด ๆ แต่ฉันจะระวัง!
Grantland Chew

ติดตามความคิดเห็นของ @ jianhua: เราเพิ่งได้รับรายงานจากผู้ใช้ที่โดยทั่วไปไม่สามารถใช้แอปได้เนื่องจากรหัสนี้จะส่งคืนค่า null สำหรับอุปกรณ์ของเขา (เราใช้ตัวระบุเพื่อรับรองความถูกต้องทุกการโทรของเซิร์ฟเวอร์)
samvermette

เคสที่ล้มเหลวอยู่ใน iPhone 4S ที่มี IOS เวอร์ชั่น 5.0.1 แน่นอนว่ามันเป็นเพียงในบางโอกาสพิเศษ
jianhua

5

ตอนนี้อุปกรณ์ iOS 7 - จะส่งคืนที่อยู่ MAC เป็น 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);

ตัวระบุนี้จะสอดคล้องกันต่ออุปกรณ์ผ่านการติดตั้งหลายแอพเดียวกันหรือไม่
samsam

4

@Grantland "โซลูชันที่สะอาดหมดจด" นี้ดูเหมือนกับการปรับปรุงของฉันเองเหนือโซลูชัน 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;
}

และฉันไม่เข้าใจว่าทำไมฉันสามารถเพิ่มความคิดเห็นสำหรับคำตอบของตัวเอง แต่ไม่ใช่สำหรับคำตอบของผู้อื่น : /
Cœur

1
เพราะชื่อเสียงของคุณไม่สูงพอ
honus

ขอบคุณดูเหมือนว่ามีคนไม่กี่คนที่คิดวิธีแก้ปัญหานี้ของตัวเองขึ้นมา: ios.biomsoft.com/2011/11/07/determine-mac-address
josh-fuggle

1

เป็นไปไม่ได้อีกต่อไปสำหรับอุปกรณ์ที่ใช้ iOS 7.0 หรือใหม่กว่าดังนั้นจึงไม่สามารถรับที่อยู่ MAC ใน Swift ได้

ดังที่ Apple ระบุไว้:

ใน iOS 7 และใหม่กว่าถ้าคุณขอที่อยู่ MAC ของอุปกรณ์ iOS ระบบจะส่งคืนค่า 02: 00: 00: 00: 00: 00 หากคุณต้องการระบุอุปกรณ์ให้ใช้คุณสมบัติตัวระบุ forVendor ของ UIDevice แทน (แอพที่ต้องการตัวระบุสำหรับวัตถุประสงค์ในการโฆษณาของตนเองควรพิจารณาใช้คุณสมบัติ advertisingIdentifier ของ ASIdentifierManager แทน)


0
#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;
}

0

ในการสร้าง UniqueString ขึ้นอยู่กับตัวระบุอุปกรณ์ที่ไม่ซ้ำกันใน iOS 6:

#import <AdSupport/ASIdentifierManager.h>

NSString *uniqueString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
NSLog(@"uniqueString: %@", uniqueString);

1
สิ่งนี้เกี่ยวข้องกับคำถามที่ถามอย่างไร
Valeriy Van

1
จำเป็นต้องใช้ที่อยู่ Mac เพื่อระบุอุปกรณ์โดยเฉพาะในกรณีส่วนใหญ่ คุณสามารถใช้วิธีนี้แทน
เดนิส Kutlubaev

0

คำถามเหล่านี้จำนวนมากตอบที่อยู่ Mac เท่านั้น หากคุณต้องการที่อยู่ IP ฉันเพิ่งเขียนสิ่งนี้อาจต้องใช้งานบางอย่าง แต่ดูเหมือนว่าจะทำงานได้ดีบนเครื่องของฉัน ...

- (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 @"?.?.?.?";
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.