zoukankan      html  css  js  c++  java
  • 【iOS开发系列】UIDevice设备信息

    【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来逃过苹果的检查

  • 相关阅读:
    详解JavaScript中的this
    java静态代理与动态代理简单分析
    BZOJ1263 [SCOI2006]整数划分
    BZOJ1258 [CQOI2007]三角形
    BZOJ1237 [SCOI2008]配对
    BZOJ1257 [CQOI2007]余数之和
    BZOJ1103 [POI2007]大都市
    BZOJ1061 [NOI2008]志愿者招募
    BZOJ1050 [HAOI2006]旅行
    BZOJ1055 [HAOI2008]玩具取名
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6994443.html
Copyright © 2011-2022 走看看