Не удается определить устройство как iPad

Я делаю приложение, использующее 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") взят из этой сути.

UIAlertController должен показывать, когда устройство является iPad, не работает под управлением iOS 8.0+ или просто (по какой-то другой причине) не может использовать HealthKit. На бумаге все это хорошо, но когда я запускаю приложение на симуляторе iPad 2 под управлением iOS 8, приложение запускается в обычном режиме и не отображает предупреждение. Для записи, я знаю, что у предупреждения нет кнопок, но я не хочу, чтобы оно исчезало. Он должен отображаться только на iPad или устройстве с iOS 8 ниже, и поэтому не должен исчезать, когда он отображается.

Так почему же мое приложение не отображает окно предупреждений на iPad? Консоль не показывает ошибок.

РЕДАКТИРОВАТЬ: Уведомление без кнопок не будет в конечном продукте, только в тестировании. Однако суть остается прежней, так как предупреждение все еще должно отображаться.


person Will Eccles    schedule 16.10.2014    source источник
comment
Apple не позволит вам этого сделать. Приложения только для iPhone ДОЛЖНЫ работать на iPad как есть. Конечно, вы можете заставить приложение требовать определенных вещей, но в целом ваша попытка предотвратить запуск на iPad не сработает и не будет принята, если бы это было так.   -  person rmaddy    schedule 17.10.2014
comment
@rmaddy Я знаю, это просто для проверки системы в процессе разработки. Нравится это Apple или нет, но это должно работать в симуляторе, но это не так.   -  person Will Eccles    schedule 17.10.2014
comment
@rmaddy, наверное, должен был упомянуть об этом в вопросе. Я только что отредактировал вопрос, чтобы прояснить это.   -  person Will Eccles    schedule 17.10.2014
comment
Приложения только для iPhone не знают, что они на iPad. userIntefaceIdiom вернет iPhone даже на iPad для приложения только для iPhone.   -  person rmaddy    schedule 17.10.2014
comment
@rmaddy Я добавил это просто на всякий случай, хотя технически я мог бы удалить его.   -  person Will Eccles    schedule 17.10.2014
comment
Вы проверили, что семейство устройств установлено на универсальное? Кажется, решена аналогичная проблема, заданная в этом вопросе   -  person Lev Landau    schedule 17.10.2014
comment
@LevLandau Я не хотел, чтобы это было универсальное приложение, но я понял, что будет проще сделать его единым: / Я сейчас отвечу на свой вопрос.   -  person Will Eccles    schedule 17.10.2014
comment
@LevLandau Вообще-то, не могли бы вы дать такой ответ? Я не могу принять свой ответ в течение 2 дней, но могу принять ваш сейчас.   -  person Will Eccles    schedule 17.10.2014


Ответы (3)


Вы проверили, что семейство устройств установлено на универсальное? Если он установлен на iPhone, то идиома пользователя никогда не будет iPad. Похоже, что создание универсального приложения решило аналогичную проблему, заданную в этом вопросе

PS Прошу прощения за мой первый ответ, который не прочитал вопрос должным образом.

person Lev Landau    schedule 17.10.2014
comment
Спасибо, работает как шарм. И не беспокойтесь, мы все это сделали. - person Will Eccles; 29.10.2014

Если вы хотите настроить таргетинг только на iPhone, правильный способ сделать это - установить его в целях развертывания.

Я изменил этот, чтобы он соответствовал только iPhone

Я изменил его, чтобы он соответствовал только iPhone

Теперь, в этом случае, вы по-прежнему будете работать с iPad с приложениями iPhone с помощью метода «масштабирования» (путем масштабирования версии 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

одно место для начала,

и, конечно же, ссылка на коллекцию признаков от Apple

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

person domitall    schedule 16.10.2014

Попробуйте что-то вроде этого:

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

Я считаю, что это должно работать даже при запуске приложения только для iPhone на iPad.

person Dominik Hadl    schedule 16.10.2014