Сделать приложение для iPhone конкретного приложения на iPad для удовлетворения требований Apple

Мое приложение было в AppStore уже пару месяцев и всегда работало только на iPhone. Недавно я представил обновление, которое было отклонено, потому что приложение не запускается на iPad. Точная причина отказа была:

Причины отторжения: 2.10: iPhone-приложения также должны работать на iPad без изменений, при разрешении iPhone и при разрешении 2X iPhone 3GS

Что мне нужно сделать в Xcode, чтобы приложение запускалось на iPad в маленькой коробке с иконкой 2X?

Любые советы по подсказкам будут широко оценены...

ИЗМЕНИТЬ Это мой info.plist. Это мое первое приложение, и я думаю, что сначала я решил настроить его на "универсальный". Есть ли простой способ вернуть меня сейчас?

PLIST contents...

Ответ 1

Начните с выяснения, почему ваше приложение уже не работает на iPad. Большинство приложений, разработанных для iPhone, отлично работают на iPad (в режиме совместимости) без каких-либо изменений; если у вас нет, вы должны что-то делать, чтобы предотвратить это. Вы полагаетесь на некоторые аппаратные функции? Сделать необоснованные предположения относительно устройства, на котором вы работаете? Как ваше приложение терпит неудачу при запуске на iPad?

Как только вы выясните, почему это не работает, вы будете намного ближе, чем сейчас, чтобы решить проблему.

Ответ 2

Чтобы ваше приложение запускалось на iPad в режиме совместимости с iPhone, вам нужно только создать приложение для iPhone.

Удалите все ссылки на iPad из аппликатора (база ножей, xib и раскадровка) и из целевого семейства целевых настроек.

Ответ 3

У меня была такая же проблема, я смог запустить свое приложение на ipad после внесения следующих изменений.

  • в настройках проекта Устройства были установлены на iPhone (ранее это было универсально)
  • в .plist удалил основное имя файла базы данных, связанное с ipad.

Ответ 4

Я решил эту проблему, используя этот сценарий.

Вы должны проверить нормальные изображения и изображения сетчатки в папке ресурсов.

Вы также можете получить эту ошибку при отладке Could not load the "image.png" image referenced from a nib in the bundle with identifier.

Обычное приложение для iPhone должно запускаться на iPad в обоих режимах (1x и 2x) без изменений. Вы можете проверить это с помощью SDK Simulator.

В Руководстве по обзору App Store в Apple Developer Developer Center есть длинный список, в котором перечислены многие вещи, которые Apple рассматривает при отправке приложения. Прочтите внимательно.

Ответ 5

Я попытаюсь объяснить, что моя проблема и решение было.

У меня есть только приложение iPhone, которое в основном находится на портрете, из-за 1 или 2 UIViewControllers, которые должны быть во всех UIInterfaceOrientations, я должен включить все UIInterfaceOrientations в моем plist.

При запуске приложения на iPad, который вращается в ландшафте и лежит на столе (так что есть UIDeviceOrientationFaceUp), все приложение было показано в ландшафте, что сделало мой пользовательский интерфейс полностью испорченным.

У меня не было ссылки на какой-либо код/​​настройки, связанные с iPad, на моем экране или на экранах запуска (я использую .xcassets для экранов запуска).

Я исправил это, добавив 1 строку кода в мой AppDelegate.m, который устанавливает ориентацию панели состояния, чтобы заставить приложение в портретном режиме.

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];

    //Further setup
}

Ответ 6

У меня была такая же проблема, используя Cocos2d 2.0

Моя проблема заключалась в том, что проект развивался в течение нескольких лет и выполнял некоторые рудиментарные файлы, такие как RootViewController и UIViewController и MyRootViewController и т.д.

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

Несмотря на то, что я был (и все еще) обеспокоен этим, я подумал, что, возможно, теперь я мог бы по крайней мере очистить проект более элегантным решением, которое справляется с базовой проблемой: вращение устройства + вращение содержимого. Я закончил тем, что использовал что-то из более недавнего проекта, над которым работал, и казался более элегантным и фактически работал: просто добавьте MyNavigationController в начало моего AppDelegate.

Я добавил код ниже. Я уверен, что его можно улучшить. Прошу прокомментировать, если вы можете улучшить его.

В результате я смог удалить старые файлы RootViewController и MyRootViewController, так что теперь их легче поддерживать. Я никогда не понимал их цели очень хорошо. Хорошее избавление!

Вот мое решение для отображения и согласования ориентации устройства + ориентация содержимого:

в AppDelegate.h Мне пришлось объявить, что я делаю:

//верхняя часть файла

@interface MyNavigationController: UINavigationController @end

//внутри интерфейса AppDelegate.h

MyNavigationController * navController _;

//нижняя часть файла перед @end

@property (только для чтения) MyNavigationController * navController;

Вот код, который работает в верхней части моего AppDelegate.m

@implementation MyNavigationController

