2011-11-06 6 views
8

次のUIDeviceカテゴリは、さまざまなソースに基づいて作成しました。私はplatformCodeメソッドをアップグレードしましたので、見た目よりも低レベルです。iOS SDKと完全なCocoa Touch/Objective-Cコードを使用してユーザーのデバイスを決定する

これは完全に機能しますが、platformCodeメソッドは低レベルです。この種のコールをCocoa Touchコードに置き換えることができるかどうか知っていますか?ここでは、関連するコードがあります:

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 

UIDevice_enhanced.m

#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

をこれは、それはあまりにも低レベルの完全に有効なのObjective-C(すべてのCコードなど)ではありませんされて(私は列挙型を使用してではなく、お勧めですか有限多項選択集合のための文字列)。 –

答えて

2

これはそれを行うための "Objective-Cの" 方法と考えることができる。

// 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]; 
} 

これはutsnamemachineのobj-cバージョンです(この行から:NSString* platform =  [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];)。

utsname

を含む<sys/utsname.h>ヘッダが定義構造のutsname、少なくとも以下のメンバー:オペレーティングシステム、このノードの
char nodename[]名前のこの実施の

char sysname[]    名実装に依存するもの 通信ネットワーク
システムは

UIDevice Class Referenceを実行している
char version[]    この の現在のバージョンレベルは、ハードウェアタイプの
char machine[]    名を解放 の   現在のリリースレベルこの実装:

systemNameデバイス上で実行されているオペレーティングシステムの名前。受信者が表す 。 (読み取り専用)
@property (nonatomic, readonly, retain) NSString *system


しかし、SYSTEMNAMEは唯一の実際のデバイスのモデル番号を取得するには、 "iPhone OS" @を返すために、あなたがCのコードを使用する必要があります。

#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

はい、これはobjective-Cですが、デバイスを区別することはできません... – Oliver

+0

'platformCode'メソッドのcコードをobjective-cに変換する方法を尋ねていると思いましたか?あなたが聞いていたことがありましたか? – chown

+0

いいえ、それはまさに私が求めていたものでしたが、あなたのコードはCの呼び出しと同じ値を返しませんでした。実際、私が見た限り、Cコールと同じ目標を達成するために使用できるものは返されません。 – Oliver

1

infoStringを取得するには、低レベルのCコールを使用する必要があります。私の目的のために、これを抽象化し、Objective-Cインタフェースを提示する小さなObjective-Cライブラリを作成しました。

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 

あなたが好きならgithubの上でそれを得ることができます:GBDeviceInfo

関連する問題