【问题标题】:Cannot detect device as iPad无法将设备检测为 iPad
【发布时间】:2014-10-16 21:38:39
【问题描述】:

我正在制作一个使用 HealthKit 的应用。该应用程序不能在 iPad 上运行,因此我的 viewDidLoad 方法包含一个 if/then/else 语句以向 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

UIAlertController 应该在设备是 iPad、未运行 iOS 8.0+ 或只是(出于某种其他原因)无法使用 HealthKit 时显示。这在纸面上一切都很好,但是当我在运行 iOS 8 的 iPad 2 模拟器上运行该应用程序时,该应用程序正常启动并且不显示警报。作为记录,我知道警报没有按钮,但我不希望它消失。它应该只在 iPad 或 iOS 8 以下的设备上显示,因此在显示时不需要消失。

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

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

【问题讨论】:

  • Apple 不会让你这样做。仅限 iPhone 的应用程序必须在 iPad 上按原样运行。当然,您可以让应用程序需要某些东西,但一般来说,您阻止在 iPad 上运行的尝试是行不通的,如果这样做了,也不会被接受。
  • @rmaddy 我知道,这只是为了在开发过程中测试系统。不管苹果喜欢与否,这应该在模拟器中工作,但它没有。
  • @rmaddy 可能应该在问题中提到这一点。我刚刚编辑了这个问题以明确这一点。
  • 仅限 iPhone 的应用程序不知道它们在 iPad 上。 userIntefaceIdiom 将返回“iPhone”,即使是在 iPad 上用于仅 iPhone 的应用程序。
  • @rmaddy 我在其中添加了一个只是为了更好地衡量,尽管我想我可以从技术上删除它。

标签: ios objective-c ipad uialertcontroller healthkit


【解决方案1】:

您是否检查过设备系列是否设置为通用?如果将其设置为 iPhone only,则用户惯用语永远不会是 iPad。使应用程序通用似乎已经解决了question

中提出的类似问题

PS,很抱歉我的第一个答案没有正确阅读问题。

【讨论】:

  • 谢谢,就像一个魅力。不用担心,我们都做到了。
【解决方案2】:

如果您只想定位 iPhone,正确的方法是在部署目标中设置它

我已将这个更改为仅与 iPhone 匹配

现在,既然如此,您仍然会通过“向上扩展”方法(通过向上扩展 iPhone 版本以匹配 iPad)让 iPad 运行 iPhone 应用程序。

如果您在这种情况下仍需要该警报,则可以将其放入 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

【讨论】:

    【解决方案3】:

    试试这样的:

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

    我相信即使在 iPad 上运行仅限 iPhone 的应用程序时,这也应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 2013-04-05
      相关资源
      最近更新 更多