2012-05-10 8 views
11

Moja aplikacja jest w AppStore od kilku miesięcy i zawsze działała tylko na iPhonie. Niedawno przesłałem aktualizację, która została odrzucona, ponieważ aplikacja nie działa na iPadzie. Dokładna przyczyna została ona odrzucona było:Spraw, aby aplikacja iPhone działała na iPadzie, aby spełnić wymagania Apple

przyczyn odrzucenia: 2.10: iPhone aplikacje muszą również uruchomić na iPadzie bez zmian, przy rozdzielczości iPhone oraz w rozdzielczości 2X iPhone 3GS

Czego muszę zrobić w Xcode, aby moja aplikacja działała na iPadzie w małym pudełku z ikoną 2X?

Wszelkie instrukcje porady będą masowo docenione ...

EDIT To mój Info.plist. To jest moja pierwsza aplikacja i myślę, że początkowo zdecydowałem się ją ustawić z wybranym "uniwersalnym". Czy istnieje dla mnie łatwy sposób, aby to naprawić?

PLIST contents...

+0

próbowałeś uruchomić go na symulatorze iPad? Czy masz @ 2x obrazy? – Jamie

Odpowiedz

10

Zacznij od zastanawianie się, dlaczego aplikacja nie działa na iPada już. Większość aplikacji opracowanych dla iPhone'a działa dobrze na iPadzie (w trybie zgodności) bez modyfikacji; jeśli twój nie, musisz robić coś, aby temu zapobiec. Czy polegasz na jakiejś funkcji sprzętowej? Podejmując nieuzasadnione założenia dotyczące urządzenia, z którego korzystasz? Jak działa twoja aplikacja po uruchomieniu na iPadzie?

Gdy zorientujesz się, dlaczego to nie działa, będziesz znacznie bliżej niż teraz, aby rozwiązać problem.

+0

Tak właśnie wyglądam, ale pobrałem aktualną wersję na iPada i otrzymałem domyślny UITabBar "Pierwszy widok" i "Drugi widok". Nie używam żadnych funkcji sprzętowych. Moja aplikacja to prosta aplikacja rejestrująca szczegóły treningu sportowca. Wszystkie dane są przechwytywane w polach tekstowych i przechowywane w danych podstawowych. Czy jest ustawienie Xcode, które powinienem sprawdzić? – Sean

+4

Czy możliwe jest skonfigurowanie aplikacji jako aplikacji uniwersalnej (takiej, która działa normalnie na obu urządzeniach) zamiast aplikacji dla iPhone'a, a następnie nie udało się wdrożyć obsługi iPada? Jeśli nie, nie jestem pewien, czy rozumiem. Co zawiera twoja Info.plist? – Caleb

+1

Dzięki za wszystkie komentarze. Przepraszam, ponieważ jest to moja pierwsza aplikacja, którą napisałem i pomyślnie przesłałem do AppStore. Zmieniłem oryginalne pytanie i dodałem zawartość PLIST. Myślę, że początkowo skonfigurowałem go jako aplikację Universal, nie zdając sobie z tego sprawy. Czy istnieje prosty sposób na odwrócenie tej sytuacji, aby moja aplikacja działała jako aplikacja na iPada zgodnie z wymaganiami Apple? – Sean

7

Aby aplikacja działała na iPadzie w trybie zgodności z iPhone'em, musisz zbudować aplikację tylko na iPhone'a.

Usuń wszystkie odniesienia do iPada z plistu aplikacji (podstawy, podstawy i storybooka), a także z rodziny docelowej urządzeń docelowych ustawień konstrukcyjnych.

+0

Boże, mam nadzieję, że to zadziała, ponieważ w przeciwnym razie nie mam pojęcia, co robić – Aerovistae

4

Miałem ten sam problem, mogłem uruchomić moją aplikację na iPadzie po wprowadzeniu następujących zmian.

  1. w ustawieniach projektu wykonana urządzeniom iPhone (to było przed uniwersalny)
  2. w .plist usunęła główną scenorys nazwę pliku bazowego związanego z iPada.
+1

. Pomóż mi ...! – Vidhyanand

1

