2011-11-06 23 views
8

Farklı kaynaklara dayalı olarak aşağıdaki UIDevice kategorisini yazdım. platformCode yöntemini yükselttim, böylece görülemeyeceğinizden daha düşük seviyede.Kullanıcının cihazını iOS SDK ve tam Cocoa Touch/Objective-C kodunu kullanarak belirleyin.

Bu, mükemmel çalışır, ancak platformCode yöntemi düşük düzeydedir. Bu tür bir aramanın Kakao Touch koduyla değiştirilip değiştirilmediğini biliyor musunuz?

UIDevice_enhanced.h

@interface UIDevice (Enhanced) 

typedef enum { 
    kUnknownPlatform = 0, 
    kiPhone1G, 
    kiPhone3G, 
    kiPhone3GS, 
    kiPhone4, 
    kiPhone4Verizon, 
    kiPhone4S, 
    kiPodTouch1G, 
    kiPodTouch2G, 
    kiPodTouch3G, 
    kiPodTouch4G, 
    kiPad, 
    kiPad2Wifi, 
    kiPad2GSM, 
    kiPad2CMDA, 
    kSimulator 
} PlatformType; 

- (NSString *) platformName; 
- (PlatformType) platform; 

@end 

Bu bunu yapmanın bir "objektif-c" yolu olarak kabul edilebilir

#import "UIDevice_enhanced.h" 
#include <sys/utsname.h> 

@interface UIDevice (Enhanced) 
- (NSString *) platformCode; 
@end 


@implementation UIDevice (Enhanced) 

// Utility method (private) 
- (NSString*) platformCode { 
    struct utsname systemInfo; 
    uname(&systemInfo); 
    NSString* platform = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; 

    return platform; 
} 

// Public method to use 
- (NSString*) platformName { 
    NSString* platform = [self platformCode]; 

    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,2"]) return @"Verizon iPhone 4"; 
    if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; 
    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 platform; 
} 

// Public method to use 
- (PlatformType) platform { 
    NSString *platform = [self platformCode]; 
    if ([platform isEqualToString:@"iPhone1,1"]) return kiPhone1G; 
    if ([platform isEqualToString:@"iPhone1,2"]) return kiPhone3G; 
    if ([platform isEqualToString:@"iPhone2,1"]) return kiPhone3GS; 
    if ([platform isEqualToString:@"iPhone3,1"]) return kiPhone4; 
    if ([platform isEqualToString:@"iPhone3,2"]) return kiPhone4Verizon; 
    if ([platform isEqualToString:@"iPhone4,1"]) return kiPhone4S; 
    if ([platform isEqualToString:@"iPod1,1"])  return kiPodTouch1G; 
    if ([platform isEqualToString:@"iPod2,1"])  return kiPodTouch2G; 
    if ([platform isEqualToString:@"iPod3,1"])  return kiPodTouch3G; 
    if ([platform isEqualToString:@"iPod4,1"])  return kiPodTouch4G; 
    if ([platform isEqualToString:@"iPad1,1"])  return kiPad; 
    if ([platform isEqualToString:@"iPad2,1"])  return kiPad2Wifi; 
    if ([platform isEqualToString:@"iPad2,2"])  return kiPad2GSM; 
    if ([platform isEqualToString:@"iPad2,3"])  return kiPad2CMDA; 
    if ([platform isEqualToString:@"i386"])   return kSimulator; 

    return kUnknownPlatform; 
} 

@end 
+0

Bu (bütün C kodu gibi) tamamen geçerli Objective-C, o düşük seviyeli (I çeteleler kullanmanızı tavsiye yerine yok çok da değil sonlu çoktan seçmeli kümeler için dizeler. –

cevap

2

UIDevice_enhanced.m:

İlgili kod İşte
// Utility method (private) 
- (NSString *)platformCode { 
    // This may or not be necessary 
    // Im not sure if you can have a device thats not currentDevice can you? 
    // if ([self isEqual:[UIDevice currentDevice]]) { 

    NSString* platform =  [[self.systemName copy] autorelease]; 
    return platform; 

    // Could probably shorten to just 
    // return [[self.systemName copy] autorelease]; 

    // or - return [NSString stringWithString:self.systemName]; 
} 

Bu, utsnamemachine nesnesinin bir versiyonudur (bu satırdan: NSString* platform =  [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];).

utsname:

içerir <sys/utsname.h> başlık tanımlar yapı utsname, en azından şu üyeleri: işletim sisteminin bu düğüm
char nodename[] adı bu uygulamasının

char sysname[]     adı Uygulamaya bağlı bir iletişim ağı içinde
sistem

UIDevice Class Reference çalıştığı
char version[]     bu geçerli sürümü seviyesi donanım Çeşidi
char machine[]     adını bırakın ait    Mevcut yayın düzeyi bu uygulama:

systemName Alıcı tarafından temsil edilen cihazda çalışan işletim sisteminin adı . (Salt okunur)
@property (nonatomic, readonly, retain) NSString *system


Ama systemName sadece gerçek cihaz model numarasını almak için, "iPhone OS" @ döner beri, sen c kodu kullanmak zorunda. Bunu yapmanın başka bir yolu:

#include <sys/types.h> 
#include <sys/sysctl.h> 

- (NSString *)machine { 
    size_t size; 

    // Set 'oldp' parameter to NULL to get the size of the data 
    // returned so we can allocate appropriate amount of space 
    sysctlbyname("hw.machine", NULL, &size, NULL, 0); 

    // Allocate the space to store name 
    char *name = malloc(size); 

    // Get the platform name 
    sysctlbyname("hw.machine", name, &size, NULL, 0); 

    // Place name into a string 
    NSString *machine = [NSString stringWithCString:name]; 

    // Done with this 
    free(name); 

    return machine; 
} 
+0

Evet, bu objektif-C, fakat bu cihazların farklılaşmasına izin vermiyor ... – Oliver

+0

'platformCode' yönteminin c kodunu objektif-c'ye nasıl çevireceğinizi mi düşündünüz? Sorduğun başka bir şey var mıydı? – chown

+0

Hayır, tam olarak istediğim şey buydu, ama kodunuz C çağrısından aynı değerleri geri getirmiyor, gerçekten daha az fakir. Aslında, gördüğüm kadarıyla, C çağrısından da aynı hedefe ulaşmak için kullanılabilecek hiçbir şey döndürmez. – Oliver

1

infoString'i almak için düşük düzey C çağrısını kullanmanız gerekir. Benim amaçlarım için bunu özetleyen ve bir Objective-C arayüzü sunan küçük bir Objective-C kütüphanesi yazdım.

NSLog(@"Big model number: %d", deviceDetails.bigModel); 
//Big model number: 4 

NSLog(@"Small model number: %d", deviceDetails.smallModel); 
//Small model number: 1 

if (deviceDetails.model == GBDeviceModeliPhone4S) { 
    NSLog(@"It's a 4S"); 
} 
//It's a 4S 

if (deviceDetails.family != GBDeviceFamilyiPad) { 
    NSLog(@"It's not an iPad"); 
} 
//It's not an iPad 

NSLog(@"systemInfo string: %@", [GBDeviceInfo rawSystemInfoString]); 
//systemInfo string: iPhone4,1 

Sen github üzerinde alabilirsiniz isterseniz: GBDeviceInfo