2014-10-16 2 views
0

Я делаю приложение, которое использует 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.

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

Итак, почему мое приложение не показывает вид предупреждения на iPad? На консоли нет ошибок.

EDIT: уведомление без кнопок не будет в конечном продукте, просто в процессе тестирования. Однако точка остается, поскольку предупреждение все еще должно появляться.

+0

Apple не позволит вам это сделать. Приложения для iPhone ДОЛЖНЫ работать как на iPad. Вы можете сделать приложение, конечно, определенным, но в целом ваша попытка предотвратить запуск на iPad не будет работать и не будет принята, если это произойдет. – rmaddy

+0

@rmaddy Я знаю, это просто проверка системы во время разработки. Независимо от того, нравится это яблоку или нет, эта работа должна работать в симуляторе, но это не так. –

+0

@rmaddy, вероятно, должен был упомянуть об этом в вопросе. Я только что отредактировал вопрос, чтобы сделать это ясно. –

ответ

1

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

PS, Извините за мой первый ответ, не прочитав вопрос правильно.

+0

Спасибо, работает как шарм. И не беспокойтесь, мы все это сделали. –

0

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

I've changed this one to match the iPhone only

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

Теперь, в этом случае, вы все равно завершаете работу iPads с приложениями 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

одно место, чтобы получить старт на него,

и ссылки коллекции черта курса яблока

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

0

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

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

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

Смежные вопросы