Rozwiązałem ten sam problem przy użyciu tego scenariusza.

Należy sprawdzić obrazy normalne i siatkówkowe w folderze zasobów.

Ten błąd może również zostać wyświetlony podczas debugowania Could not load the "image.png" image referenced from a nib in the bundle with identifier.

Zwykła aplikacja na iPhone'a musi działać na iPadzie w obu trybach (1x i 2x) bez modyfikacji. Możesz to sprawdzić za pomocą Symulatora SDK.

Istnieje długa lista w Wytycznych dotyczących oceny App Store w Centrum portalu dla programistów iOS firmy Apple, które zawiera listę wielu rzeczy, które firma Apple sprawdza podczas przesyłania aplikacji. Przeczytaj uważnie.

0

Spróbuję wyjaśnić, jaki był mój problem i rozwiązanie ...

Mam iPhone tylko aplikację, która jest głównie w układzie pionowym, jednak ze względu na 1 lub 2 UIViewControllers które muszą być we wszystkich UIInterfaceOrientations, muszę włączyć wszystkie UIInterfaceOrientations w moim plist.

Po uruchomieniu aplikacji na iPad, która jest obracana w układzie poziomym i leży na stole (podobnie jak UIDeviceOrientationFaceUp), cała aplikacja została wyświetlona w orientacji poziomej, co spowodowało, że mój interfejs użytkownika był całkowicie pomieszany.

Nie miałem żadnego odniesienia do żadnego kodu/ustawień związanych z iPadem na moich ekranach plist lub uruchomieniu w ogóle (używam .xcassets do ekranów startowych).

Naprawiłem to, dodając 1 wiersz kodu do mojego AppDelegate.m, który ustawia orientację paska stanu, aby wymusić aplikację w trybie portretu.

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

    //Further setup 
} 
0

miałem ten sam problem przy użyciu Cocos2d 2.0

Moim problemem było to, że projekt ewoluował w ciągu kilku lat i obecnie prowadzone wzdłuż pewnych szczątkowych plików, takich jak RootViewController i UIViewController i MyRootViewController itp

Pracowali wtedy, ale wyraźnie podnieśli flagę z dzisiejszym komitetem ds. Przeglądu, ponieważ otrzymałem powiadomienie o odrzuceniu "Wszystkie aplikacje iPhone na iPadzie". Po głośnym krzyku i ostatecznym zaakceptowaniu porażki, uznałem, że polityka sprawia, że ​​tworzenie iPhone'a z aplikacjami jest naprawdę trudne. Daj mi znać, jeśli się mylę.

Mimo, że byłem (i wciąż jestem) zaniepokojony tym, pomyślałem, że być może teraz mógłbym przynajmniej oczyścić projekt z bardziej eleganckim rozwiązaniem, które rozwiązuje podstawowy problem: rotacja urządzenia + rotacja treści. W końcu skorzystałem z czegoś z nowszego projektu, nad którym pracowałem i wydawało się bardziej eleganckie i faktycznie działało: po prostu dodaj MyNavigationController na szczyt mojego AppDelegate.

Dodałem poniższy kod. Jestem pewien, że można to poprawić. Proszę skomentuj, czy możesz go ulepszyć.

W rezultacie udało mi się usunąć stare pliki RootViewController i MyRootViewController, dzięki czemu łatwiej jest je zachować. Nigdy i tak nie zrozumiałem ich przeznaczenia. Dobry riddance!

Oto moje rozwiązanie do wyświetlania i dopasowywanie orientacji urządzenia + orientację treści:

w AppDelegate.h musiałem zadeklarować co robiłem:

// początku pliku

@ interfejs MyNavigationController: UINavigationController @end

// wewnątrz interfejsu AppDelegate.h

MyNavigationController * navController_;

// dole pliku przed @end

@property (tylko do odczytu) MyNavigationController * navController;

Oto kod, który działa na górze mojego 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 

Oto dlaczego musiałem rozwiązać ten problem:

  1. potrzebowałem zarówno Krajobraz i trybie pionowym, aby wyświetlić różne sceny.

Oto kilka zrzutów ekranu, które opisują sytuację

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!