2012-05-10 7 views
11

Meine App ist seit ein paar Monaten im AppStore und hat immer nur auf dem iPhone funktioniert. Ich habe kürzlich ein Update eingereicht, das abgelehnt wurde, weil die App nicht auf einem iPad läuft. Der genaue Grund wurde es abgelehnt wurde:Erstelle eine iPhone-spezifische App auf dem iPad, um die Apple-Anforderungen zu erfüllen.

Gründe für die Ablehnung: 2.10: iPhone-Apps müssen auch ohne Änderungen auf dem iPad laufen, um iPhone-Auflösung und bei 2X iPhone 3GS Auflösung

Was ich tun muss ich in Xcode machen, damit meine App auf einem iPad in der kleinen Box mit dem 2X-Icon läuft?

Alle Anweisungen Tipps massiv geschätzt wird ...

EDIT Das ist mein info.plist. Dies ist meine erste App, und ich glaube, ich habe mich anfangs entschieden, sie mit "Universal" zu installieren. Gibt es einen einfachen Weg zurück, um dies jetzt zu korrigieren?

PLIST contents...

+0

Haben Sie versucht, es auf dem iPad Simulator läuft? Hast du @ 2x Bilder? – Jamie

Antwort

10

Sie zunächst herauszufinden, warum Ihre Anwendung nicht bereits auf dem iPad funktioniert. Die meisten Apps, die für das iPhone entwickelt wurden, funktionieren auf einem iPad (im Kompatibilitätsmodus) ohne Änderungen. Wenn deins nicht, müssen Sie etwas tun, um es zu verhindern. Sind Sie auf eine Hardware-Funktion angewiesen? Unbegründete Annahmen über das Gerät treffen, auf dem Sie laufen? Wie schlägt Ihre App beim Ausführen auf einem iPad fehl?

Sobald Sie herausgefunden haben, warum es nicht funktioniert, werden Sie viel näher als Sie jetzt sind, das Problem zu beheben.

+0

Das ist, was ich sagen, aber ich habe die aktuelle Version auf mein iPad heruntergeladen und ich bekomme die Standard-UITabBar "First View" und "Second View". Ich verwende keine Hardware-Funktionen. Meine App ist eine einfache App, die Details von Trainingseinheiten eines Athleten erfasst. Alle Daten werden in Textfeldern erfasst und in Kerndaten gespeichert. Gibt es eine Xcode-Einstellung, die ich überprüfen sollte? – Sean

+4

Ist es möglich, dass Sie Ihre App als universelle App (d. H. Eine, die normal auf beiden Geräten ausgeführt wird) anstelle einer reinen iPhone-App eingerichtet haben und dann die Unterstützung für das iPad nicht implementiert haben? Wenn nicht, bin ich mir nicht sicher, ob ich das verstehe. Was ist in Ihrer Info.plist? – Caleb

+1

Danke für alle Kommentare. Bitte entschuldigen Sie mich, denn dies ist meine erste App, die ich geschrieben und erfolgreich im AppStore eingereicht habe. Ich habe die ursprüngliche Frage bearbeitet und den PLIST-Inhalt hinzugefügt. Ich denke, ich habe es ursprünglich als Universal-App eingerichtet, ohne es zu merken. Gibt es eine einfache Möglichkeit, dies umzukehren, so dass meine App wie eine iPhone-App auf dem iPad funktioniert, wie von Apple gefordert? – Sean

7

Damit Ihre App im iPhone-Kompatibilitätsmodus auf einem iPad ausgeführt werden kann, müssen Sie Ihre App nur für das iPhone erstellen.

Entfernen Sie alle iPad-Referenzen aus dem App-Plist (Nib-Basis, Xib und Storyboard) und aus der Zielgruppe der Ziel-Build-Einstellungen.

+0

Gott ich hoffe, das funktioniert tatsächlich, weil ich sonst keine Ahnung habe, was ich tun soll – Aerovistae

4

Ich hatte das gleiche Problem, ich konnte meine App auf dem iPad ausführen, nachdem ich die folgenden Änderungen vorgenommen hatte.

  1. in den Projekteinstellungen gemacht, um die Geräte zu iPhone (es vor universal war)
  2. in der .plist die Hauptstoryboard-Datei Basisnamen entfernt ipad bezogen.
+1

