在兼容模式下检测在iPad上运行的iPhone应用程序

时间:2010-07-14 00:47:33

标签: iphone objective-c cocoa-touch ipad

我的iPhone应用程序不是通用的,但它有一个功能,我想为在iPad上玩的人启用。有没有办法在兼容模式下检测到你在iPad上运行?用于检测机器规格的UIDevice方法都返回您在iPhone上获得的值(至少在模拟器上)。我唯一能想到的就是检测OS 3.2,但这种技术不会长久发挥作用。

4 个答案:

答案 0 :(得分:20)

最初在这里回答:https://stackoverflow.com/a/14864400/577237

重新发布,因为它太短了:

如果应用程序是在iPad上以模拟器模式运行的iPhone应用程序,它将具有Phone的userInterfaceIdiom,但是具有iPad的型号类型。您可以使用以下代码进行检查:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone &&
    [[[UIDevice currentDevice] model] hasPrefix:@"iPad"]) {
    // This app is an iPhone app running on an iPad
}

答案 1 :(得分:9)

1)使用Erica Sadun撰写的 UIDevice-Extension 。一个非常全面的课程: http://github.com/erica/uidevice-extension/blob/master/UIDevice-Hardware.m

2)或者您也可以使用 UIDevice 类方法:

[[UIDevice currentDevice] name]              // eg. "Brock's iPhone"
[[UIDevice currentDevice] model]             // eg. @"iPhone", @"iPod Touch"
[[UIDevice currentDevice] localizedModel]    // localized version of model
[[UIDevice currentDevice] systemName]        // eg. @"iPhone OS"
[[UIDevice currentDevice] systemVersion]     // eg. @"3.2"
[[UIDevice currentDevice] uniqueIdentifier]  // UDID, a unique string to identify the device

上述每一行都会返回NSString。您可以像这样进行字符串比较:

NSString *model = [[UIDevice currentDevice] model];
NSLog(@"Current device model: \"%@\"", model);

3)另一种方式

http://www.drobnik.com/touch/2009/07/determining-the-hardware-model/ 您需要对其进行修改才能使用适合iPad的硬件编号。取自上面的链接:

的UIDevice-hardware.h

#import 

#define IPHONE_1G_NAMESTRING @"iPhone 1G"
#define IPHONE_3G_NAMESTRING @"iPhone 3G"
#define IPHONE_3GS_NAMESTRING @"iPhone 3GS"
#define IPOD_1G_NAMESTRING @"iPod touch 1G"
#define IPOD_2G_NAMESTRING @"iPod touch 2G"

@interface UIDevice (Hardware)
- (NSString *) platform;
- (NSString *) platformString;
@end

的UIDevice-hardware.m

#import "UIDevice-hardware.h"
#include <sys/types.h>
#include <sys/sysctl.h>

@implementation UIDevice (Hardware)

/*
 Platforms
 iPhone1,1 = iPhone 1G
 iPhone1,2 = iPhone 3G
 iPhone2,1 = iPhone 3GS
 iPod1,1   = iPod touch 1G
 iPod2,1   = iPod touch 2G
 */

- (NSString *) platform
{
 size_t size;
 sysctlbyname("hw.machine", NULL, &amp;size, NULL, 0);
 char *machine = malloc(size);
 sysctlbyname("hw.machine", machine, &amp;size, NULL, 0);
 NSString *platform = [NSString stringWithCString:machine];
 free(machine);
 return platform;
}

- (NSString *) platformString
{
 NSString *platform = [self platform];
 if ([platform isEqualToString:@"iPhone1,1"]) return IPHONE_1G_NAMESTRING;
 if ([platform isEqualToString:@"iPhone1,2"]) return IPHONE_3G_NAMESTRING;
 if ([platform isEqualToString:@"iPhone2,1"]) return IPHONE_3GS_NAMESTRING;
 if ([platform isEqualToString:@"iPod1,1"])   return IPOD_1G_NAMESTRING;
 if ([platform isEqualToString:@"iPod2,1"])   return IPOD_2G_NAMESTRING;
 return NULL;
}
@end

答案 2 :(得分:3)

您检查过“UIDevice.h”吗?它有模型属性,你可以找到iPhone,iPod,iPad设备

  

NSString *名称; //   例如“我的iPhone”

     

NSString *模型; //   例如@“iPhone”,@“iPod Touch”

     

NSString * localizedModel; //   模型的本地化版本

     

NSString * systemName; //   例如@“iPhone OS”

     

NSString * systemVersion; //   例如@ “2.0”

     

NSString * uniqueIdentifier; (已弃用) // a   基于的每个设备唯一的字符串   各种硬件信息。

答案 3 :(得分:0)

如果您需要知道是否在iPad上运行iPhone应用程序,那么可以将界面缩小到iPhone 4S大小,值得注意的是,在12.9英寸iPad上运行的iPhone应用程序以iPhone SE大小显示。添加对主屏幕比例尺的检查将解决此问题。

var isSmalliPhoneAppRunningOniPad: Bool {
    return UIDevice.current.userInterfaceIdiom == .phone &&
           UIDevice.current.model.hasPrefix("iPad") && 
           UIScreen.main.scale == 2
}