NSObject+DeviceInfo.m 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. //
  2. // NSObject+DeviceInfo.m
  3. // Connect
  4. //
  5. // Created by 朱东勇 on 2017/5/25.
  6. // Copyright © 2017年 innovator. All rights reserved.
  7. //
  8. /**
  9. "compatible" = <"iMac9,1">
  10. "version" = <"1.0">
  11. "board-id" = <"Mac-F2218EA9">
  12. "IOInterruptSpecifiers" = (<0900000005000000>)
  13. "IOPolledInterface" = "SMCPolledInterface is not serializable"
  14. "serial-number" = <30544600000000000000000000313739343330303430544600000000000000000$
  15. "IOInterruptControllers" = ("io-apic-0")
  16. "IOPlatformUUID" = "D0XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXFB"
  17. "IOPlatformArgs" = <0060880280ffffff0010880280ffffff18de8c0280ffffff0000000000000000$
  18. "clock-frequency" = <005a6b3f>
  19. "manufacturer" = <"Apple Inc.">
  20. "IOConsoleSecurityInterest" = "IOCommand is not serializable"
  21. "IOPlatformSerialNumber" = "17XXXXXXXTF"
  22. "system-type" = <01>
  23. "product-name" = <"iMac9,1">
  24. "model" = <"iMac9,1">
  25. "name" = <"/">
  26. "IOBusyInterest" = "IOCommand is not serializable"
  27. */
  28. #import "NSObject+DeviceInfo.h"
  29. NSString* GetDeviceInfo(NSString *key) {
  30. NSString *ret = nil;
  31. io_service_t platformExpert ;
  32. platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice")) ;
  33. if (platformExpert) {
  34. CFTypeRef serialNumberAsCFString ;
  35. serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert, (__bridge CFStringRef)(key), kCFAllocatorDefault, 0) ;
  36. if (serialNumberAsCFString) {
  37. ret = [(__bridge NSString *)(serialNumberAsCFString) copy];
  38. CFRelease(serialNumberAsCFString);
  39. serialNumberAsCFString = NULL;
  40. }
  41. IOObjectRelease(platformExpert);
  42. // platformExpert = 0;
  43. }
  44. return ret;
  45. }
  46. NSString *GetProductName() {
  47. NSData *data = (NSData*)GetDeviceInfo(@"product-name");
  48. if ([data isKindOfClass:[NSString class]])
  49. return (NSString*)data;
  50. return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  51. }
  52. NSString *GetHardwareUUID() {
  53. NSData *data = (NSData*)GetDeviceInfo(@"IOPlatformUUID");
  54. if ([data isKindOfClass:[NSString class]])
  55. return (NSString*)data;
  56. return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  57. }
  58. NSString *GetHardwareSerialNumber() {
  59. NSData *data = (NSData*)GetDeviceInfo(@"IOPlatformSerialNumber");
  60. if ([data isKindOfClass:[NSString class]])
  61. return (NSString*)data;
  62. return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  63. }
  64. NSString *GetCompatible() {
  65. NSData *data = (NSData*)GetDeviceInfo(@"compatible");
  66. if ([data isKindOfClass:[NSString class]])
  67. return (NSString*)data;
  68. return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  69. }
  70. NSString *GetSystemVersion() {
  71. @try {
  72. NSTask *task = [[NSTask alloc] init];
  73. [task setLaunchPath: @"/usr/bin/sw_vers"];
  74. NSArray *arguments = [NSArray arrayWithObjects: @"-productVersion", nil];
  75. [task setArguments: arguments];
  76. NSPipe *pipe = [NSPipe pipe];
  77. [task setStandardOutput: pipe];
  78. [task launch];
  79. [task waitUntilExit];
  80. if ([task terminationStatus] != 0) {
  81. NSLog(@"Error: Task terminated with non-zero status %d", [task terminationStatus]);
  82. return nil;
  83. }
  84. NSFileHandle *file = [pipe fileHandleForReading];
  85. NSData *data = [file readDataToEndOfFile];
  86. if (!data) {
  87. NSLog(@"Error: Failed to read data from task output pipe");
  88. return nil;
  89. }
  90. NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  91. string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  92. return string;
  93. } @catch (NSException *exception) {
  94. NSLog(@"Exception: %@", exception);
  95. return nil;
  96. }
  97. }