【1】 推断是否是横向屏:

BOOL b=UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation);

获取设备uniqueIdentifier :

[UIDevice currentDevice].uniqueIdentifier;

但在ios5中,它已被废弃。

http://kensou.blog.51cto.com/3495587/655083

[[UIDevice currentDevice] systemName];
[[UIDevice currentDevice] systemVersion];//os version
[[UIDevice currentDevice] uniqueIdentifier];
[[UIDevice currentDevice] model];
[[UIDevice currentDevice] name];

真机上结果:

System Name: iPhone OS

System Version: 4.2.1

Unique ID: 9b5ded78d5fa0ac96250f8b4af0e46f40b96ea6d

Model: iPhone

Name: “wwk”的 iPhone

模拟器上结果:

System Name: iPhone OS

System Version: 4.2

Unique ID: 21FFE0FF-429B-5D0B-96D2-EADCA3203260

Model: iPhone Simulator

Name: iPhone Simulator

uniqueIdentifier:iPhone通过。向几个硬件标识符和设备序列号应用内部散列算法。而生成这一标识符。

【2】电池事件通知及电池状态:电池水平是一个浮点值,从0.0全然放电,到1.0全然充满。

[NSLog:@"Battery level: %0.2f%", [[UIDevice currentDevice] batteryLevel] * 100];
NSArray *stateArray = [NSArray arrayWithObjects: @"Unknown", @"not plugged into a charging source", @"charging", @"full", nil];
[NSLog:@"Battery state: %@", [stateArray objectAtIndex:[[UIDevice currentDevice] batteryState]]];

获得很多其它设备信息:使用sysctlbyname(),sysctl()标准unix函数。

在sys/sysctl.h中提供了一些设备信息常量。要注意先要#include <sys/socket.h>。

详细的參考《秘籍2》14.3又一次获得很多其它设备信息。

hw.machine的值,第一代iPhone为(iPhone1,1)。iPhone3g为(iPhone1,2)。iPhone3gs为(iPhone2,1),模拟器上为x86_64。

【3】.传感器。

启用接近传感器后,它检測前方是否存在一个大型物体,假设有。它会关闭屏幕,并发出一般性通知。当障碍物移走后,会又一次打开屏幕。这能够防止在通知过程中,误用耳朵触碰button。

还要防止一些保护套会影响传感器工作。

  [UIDevice currentDevice].proximityMonitoringEnabled=YES;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleStateChange:) name:@"UIDeviceProximityStateDidChangeNotification" object:nil];

【4】加速度。

在測量速度上,iPhone提供了3个板载传感器。它们沿iPhone垂直坐标轴的3个方向xyz測量加速度。这些值表示影响iPhone的力。

   [[UIAccelerometer sharedAccelerometer] setDelegate:self];//UIAccelerometerDelegate
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
float xx = -[acceleration x];
float yy = [acceleration y];
float angle = atan2(yy, xx);
[arrow setTransform:CGAffineTransformMakeRotation(angle)];
}

【5】检測设备方向:横线或纵向。

  [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; // not actually required but a good idea in case Apple changes this
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
// 在viewController中重写shouldAutorotateToInterfaceOrientation
- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) anOrientation
{
return (anOrientation == UIDeviceOrientationPortrait ||
anOrientation == UIDeviceOrientationLandscapeRight ||
anOrientation == UIDeviceOrientationLandscapeLeft ||);
// iPhone不建议使用UIDeviceOrientationPortraitUpsizeDown
} - (void) orientationChanged: (id) sender
{
NSLog(@"Orientation changed to %@", [UIDevice currentDevice].orientationString);//当前设备方向
}
// 两个内置的宏辅助推断方向
UIDeviceOrientationIsPortrait(anOrientation)
UIDeviceOrientationIsLandscape(anOrientation)

【6】摇晃检測  ShakeDetection。

响应链:响应链提供了层级对象,一个事件若被起始处的对象接收。它不会再被向下传递。否则,继续向下传递。