// The available orientations should be defined in the Info.plist file.
// And in iOS 6+ only, you can override it in the Root View controller in the "supportedInterfaceOrientations" method.
// Only valid for iOS 6+. NOT VALID for iOS 4 / 5.

-(NSUInteger)supportedInterfaceOrientations {

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

if (orientation == UIDeviceOrientationPortrait) {

    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

        // [director_ pushScene: [IPAD scene]];

    } else {

        [[CCDirectorIOS sharedDirector] pushScene:[VerticalDisplayLayer scene]];

        return UIInterfaceOrientationMaskPortrait;

    }


} else if (orientation == UIDeviceOrientationLandscapeLeft) {


    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

       //  [director_ pushScene: [IPAD scene]];

    } else {

        [[CCDirectorIOS sharedDirector] pushScene:[MainMenuScene scene]];

    }



} else if (orientation == UIDeviceOrientationLandscapeRight) {


    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

        // [director_ pushScene: [IPAD scene]];

    } else {

        [[CCDirectorIOS sharedDirector] pushScene:[MainMenuScene scene]];

    }


} else if (orientation == UIDeviceOrientationPortraitUpsideDown) {

    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

    } else {

        [[CCDirectorIOS sharedDirector] pushScene:[VerticalDisplayLayer scene]];

        return UIInterfaceOrientationMaskPortraitUpsideDown;

    }

} else {

    //do nothing
}

return UIInterfaceOrientationMaskLandscape;

}

//this is the one for iOS 6
- (BOOL)shouldAutorotate {

//NSLog(@"MyNavigationController - should Rotate ToInterfaceOrientation ...");

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

// iPhone only
if( [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone ) {

    //NSLog(@"MyNavigationController - should Rotate iPhone");

    if (orientation == UIDeviceOrientationPortrait) {

        //NSLog(@"should Rotate iPhone orientation is Portrait");

        [[CCDirectorIOS sharedDirector] pushScene:[VerticalDisplayLayer scene]];

        return UIInterfaceOrientationMaskPortrait;

    }

    if (orientation == UIDeviceOrientationPortraitUpsideDown) {

        //NSLog(@"should Rotate iPhone orientation is PortraitUpsideDown");

        [[CCDirectorIOS sharedDirector] pushScene:[VerticalDisplayLayer scene]];

        return UIInterfaceOrientationMaskPortraitUpsideDown;

    }

    if (orientation == UIDeviceOrientationLandscapeLeft) {

        //NSLog(@"should Rotate iPhone orientation is Landscape Left");

        return UIInterfaceOrientationMaskLandscape;
    }

    if (orientation == UIDeviceOrientationLandscapeRight) {

        //NSLog(@"should Rotate iPhone orientation is Landscape Right");

        return UIInterfaceOrientationMaskLandscape;
    }


    return TRUE;

}

//return UIInterfaceOrientationIsLandscape(interfaceOrientation);

if( [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad ) {

    //NSLog(@"MyNavigationController - should Rotate iPad");

    return TRUE;

}


return TRUE;
}


// Supported orientations. Customize it for your own needs
// Only valid on iOS 4 / 5. NOT VALID for iOS 6.
- (BOOL)shouldAutorotateToInterfaceOrientation:    (UIInterfaceOrientation)interfaceOrientation
{

// iPhone only
if( [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone )


    return TRUE;
//return UIInterfaceOrientationIsLandscape(interfaceOrientation);


if( [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad )

    return TRUE;

// iPad only
// iPhone only
//return UIInterfaceOrientationIsLandscape(interfaceOrientation);

return TRUE;
}

// This is needed for iOS4 and iOS5 in order to ensure
// that the 1st scene has the correct dimensions
// This is not needed on iOS6 and could be added to the application:didFinish...
-(void) directorDidReshapeProjection:(CCDirector*)director
{
if(director.runningScene == nil) {
    // Add the first scene to the stack. The director will draw it immediately into the framebuffer. (Animation is started automatically when the view is displayed.)
    // and add the scene to the stack. The director will run it when it automatically when the view is displayed.
    [director runWithScene: [MainMenuScene scene]];
}
}


-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
// Assuming that the main window has the size of the screen
// BUG: This won't work if the EAGLView is not fullscreen

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGRect rect = CGRectZero;

//NSLog(@"MyNavigationController - Will RotateToInterfaceOrientation ...");

if(toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)  {

    rect = screenRect;


} else if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {

    rect.size = CGSizeMake( screenRect.size.height, screenRect.size.width );

}

CCDirector *director = [CCDirector sharedDirector];
CCGLView *glView = (CCGLView *)[director view];
glView.frame = rect;
}

@end

Вот почему я должен был решить это:

  • Мне нужны режимы "Пейзаж" и "Портрет" для отображения разных сцен.

Вот несколько скриншотов, описывающих ситуацию.

JR Chemistry Set

most of the app orientation is landscape like this photo shows

other areas were only triggered when you turned the device

2 apps in one!