无法将设备检测为iPad

问题描述:

我正在制作使用HealthKit的应用程序。该应用程序不能在iPad上工作,因此我的viewDidLoad方法包含一个if/then/else语句以向iPad用户显示警报。这是我的代码:无法将设备检测为iPad

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone && SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0") && [HKHealthStore isHealthDataAvailable] == 1) { 
    ... 
} 
else { 
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Whoops!" message:@"Looks like your device doesn't support HealthKit :(" preferredStyle:UIAlertControllerStyleAlert]; 
    [self presentViewController:alertController animated:1 completion:^(){ 
     NSLog(@"Showed error alert because of unsupported device."); 
    }]; 
} 

SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")位来自this gist

时,该设备是一台iPad,是不是运行iOS 8.0或更高版本,或者只是(某些其他原因)的UIAlertController应该显示不能使用HealthKit。这一切都很好,但是当我在运行iOS 8的iPad 2模拟器上运行应用程序时,该应用程序将正常启动并且不显示警报。为了记录,我知道警报没有按钮,但我不希望它消失。它只能显示在iPad或iOS 8以下的设备上,因此在显示时不需要消失。

那么,为什么我的应用程序没有显示在iPad上的警报视图?控制台显示没有错误。

编辑:无按钮通知将不会在最终的产品,只是在测试中。然而,这一点仍然存在,因为警报仍应该显示出来。

+0

苹果不会让你这样做。仅限iPhone的应用程序必须在iPad上按原样运行。您当然可以让应用程序需要某些东西,但总的来说,您尝试阻止在iPad上运行将不起作用,如果它确实不会被接受。 – rmaddy 2014-10-16 21:42:50

+0

@rmaddy我知道,这只是为了在开发过程中测试系统。无论苹果是否喜欢它,这个_应该在模拟器中工作,但它不会。 – 2014-10-16 21:46:49

+0

@rmaddy可能应该在问题中提到这一点。我刚刚编辑了这个问题以说明问题。 – 2014-10-16 21:48:21

是否检查该器件系列被设置为通用?如果它被设置为iPhone,则用户习惯用语永远不会是iPad。使应用普及似乎已经解决了这个question

PS问过类似的问题,道歉对我的第一个回答不读书的问题正确。

+0

谢谢,作品像一个魅力。不用担心,我们都做到了。 – 2014-10-29 16:57:24

如果你想只针对iPhone,去了解这个正确的方法是将它在你的部署目标

I've changed this one to match the iPhone only

我已经改变了这一个相匹配的iPhone只

现在,既然如此,您仍然可以通过“扩展”方法(通过缩放iPhone版本以适应iPad)来结束运行iPhone应用程序的iPad。

如果你仍然想在这种情况下该警报,那么您可以在您的viewDidLoad

if (self.traitCollection.userInterfaceIdiom == UIUserInterfaceIdiomPad) { 
    NSLog(@"I'm an ipad"); 

    UIAlertController *alert = [ UIAlertController alertControllerWithTitle:@"Sorry dude, no iPads" message:@"go buy an iphone" preferredStyle:UIAlertControllerStyleAlert]; 

    [self presentViewController:alert animated:YES completion:^{}]; 
    } 

在这种情况下删除此我使用了新的traitCollection属性来确定接口成语。

如果你只是想避免更大的屏幕,那么我建议着眼于规模类按iOS 8的这肯定将是最好的途径。

http://www.learnswift.io/blog/2014/6/12/size-classes-with-xcode-6-and-swift

一个地方得到它的一个开始,

当然苹果的特征集合引用和

https://developer.apple.com/library/IOs/documentation/UIKit/Reference/UITraitSet_ClassReference/index.html

尝试是这样的:

NSString *modelString = (NSString *)[UIDevice currentDevice].model; 
if ([modelString hasPrefix:@"iPad"]) 
{ 
    // iPad 
    return YES; 
} 

我相信这一点即使在iPad上运行仅iPhone应用程序也能工作。