在项目中遇到需要获取设备名字、IP地址和MAC地址信息,之前用NSHost,结果发现不是很稳定,就放弃了,另外想出了几个方法,下面记录一下:

ViewController.h

//
//  ViewController.h
//  DeviceMACAddress
//
//  Created by Chen Ling on 18/7/2018.
//  Copyright © 2018 Chen Ling. All rights reserved.
//#import <UIKit/UIKit.h>@interface ViewController : UIViewController@property (weak, nonatomic) IBOutlet UILabel *deviceNameLable;
@property (weak, nonatomic) IBOutlet UILabel *deviceIPAddressLable;
@property (weak, nonatomic) IBOutlet UILabel *deviceMACAddressLable;@end

ViewController.m

//
//  ViewController.m
//  DeviceMACAddress
//
//  Created by Chen Ling on 18/7/2018.
//  Copyright © 2018 Chen Ling. All rights reserved.
//#import "ViewController.h"
#import <sys/socket.h>
#import <ifaddrs.h>
#import <netinet/in.h>
#import <arpa/inet.h>
#import <sys/sysctl.h>
#import <net/if.h>
#import <net/if_dl.h>@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib._deviceNameLable.text = [self getDeviceName];_deviceIPAddressLable.text = [self getDeviceIPAddress];_deviceMACAddressLable.text = [self getDeviceMacAddress];
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}#pragma mark - Gets the device name
- (NSString *)getDeviceName {#if (TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE)return [NSString stringWithFormat:@"%@",[UIDevice currentDevice].name];
#else   // iOS平台return [NSString stringWithFormat:@"%@",[NSHost currentHost].localizedName];
#endif  // macOS平台}#pragma mark - Get the device IP address
- (NSString *)getDeviceIPAddress {NSString *address = @"an error occurred when obtaining ip address";struct ifaddrs *interfaces = NULL;struct ifaddrs *temp_addr = NULL;int success = 0;success = getifaddrs(&interfaces);if (success == 0) { // 0 表示获取成功temp_addr = interfaces;while (temp_addr != NULL) {if( temp_addr->ifa_addr->sa_family == AF_INET) {// Check if interface is en0 which is the wifi connection on the iPhoneif ([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {// Get NSString from C Stringstruct sockaddr_in *sockaddr = (struct sockaddr_in *)temp_addr->ifa_addr;address = [NSString stringWithUTF8String:inet_ntoa(sockaddr->sin_addr)];}}temp_addr = temp_addr->ifa_next;}}freeifaddrs(interfaces);NSLog(@"手机的IP是:%@", address);return address;
}#pragma mark - Get the device MAC address
- (NSString *) getDeviceMacAddress{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");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)];// release pointerfree(buf);return [outstring lowercaseString];
}@end

核心代码iOS和OSX通用,改一下UI就可以 了,运行结果:

iOS:

OSX:

下面说说另外一种方法,用命令行获取设备IP地址和MAC地址,思路是ifconfig命令,获取en0的信息,然后筛选出IP和MAC:

#pragma mark - Another way to get the device IP address
- (NSString *)getIPAddress {char ipAddress[16];if ([self getIPAddressCommandResult:ipAddress] == -1) {NSLog(@"获取IP地址失败");}return [NSString stringWithUTF8String:ipAddress];
}- (int)getIPAddressCommandResult:(char *)result {char buffer[16];FILE* pipe = popen("ifconfig en0 | grep inet' ' | cut -d' ' -f 2", "r");if (!pipe)return -1;while(!feof(pipe)) {if(fgets(buffer, 1024, pipe)){//strcat(result, buffer);strncpy(result, buffer, sizeof(buffer) - 1);result[sizeof(buffer) - 1] = '\0';}}pclose(pipe);return 0;
}#pragma mark - Another way to get the device MAC address
- (NSString *)getMacAddress {char macAddress[18];if ([self getMACAddressCommandResult:macAddress] == -1) {NSLog(@"获取MAC地址失败");}return [NSString stringWithUTF8String:macAddress];
}- (int)getMACAddressCommandResult:(char *)result {char buffer[18];FILE* pipe = popen("ifconfig en0 | grep ether | cut -d' ' -f 2", "r");if (!pipe)return -1;while(!feof(pipe)) {if(fgets(buffer, 1024, pipe)){//strcat(result, buffer);strncpy(result, buffer, sizeof(buffer) - 1);result[sizeof(buffer) - 1] = '\0';}}pclose(pipe);return 0;
}

Mac开发之获取设备名字、IP地址和MAC地址相关推荐

  1. 批处理获取本机IP(局域网)及MAC地址

    ::==================批处理获取本机IP(局域网)及MAC地址============== ::code by youxi01@bbs.bathome.cn 2008-1-5 @ec ...

  2. android 获取mac c语言,获取设备的mac地址和IP地址(android6.0以上专用)

    /** * 获取设备HardwareAddress地址 * @return */ public static String getMachineHardwareAddress(){ Enumerati ...

  3. Android 获取设备公网IP/私网IP地址

    在应用调试过程中,对接的技术人员要求提供一下机顶盒 的外网IP地址,于是打开了盒子上的设置,将IP地址发了过去,对面回复说这是私网IP,要公网IP才可以. 一般情况下,电脑的公网IP地址很好查:打开百 ...

  4. iOS开发:获取设备的MAC地址

    #import "ViewController.h" #import <sys/sysctl.h> #import <net/if.h> #import & ...

  5. unity基础开发----Unity获取PC,Ios系统的mac地址等信息

    在软件开发中可以会用到mac地址作为,设备的唯一标示,我们也可以通过unity获取,经测试pc,ios都可以但是安卓没有获取到. 代码如下: using UnityEngine; using Syst ...

  6. Angry IP Scanner 获取设备的IP

    给大家介绍一款软件Angry IP scanner,这款软件最大的用处就是能够扫描某一网段的各个主机的ip.通过使用发现,原理就是通过高速的ping每一个ip,假设有主机存在.就获取这个主机的user ...

  7. golang 获取客户端真实IP地址

    [Go]获取用户真实的ip地址 用户请求到达提供服务的服务器中间有很多的环节,导致服务获取用户真实的 ip 非常困难,大多数的框架及工具库都会封装各种获取用户真实 ip 的方法,在 exnet 包中也 ...

  8. iOS开发:获取WiFi名称(解决iOS12.0以上系统不能正常获取WiFi名称的方法)

    前段时间在开发过程中遇到一个问题,就是之前设置的获取手机连接WiFi名称的方法不起作用了,后来经查发现是因为新系统需要申请开启相对应的权限才能获取到手机连接的WiFi名称等信息,本章就来讲一下iOS1 ...

  9. Onvif协议:IPC客户端开发之获取设备能力

    原理简介 ONVIF协议接口由多个模块组成,每个模块分别对应着不同的WSDL文档,在ONVIF官网中能查看到这些模块,以及每个模块中的接口函数,这里列举几个模块: DeviceMgmt(设备管理) 使 ...

最新文章

  1. 北京大学开源分词工具pkuseg 初试与使用感受
  2. 2016年8月份学习总结,读书《书都不会读,你还想成功》
  3. boost::proto::protect相关的测试程序
  4. angularjs中的分页指令
  5. 阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统
  6. 最经典的职场十大理论,好文值得一看滴童鞋们。2
  7. 20190830:(leetcode习题)二叉树的最大深度
  8. 12年后,索尼重启机器人业务
  9. 使用jqueryMobile + phoneGap 开发移动端应用
  10. 51Nod-1383 整数分解为2的幂【数列】
  11. [NOIP2003普及组]麦森数(快速幂+高精度)
  12. HTML5---2.语义化标签的兼容性问题以及解决方案
  13. 考研:研究生考试(五天学完)之《线性代数与空间解析几何》研究生学霸重点知识点总结之目录(矩阵及其运算、向量与向量空间、欧氏空间、线性方程组、特征值/特征向量及相似矩阵、二次型、线性空间与线性变换)
  14. android 电源管理
  15. strlen函数详解
  16. python输入一个整数、输出该整数的所有素数因子_一个正整数的所有质数因子
  17. JS-Global对象
  18. 贪心算法实例(一):多任务分配问题
  19. 云测试 入门 笔记
  20. java实验2总结心得,java实验的心得体会

热门文章

  1. 阿里云建站,重启阿里云服务器后网站打不开,该怎么办???如何检查TCP 80端口是否正常工作???
  2. 10月15日绿健简报,星期六,农历九月二十
  3. 在winlogon桌面显示窗口
  4. 新浪与腾讯的开放平台对比(下)
  5. 【开源推介02-pyang】-你离yang模型只差一个pyang工具
  6. 麓言信息学UI设计必须掌握的知识体系和职业规划
  7. arduino智能门锁应用
  8. vue图片裁切 cdn方式就可引入
  9. 游戏大战2.0版 慎点
  10. 游戏王计算机兽,游戏王电脑堺卡牌——图腾鸟,神船号,充能战士,水晶翼,炎斩机...