12

我的应用程序已经在 AppStore 上架了几个月,而且一直只在 iPhone 上运行。我最近提交了一个更新,但由于该应用程序无法在 iPad 上运行而被拒绝。它被拒绝的确切原因是:

拒绝原因: 2.10:iPhone 应用程序也必须在 iPad 上运行,无需修改,以 iPhone 分辨率和 2X iPhone 3GS 分辨率运行

我需要在 Xcode 中做什么才能让我的应用程序在带有 2X 图标的小盒子中的 iPad 上运行?

任何提示说明将不胜感激...

编辑 这是我的 info.plist。这是我的第一个应用程序,我想我最初确实选择了设置它并选择了“通用”。我现在有一个简单的方法来纠正这个问题吗?

PLIST 内容...

4

6 回答 6

10

首先弄清楚为什么您的应用程序无法在 iPad 上运行。大多数为 iPhone 开发的应用程序无需修改即可在 iPad 上正常运行(在兼容模式下);如果你没有,你必须做一些事情来防止它。您是否依赖某些硬件功能?对您正在运行的设备做出毫无根据的假设?在 iPad 上运行时,您的应用程序如何失败?

一旦你弄清楚它为什么不起作用,你就会比现在更接近解决问题。

于 2012-05-10T05:07:16.080 回答
7

要让您的应用程序以 iPhone 兼容模式在 iPad 上运行,您只需为 iPhone 构建应用程序。

从应用程序的 plist(nib 基础、xib 和故事板)以及 Target Build Settings Targeted Device Family 中删除所有 iPad 引用。

于 2012-05-10T17:45:23.123 回答
4

我遇到了同样的问题,在进行以下更改后,我能够在 ipad 上运行我的应用程序。

  1. 在项目设置中将设备设置为 iPhone(以前是通用的)
  2. 在 .plist 中删除了与 ipad 相关的主故事板文件基本名称。
于 2012-08-24T10:06:31.543 回答
1

我已经使用这种情况解决了同样的问题。

您应该检查资源文件夹中的正常和视网膜图像。

您也可能在调试时遇到此错误Could not load the "image.png" image referenced from a nib in the bundle with identifier

一个普通的 iPhone 应用程序必须在 iPad 上以两种(1x 和 2x)模式运行而无需修改。您可以使用 SDK Simulator 进行检查。

Apple 的 iOS 开发者门户中心的 App Store Review Guidelines 中有一个很长的列表,其中列出了 Apple 在您提交应用程序时会审查这些内容的许多内容。仔细阅读。

于 2012-11-28T07:13:54.817 回答
0

我将尝试解释我的问题和解决方案是什么..

我有一个iPhone唯一的应用程序,它主要是纵向的,但是,因为 1 或 2UIViewControllers必须在 all 中UIInterfaceOrientations,我必须UIInterfaceOrientations在我的plist.

iPad当在一个横向旋转并躺在桌子上的应用程序上启动应用程序时(所以有UIDeviceOrientationFaceUp),整个应用程序都以横向显示,这让我的 UI 完全搞砸了。

在我的 plist 或启动屏幕中,我没有引用任何与 iPad 相关的代码/设置(我使用 .xcassets 作为启动屏幕)。

我通过向我添加 1 行代码来修复它,AppDelegate.m该代码设置状态栏方向以强制应用程序处于纵向模式。

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

    //Further setup
}
于 2015-06-24T10:00:12.723 回答
0

我在使用 Cocos2d 2.0 时遇到了同样的问题

我的问题是该项目已经发展了几年,并且带有一些现在已经退化的文件,例如 RootViewController 和 UIViewController 和 MyRootViewController 等。

他们当时工作,但显然已经向今天的审查委员会举了一个旗子,因为我收到了“所有 iPhone 应用程序必须在 iPad 上运行”的拒绝通知。在大声尖叫并最终接受失败后,我认为该政策使仅制作 iPhone 应用程序变得非常困难。让我知道我是否错了。

尽管我(现在仍然)对此感到不安,但我想也许现在我至少可以用一个更优雅的解决方案来处理基本问题:设备轮换 + 内容轮换。我最终使用了一个正在开发的项目中的一些东西,该项目看起来更优雅,实际上也很有效:只需将 MyNavigationController 添加到我的 AppDelegate 的顶部。

我在下面添加了代码。我确信它可以改进。如果您可以增强它,请发表评论。

结果,我能够删除旧的 RootViewController 和 MyRootViewController 文件,因此现在更易于维护。无论如何,我从来没有很好地理解他们的目的。甩掉包袱!

这是我显示和匹配设备方向+内容方向的解决方案:

在 AppDelegate.h 我必须声明我在做什么:

//文件顶部

@interface MyNavigationController : UINavigationController @end

//在AppDelegate.h接口里面

我的导航控制器 *navController_;

//@end之前的文件底部

@property (只读) MyNavigationController *navController;

这是在我的 AppDelegate.m 顶部工作的代码

@implementation 我的导航控制器

// 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

这就是我必须解决这个问题的原因:

  1. 我需要横向和纵向模式来显示不同的场景。

以下是一些描述情况的屏幕截图

JR 化学套装

大多数应用程序方向都是横向的,就像这张照片显示的那样

其他区域仅在您转动设备时触发

2个应用程序合二为一!

于 2015-07-09T00:47:35.257 回答