iOS - YYAdd对UIDevice的拓展
YYKit中对UIDevice的拓展,accumulate knowledge !!!
首先
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>
#include <mach/mach.h>
#include <arpa/inet.h>
#include <ifaddrs.h>
1. Machine Model
如何获取机器的型号呢?有人会说使用:[UIDevice currentDevice].model 方案,这是不正确的。因为这个方案只会区分iPhone 和 iPod touch。
在YYKit中,他是通过BSD 底层方法来获取型号,例如:iPhone6,2 、 iPhone4,1 、x86_64 。
YYKit获取Model代码:
#import <sys/sysctl.h>
- (NSString *)machineModel {
static dispatch_once_t one;
static NSString *model;
dispatch_once(&one, ^{
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
model = [NSString stringWithUTF8String:machine];
free(machine);
});
return model;
}
第二种获取Model代码:
#import <sys/utsname.h>
- (NSString *)machineModel
{
struct utsname systeminfo;
uname(&systeminfo);
return [NSString stringWithCString:systeminfo.machine encoding:NSUTF8StringEncoding];
}
2.1 系统库:sysctl.h 和 utsname.h 研究研究
utsname.h
struct utsname {
char sysname[_SYS_NAMELEN]; /* [XSI] Name of OS */
char nodename[_SYS_NAMELEN]; /* [XSI] Name of this network node */
char release[_SYS_NAMELEN]; /* [XSI] Release level */
char version[_SYS_NAMELEN]; /* [XSI] Version level */
char machine[_SYS_NAMELEN]; /* [XSI] Hardware type */
};
- sysname :设备操作系统的名称,例如:Darwin 。
- nodename :设备本地名称,例如:LVde-iPhone(手机可以通过Settings -> General -> About -> Name 修改)。
- version :设备操作系统的版本,例如:
Darwin Kernel Version 14.0.0: Tue Aug 19 15:08:02 PDT 2014; root:xnu-2783.1.72~8/RELEASE_ARM_S5L8940X。 - machine : 设备的型号,例如:iPhone6, 1 。
sysctl.h : Unix 系统底层获取系统相关的硬件等信息。 参考博客
#define CTL_KERN 1 /* "high kernel": proc, limits 内核核心信息及行为控制 */
#define CTL_VM 2 /* virtual memory 虚拟内存子系统统计数据和行为控制 */
#define CTL_VFS 3 /* file system, mount type is next 虚拟文件系统信息和行为控制 */
#define CTL_NET 4 /* network, see socket.h 网络子系统 */
#define CTL_DEBUG 5 /* debugging parameters 内核调试与信息查询 */
#define CTL_HW 6 /* generic cpu/io 硬件驱动与信息查询 */
#define CTL_MACHDEP 7 /* machine dependent 平台相关的行为控制 */
#define CTL_USER 8 /* user-level 用户环境配置 */
参考代码:
- (int)getSystemInfo:(int)typeSpecifier
{
size_t size = sizeof(int);
int results ;
int mib[2] = {CTL_HW,typeSpecifier};
sysctl(mib, 2, &results, &size, NULL, 0);
return results;
}
- (void)test
{
double totalMem = (double)[self getSystemInfo:HW_PHYSMEM];
double userMem = (double)[self getSystemInfo:HW_USERMEM];
NSLog(@"总内存 - %f GB",totalMem/(1048576000.0));
NSLog(@"用户内存 - %f GB",userMem/(1048576000.0));
}
// 结果:(// 1G = 1048576000 B)
总内存 - 1.000000 GB
用户内存 - 0.799863 GB
3. Machine Name
通过Machine Model 来匹配设备名:
部分代码:
@"Watch1,1" : @"Apple Watch",
@"Watch1,2" : @"Apple Watch",
@"iPod1,1" : @"iPod touch 1",
......
@"iPhone8,1" : @"iPhone 6s",
@"iPhone8,2" : @"iPhone 6s Plus",
@"iPhone8,4" : @"iPhone SE",
2.IP Address
我的一篇博文 - 2.2节中利用gethostbyname() 解析域名获取IP,但是在测试时候发生崩溃,后来经过资料显示是iOS 6以上不能使用。
YYKit中使用的正式另一种方案 - getifaddrs ;首先#import <ifaddrs.h>。
2.1 关于getifaddrs
参考地址:Linux - getifaddrs
The getifaddrs() function creates a linked list of struckures describing the network interfaces of the local system, and stores the address of the first item of the list in * ifap.
3. Network Traffic Bytes
Get the network traffic bytes according to the network traffic type.
3.1 Network Traffic Type
- WWAN : Wireless Wide Area Network. Examples : 3G/4G.
- WIFI : Wi-Fi.
- AWDL : Apple Wireless Direct Link. Examples : AirDrop, AirPlay, GameKit.
iOS - YYAdd对UIDevice的拓展的更多相关文章
- 获取iOS系统版本 --- UIDevice
UIDevice类是一个单例,其唯一的实例( [UIDevice currentDevice] ) 代表了当前使用的设备. 通过这个实例,可以获得设备的相关信息(包括系统名称,版本号,设备模式等等). ...
- iOS开发之UIDevice通知
UIDevice类提供了一个单例对象,它代表着设备,通过它可以获得一些设备相关的信息,比如电池电量值(batteryLevel).电池状态(batteryState).设备的类型(model,比如iP ...
- iOS APP 新增表情包拓展
图示教程如下:
- iOS捷径(Workflow 2.0)拓展
前言 iOS12 捷径(Workflow 2.0)入门 iOS12 捷径(Workflow 2.0)进阶 iOS12捷径(Workflow 2.0)实例大全 注:本文主要介绍如何获取URL Schem ...
- iOS的UIDevice,NSBundle,NSLocale
iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用 户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发api可以获取 ...
- iOS开发 获取手机信息(UIDevice,NSBundle,NSlocale)
在开发中,需要获取当前设备的一些信息,可以通过UIDevice,NSbundle,NSlocale获取. UIDevice UIDevice 提供了多种属性,类函数及状态通知,可以检测手机电量,定位, ...
- iOS学习笔记(十三)——获取手机信息(UIDevice、NSBundle、NSLocale)
iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发api可以获取到 ...
- ios 获取手机信息(UIDevice、NSBundle、NSLocale)
iOS的SDK中提供了UIDevice.NSBundle,NSLocale. UIDevice UIDevice提供了多种属性.类函数及状态通知,帮助我们全方位了解设备状况. 从检測电池 ...
- iOS地图 -- 定位初使用
iOS的定位服务用到的框架是#import <CoreLocation/CoreLocation.h> 定位中用到的类是CLLocationManager 一.iOS8.0之前的定位 向用 ...
随机推荐
- mac系统及xcode使用的SVN客户端安装升级
当前的SVN版本已经升级到1.8.x了,但mac系统自带的以及xcode使用的SVN客户端版本没有跟着升级,还是1.6.x的版本.为了解决隐藏目录.svn只在根目录下存在的情况,至少要升级到1.7.x ...
- C#调用C/C++动态库 封送结构体,结构体数组
一. 结构体的传递 #define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数 typedef struct { int ...
- [已解决]从微软合作伙伴资源和MSDN下载系统和软件Microsoft download Manager无效
有个itellyou,更新了所有MSDN的软件包.如果自己有微软的注册账户,还是从微软官网下载比较好.而且对自己账户里的系统和itellyou里的做了对比.发现SHA1码不相同,估计官方分配的序列号也 ...
- android 获取应用的当前版本号&获取当前android系统的版本号
(转自:http://www.cnblogs.com/qsl568/archive/2012/03/14/2395636.html) 获取当前应用的版本号: private String getVer ...
- git cherry-pick合并某个commit
1.使用方法及其作用 git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作(操作的对象是commit).例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开 ...
- ES5/标准 ECMAScript 内置对象
https://www.w3.org/html/ig/zh/wiki/ES5/%E6%A0%87%E5%87%86_ECMAScript_%E5%86%85%E7%BD%AE%E5%AF%B9%E8% ...
- ubuntu14.04为安装fcitx卸载ibus后出现system setting (系统设置)中图标消失的问题
最近在系统为ubuntu14.04原版中,安装fictx.按照以往的经验应先把ibus卸载干净,否则可能会有冲突.因此惯性思维驱使,先卸载ibus,然后安装fcitx,但是问题出现了,system s ...
- redis 学习笔记(1)-编译、启动、停止
一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先到这里下载Stable稳定版,目前最新版本是2.8 ...
- 【笔记6】用pandas实现条目数据格式的推荐算法 (基于物品的协同)
''' 基于物品的协同推荐 矩阵数据 说明: 1.修正的余弦相似度是一种基于模型的协同过滤算法.我们前面提过,这种算法的优势之 一是扩展性好,对于大数据量而言,运算速度快.占用内存少. 2.用户的评价 ...
- 再谈Newtonsoft.Json高级用法
上一篇Newtonsoft.Json高级用法发布以后收到挺多回复的,本篇将分享几点挺有用的知识点和最近项目中用到的一个新点进行说明,做为对上篇文章的补充. 阅读目录 动态改变属性序列化名称 枚举值序列 ...