How to get iOS device MAC address programmatically

后端 未结 5 1101
情歌与酒
情歌与酒 2020-11-28 12:53

How do I get an iOS device\'s MAC code programmatically in my app?

5条回答
  •  借酒劲吻你
    2020-11-28 13:28

    You can get the MAC Adress using the following function:

    +(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]];
            if(IsDEBUG) NSLog(@"Mac Address: %@", macAddressString);
    
            // Release the buffer memory
            free(msgBuffer);
    
            return macAddressString;
        }
    
        // Error...
        if(IsDEBUG) NSLog(@"Error: %@", errorFlag);
    
        return errorFlag;
    }
    

    But as he said #Randomclik, mac address is unavailable from ios 7 and up.

    form apple:

    In iOS 7 and later, if you ask for the MAC address of an iOS device, the system returns the value 02:00:00:00:00:00. If you need to identify the device, use the identifierForVendor property of UIDevice instead. (Apps that need an identifier for their own advertising purposes should consider using the advertisingIdentifier property of ASIdentifierManager instead.)

    link: https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS7.html#//apple_ref/doc/uid/TP40013162-SW1

    Conversation about MAC Address:

    How can I programmatically get the MAC address of an iphone

提交回复
热议问题