对象一般是通过[self becomeFirstResponder];声明自身为第一响应者。[self resignFirstResponder];声明退出第一响应者。

第一响应者接收全部运动和触摸事件。

  - (BOOL)canBecomeFirstResponder {return YES;}

有例如以下3个运动回调函数能够被覆盖,它们定义在UIResponder中:

 - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event

【7】磁盘空间

  NSFileManager *fm = [NSFileManager defaultManager];
NSDictionary *fattributes = [fm fileSystemAttributesAtPath:NSHomeDirectory()];
System space:[[fattributes objectForKey:NSFileSystemSize] longLongValue];
System free space: [[fattributes objectForKey:NSFileSystemFreeSize] longLongValue];

【8】iTunes通过在info.plist中列出的设备功能列表。确定一个程序能否够下载到指定设备中并正常执行。

【9】在AVAILABILITY.h文件里有版本号宏定义,比如:__IPHONE_4_2

这个是os version还是sdk version,或者它们是同样的?

http://www.opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/Availability.h

【10】

NSString* udid=[[UIDevice currentDevice] uniqueIdentifier];
return udid;

【11】

//改为在最上层使用了一层button来响应点击事件
/*
else
{
NSString* systemVersion=[[UIDevice currentDevice] systemVersion];
float floatVersion=[systemVersion floatValue];
NSLog(@"systemVersion:%@,floatVersion:%f",systemVersion,floatVersion);
if(floatVersion<5.0)
{
//in ios5。每层UIView均会响应touchesEnded,所以ios5不用这里向上调了。
ret=[(ViewGroupWrap*)iSuperViewWrap handleTouch];
}
}
*/

【12】coding区分iphone ipod & ipad 的几种方法

(1)使用  UI_USER_INTERFACE_IDIOM() 进行区分

UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad    //ipad
UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone //iPhone

(2)使用 UIDevice.model 进行区分

NSString *deviceType = [UIDevice currentDevice].model;

    if([deviceType isEqualToString:@"iPhone"]) {
//iPhone
}
else if([deviceType isEqualToString:@"iPod touch"]) {
//iPod Touch
}
else {
//iPad
}

(3)使用系统的一个函数sysctlbyname 来获取设备名称

