2012-05-10 3 views
11

La mia app è in AppStore da un paio di mesi e funziona sempre solo su iPhone. Di recente ho inviato un aggiornamento che è stato rifiutato perché l'app non funziona su un iPad. Il motivo esatto è stato respinto era:Effettuare un'app per iPhone specifica su iPad per soddisfare i requisiti Apple

motivi del rifiuto: 2.10: applicazioni per iPhone devono anche funzionare su iPad senza modifiche, ad una risoluzione di iPhone, e con risoluzione 2X iPhone 3GS

Cosa devo devi fare in Xcode per far funzionare la mia app su un iPad nella piccola scatola con l'icona 2X?

non contiene indicazioni suggerimenti saranno massicciamente apprezzati ...

EDIT Questo è il mio Info.plist. Questa è la mia prima App e penso di aver inizialmente scelto di configurarla con "universale" selezionato. C'è una via facile per me per rettificare questo ora?

PLIST contents...

+0

Hai provato in esecuzione sul simulatore di iPad? Hai @ 2x immagini? – Jamie

risposta

10

Inizio da capire il motivo per cui la vostra applicazione non funziona su iPad già. La maggior parte delle app sviluppate per iPhone funzionerà correttamente su un iPad (in modalità compatibilità) senza modifiche; se il tuo no, devi fare qualcosa per impedirlo. Stai facendo affidamento su alcune funzionalità hardware? Fare ipotesi infondate sul dispositivo su cui stai lavorando? Come funziona la tua app quando viene eseguita su un iPad?

Una volta capito il motivo per cui non funziona, sarai molto più vicino di quanto non sia ora a risolvere il problema.

+0

Questo è quello che ho ma ho scaricato la versione corrente sul mio iPad e ottengo l'UITabBar predefinito "First View" e "Second View". Non uso alcuna funzionalità hardware. La mia app è una semplice app che cattura i dettagli delle sessioni di allenamento di un atleta. Tutti i dati vengono acquisiti nei campi di testo e archiviati nei dati principali. C'è un'impostazione Xcode che dovrei controllare? – Sean

+4

È possibile che tu abbia impostato la tua app come app universale (ovvero una che funziona normalmente su entrambi i dispositivi) invece di un'app solo per iPhone, e quindi non è riuscita a implementare il supporto per l'iPad? In caso contrario, non sono sicuro di aver capito. Cosa c'è nel tuo Info.plist? – Caleb

+1

Grazie per tutti i commenti. Ti prego di scusarmi perché questa è la mia prima app che ho scritto e inviata con successo all'AppStore. Ho modificato la domanda originale e aggiunto i contenuti di PLIST. Penso di averlo configurato come Universal App in origine senza rendermene conto. C'è un modo semplice per invertire questo in modo che la mia app funzioni come un'app per iPhone sull'iPad come richiesto da Apple? – Sean

7

Per far funzionare l'app su un iPad in modalità compatibile con iPhone, è necessario creare l'app solo per iPhone.

Rimuovi tutti i riferimenti iPad dal plist dell'app (base del pennino, xib e storyboard) e dalla famiglia di dispositivi mirati delle impostazioni di generazione target.

+0

Dio spero che funzioni davvero perché altrimenti non ho idea di cosa fare – Aerovistae

4

Ho avuto lo stesso problema, sono riuscito a eseguire la mia app sull'ipad dopo aver apportato le seguenti modifiche.

  1. nelle impostazioni del progetto ha reso i dispositivi a iPhone (era universale prima)
  2. nel .plist rimosse le principali story board nome base del file relativi a ipad.
+1

ThanQ mi aiuta ...! – Vidhyanand

1

Ho risolto lo stesso problema utilizzando questo scenario.

Controllare le immagini normali e retinate nella cartella delle risorse.

È inoltre possibile ottenere questo errore durante il debug di Could not load the "image.png" image referenced from a nib in the bundle with identifier.

Una normale applicazione per iPhone deve essere eseguita sull'iPad in entrambe le modalità (1x e 2x) senza modifiche. Puoi controllare questo con l'SDK Simulator.

Esiste un lungo elenco nelle Linee guida per la revisione dell'App Store sul Centro per sviluppatori iOS di Apple, in cui sono elencate molte delle cose che Apple esamina questo aspetto quando si invia un'app. Leggi attentamente.

0

proverò a spiegare quale fosse il mio problema e la soluzione ..

ho una unica app iPhone, che è per lo più in verticale, tuttavia, a causa di 1 o 2 UIViewControllers che devono essere in tutto UIInterfaceOrientations, devo permettere a tutti UIInterfaceOrientations nella mia plist.

Quando si avvia l'applicazione su un iPad che è ruotato nel paesaggio ed è sdraiato sul tavolo (così ha UIDeviceOrientationFaceUp), l'intera applicazione è stato mostrato nel paesaggio, che ha reso la mia interfaccia utente totalmente incasinato.

Non ho fatto riferimento a nessun codice/impostazioni relativo all'iPad nel mio plist o nelle schermate di avvio di qualsiasi tipo (sto usando .xcassets per le schermate di avvio).

L'ho risolto aggiungendo 1 riga di codice al mio AppDelegate.m che imposta l'orientamento della barra di stato per forzare l'app in modalità verticale.

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

    //Further setup 
} 
0

Ho avuto lo stesso problema con Cocos2d 2.0

Il mio problema era che il progetto si è evoluto nell'arco di diversi anni e aveva portato con sé alcuni file ora rudimentali come RootViewController e UIViewController e MyRootViewController, ecc

Hanno lavorato in quel momento ma chiaramente avevano alzato una bandiera con il comitato di revisione di oggi perché ho ricevuto l'avviso di rifiuto "Tutte le app iPhone devono funzionare su iPad". Dopo aver urlato ad alta voce e aver finalmente accettato la sconfitta, ho pensato che la politica rendesse piuttosto difficile creare un'app solo per iPhone. Fammi sapere se mi sbaglio su questo.

Anche se ero (e sono ancora) turbato a riguardo, ho pensato che forse ora avrei potuto almeno ripulire il progetto con una soluzione più elegante che gestisse il problema di base: rotazione dei dispositivi + rotazione dei contenuti. Ho finito per utilizzare qualcosa di un progetto più recente su cui si stava lavorando e sembrava più elegante e funzionante: basta aggiungere MyNavigationController all'inizio del mio AppDelegate.

Ho aggiunto il codice qui sotto. Sono sicuro che può essere migliorato. Si prega di commentare se è possibile migliorare.

Come risultato, sono stato in grado di eliminare i vecchi file RootViewController e MyRootViewController così ora è più semplice da gestire. Non ho mai capito il loro scopo molto bene comunque. Buona liberazione!

Qui è la mia soluzione per la visualizzazione e la congruenza orientamento del dispositivo + orientamento del contenuto:

in AppDelegate.h ho dovuto dichiarare quello che stavo facendo:

// all'inizio del file

@ interfaccia MyNavigationController: UINavigationController @end

// all'interno dell'interfaccia AppDelegate.h

MyNavigationController * navController_;

// fine del file prima di @end

@property (sola lettura) * MyNavigationController navController;

Ecco il codice che funziona nella parte superiore del mio 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 

Ecco perché ho dovuto risolvere questo:

  1. avevo bisogno di entrambe le modalità Orizzontale e Verticale per visualizzare scene diverse.

Ecco alcuni screenshot che descrivono la situazione

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!