ThanQ es hilft mir ...! – Vidhyanand

1

Ich habe das gleiche Problem mit diesem Szenario gelöst.

Sie sollten in Ihrem Ressourcenordner nach normalen Bildern und Retinabildern suchen.

Sie können diesen Fehler auch beim Debuggen Could not load the "image.png" image referenced from a nib in the bundle with identifier erhalten.

Eine normale iPhone App muss sowohl im (1x als auch 2x) Modus ohne Modifizierung auf dem iPad laufen. Sie können dies mit dem SDK-Simulator überprüfen.

Es gibt eine lange Liste in den App Store Review Guidelines auf Apples iOS Developer Portal Center, die viele der Dinge auflistet, die Apple diese Dinge überprüft, wenn Sie eine App einreichen. Lies es sorgfältig.

0

Ich werde versuchen zu erklären, was mein Problem und Lösung war ..

Ich habe eine iPhone einzige App, die meist im Portrait ist jedoch aufgrund von 1 oder 2 UIViewControllers das in allen UIInterfaceOrientations sein, ich habe alle UIInterfaceOrientations in meinem plist zu ermöglichen.

Beim Start der App auf einer iPad, die in Landschaft gedreht wird und auf dem Tisch liegt (so hat UIDeviceOrientationFaceUp), wurde die ganze App in Landschaft gezeigt, die meine UI völlig durcheinander gebracht.

Ich hatte keinen Bezug zu irgendwelchen iPad bezogenen Code/Einstellungen in meinem Plist oder Launch-Bildschirme (ich verwende .xcassets für Startbildschirme).

Ich habe es behoben, indem ich eine Zeile Code zu meiner AppDelegate.m hinzugefügt, die die Statusleiste Ausrichtung setzt die App im Hochformat zu erzwingen.

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

    //Further setup 
} 
0

hatte ich das gleiche Problem Cocos2d betrug 2,0

Mein Problem mit, dass das Projekt über mehrere Jahre entwickelt hatte und entlang einiger jetzt vestigial Dateien wie RootViewController und UIViewController und MyRootViewController getragen hatte, usw.

Sie arbeiteten zu der Zeit, hatten aber mit dem heutigen Review-Komitee eine Fahne gehisst, weil ich die Ablehnungsmitteilung "All iPhone apps muss auf dem iPad arbeiten" erhalten habe. Nachdem ich laut geschrien und schließlich eine Niederlage akzeptiert hatte, dachte ich, dass es mit dieser Richtlinie ziemlich schwer ist, eine App nur für das iPhone zu entwickeln. Lass es mich wissen, wenn ich falsch liege.

Obwohl ich (und immer noch) darüber beunruhigt bin, dachte ich, jetzt könnte ich das Projekt zumindest mit einer eleganteren Lösung aufräumen, die das Grundproblem behandelt: Gerätedrehung + Inhaltsrotation. Ich benutzte etwas aus einem neueren Projekt, an dem gearbeitet wurde und das eleganter aussah und tatsächlich funktionierte: einfach MyNavigationController oben auf meinem AppDelegate hinzufügen.

Ich habe den folgenden Code hinzugefügt. Ich bin mir sicher, dass es verbessert werden kann. Bitte kommentieren Sie, wenn Sie es verbessern können.

Als Ergebnis konnte ich die alten RootViewController und MyRootViewController Dateien löschen, so dass es jetzt einfacher zu pflegen ist. Ich habe ihren Zweck sowieso nie gut verstanden. Gute Riddance!

Hier ist meine Lösung für die Anzeige und Geräteausrichtung + inhaltliche Ausrichtung passend:

in AppDelegate.h musste ich erklären, was ich tat:

// Anfang der Datei

@ Schnittstelle MyNavigationController: UINavigationController @end

// innerhalb AppDelegate.h Schnittstelle

MyNavigationController * navController_;

// Ende der Datei vor @end

@property (Read-only) MyNavigationController * NavController;

Hier ist der Code, der oben auf meinem AppDelegate funktioniert.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 

Hier ist, warum ich dieses Problem zu lösen hatte:

  1. ich sowohl Landschafts- und Portrait-Modus benötigt, um verschiedene Szenen angezeigt werden soll.

Hier sind einige Screenshots, die die Situation beschreiben

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!

Verwandte Themen