- (NSString *) platformString
{
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *platform = [NSString stringWithUTF8String:machine];
free(machine);
if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 1G";
if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS";
if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
if ([platform isEqualToString:@"iPhone3,3"]) return @"Verizon iPhone 4";
if ([platform isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G";
if ([platform isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G";
if ([platform isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G";
if ([platform isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G";
if ([platform isEqualToString:@"iPad1,1"]) return @"iPad";
if ([platform isEqualToString:@"iPad2,1"]) return @"iPad 2 (WiFi)";
if ([platform isEqualToString:@"iPad2,2"]) return @"iPad 2 (GSM)";
if ([platform isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)";
if ([platform isEqualToString:@"i386"]) return @"Simulator";
return @"";
}

參考   http://hi.baidu.com/songxiaoweiss/blog/item/c78162f869fc148c58ee9028.html

【13】关于获取IMSI号

CoreTelephony.framework。

头文件内容

extern NSString* c*****t kCTSMSMessageReceivedNotification;
extern NSString* c*****t kCTSMSMessageReplaceReceivedNotification;
extern NSString* c*****t kCTSIMSupportSIMStatusNotInserted;
extern NSString* c*****t kCTSIMSupportSIMStatusReady;
id CTTelephonyCenterGetDefault(void);
void CTTelephonyCenterAddObserver(id,id,CFNotificationCallback,NSString*,void*,int);
void CTTelephonyCenterRemoveObserver(id,id,NSString*,void*);
int CTSMSMessageGetUnreadCount(void);
int CTSMSMessageGetRecordIdentifier(void * msg);
NSString * CTSIMSupportGetSIMStatus(); //获取sim卡状态。kCTSIMSupportSIMStatusNotInserted表示没有sim卡
NSString * CTSIMSupportCopyMobileSubscriberIdentity(); //获取imsi号码
id CTSMSMessageCreate(void* unknow/*always 0*/,NSString* number,NSString* text);
void * CTSMSMessageCreateReply(void* unknow/*always 0*/,void * forwardTo,NSString* text);
void* CTSMSMessageSend(id server,id msg);
NSString *CTSMSMessageCopyAddress(void *, void *);
NSString *CTSMSMessageCopyText(void *, void *);

调用CTSIMSupportCopyMobileSubscriberIdentity能成功获取到IMSI号

用performSelector来逃过苹果的检查

【iOS开发系列】UIDevice设备信息的更多相关文章

  1. [转载]iOS开发:获取设备信息

    开发iOS平台的应用的时候,可以获取iOS设备的设备信息,包括设备的名称,设备的机型,设备的iOS版本等等.设备信息主要来自 UIDevice 类. UIDevice *currentDevice = ...

  2. iOS开发系列--通知与消息机制

    概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...

  3. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  4. iOS开发系列--网络开发

    概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...

  5. 【转】iOS开发系列--数据存取

    原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...

  6. iOS开发系列--通知与消息机制--转

    来自:http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户 ...

  7. iOS开发系列之app的一天

    本文主要讲述我对 iOS 开发的一些理解,希望能通过 app 从启动到退出,将一些的知识整合起来,形成一条知识链,目前涉及到的知识点有 runloop.runtime.文件存储.界面布局.离线推送.内 ...

  8. iOS开发系列--App扩展开发

    概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...

  9. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

  10. iOS开发系列--Swift语言

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

随机推荐

  1. 样条函数(spline function)—— 分段多项式函数(piecewise polynomial function)

    1. 分段多项式函数 样条函数是某种意义上的分段函数. Spline (mathematics) - Wikipedia 最简单的样条函数是一种分段多项式函数(piecewise polynomial ...

  2. Tool-Java:Eclipse

    ylbtech-Tool-Java:Eclipse Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运的是,E ...

  3. MYSQL5.6和5.7编译标准化安装与配置

    文档结构图如下: 一.前期规划 1.软件环境以及说明 操作系统:RedHat Linux 6.7 64位 数 据 库:MYSQL5.6.38/5.7.20 MySQL 5.6:初始化数据时需要进到家目 ...

  4. golang二维码

    package main import ( "github.com/boombuler/barcode" "github.com/boombuler/barcode/qr ...

  5. python之路——迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  6. POJ 2752 KMP中next数组的应用

    题意: 让你从小到大输出给的字符串中既是前缀又是后缀的子串的长度. 思路: 先要了解这个东西: KMP中next数组表示的含义:记录着字符串匹配过程中失配情况下可以向前多跳几个字符,它描述的也是子串的 ...

  7. Windows下配置SVN服务器

    2013-09-03 21:40:34 1. 下载安装svn软件 1.1 服务端svn 下载地址:http://subversion.apache.org/packages.html 默认安装路径:D ...

  8. WCF WEB HTTP请求 WCF REST FUL

    首先上点概念WCF 很好的支持了 REST 的开发, 而 RESTful 的服务通常是架构层面上的考虑. 因为它天生就具有很好的跨平台跨语言的集成能力,几乎所有的语言和网络平台都支持 HTTP 请求, ...

  9. Super超级ERP系统---(10)订单打包

    订单拣货完成后,需要把订单装箱打包,并打印客户地址信息.订单打包的操作流程先是扫描订单号,然后扫描商品条码.  1.订单打包 打印包装箱面单 2.订单发货 订单打包完成后就等待发货,快递公司来拉货的时 ...

  10. 5个对话框和FileStream:文件流

    1.private void button1_Click(object sender, EventArgs e) { colorDialog1.ShowDialog();//显示颜色选择器 panel ...