2012-05-10 40 views
11

Ứng dụng của tôi đã ở trong AppStore trong vài tháng và luôn làm việc trên iPhone. Gần đây, tôi đã gửi bản cập nhật bị từ chối vì Ứng dụng không chạy trên iPad. Lý do chính xác nó đã bị từ chối là:Làm cho một ứng dụng iPhone cụ thể hoạt động trên iPad để đáp ứng các yêu cầu của Apple

lý do từ chối: 2.10: ứng dụng iPhone cũng phải chạy trên iPad mà không sửa đổi, ở độ phân giải iPhone, và ở độ phân giải 2X iPhone 3GS

gì làm tôi cần làm gì trong Xcode để ứng dụng của tôi chạy trên iPad trong hộp nhỏ với biểu tượng 2X?

Bất kỳ hướng dẫn mẹo này sẽ được ồ ạt đánh giá cao ...

EDIT Đây là info.plist của tôi. Đây là ứng dụng đầu tiên của tôi và tôi nghĩ ban đầu tôi đã chọn thiết lập nó bằng "phổ quát" được chọn. Có cách nào dễ dàng để tôi sửa lại điều này bây giờ không?

PLIST contents...

+0

bạn đã cố gắng chạy nó trên mô phỏng iPad? Bạn có @ 2x hình ảnh? – Jamie

Trả lời

10

Bắt đầu bằng cách tìm hiểu xem tại sao ứng dụng của bạn không hoạt động trên iPad rồi. Hầu hết các ứng dụng được phát triển cho iPhone sẽ hoạt động tốt trên iPad (ở chế độ tương thích) mà không sửa đổi; nếu bạn không, bạn phải làm một cái gì đó để ngăn chặn nó. Bạn có dựa vào một số tính năng phần cứng không? Đưa ra các giả định vô căn cứ về thiết bị bạn đang chạy? Ứng dụng của bạn thất bại như thế nào khi chạy trên iPad?

Khi bạn đã tìm ra lý do tại sao nó không hoạt động, bạn sẽ được gần gũi hơn nhiều so với bây giờ bạn đang sửa chữa vấn đề.

+0

Đó là những gì tôi nói nhưng tôi đã tải xuống phiên bản hiện tại cho iPad của mình và tôi nhận được UITabBar mặc định là "Chế độ xem đầu tiên" và "Chế độ xem thứ hai". Tôi không sử dụng bất kỳ tính năng phần cứng nào. Ứng dụng của tôi là một ứng dụng đơn giản chụp chi tiết về các buổi đào tạo của một vận động viên. Tất cả dữ liệu được ghi lại trong các trường văn bản và được lưu trữ trong dữ liệu lõi. Có cài đặt Xcode mà tôi nên kiểm tra không? – Sean

+4

Có thể bạn đã thiết lập ứng dụng của mình dưới dạng ứng dụng toàn cầu (tức là ứng dụng chạy bình thường trên cả hai thiết bị) thay vì ứng dụng chỉ dành cho iPhone và sau đó không triển khai được hỗ trợ cho iPad? Nếu không, tôi không chắc tôi hiểu. Có gì trong Info.plist của bạn? – Caleb

+1

Cảm ơn tất cả các ý kiến. Xin lỗi vì đây là ứng dụng đầu tiên của tôi mà tôi đã viết và gửi thành công tới AppStore. Tôi đã chỉnh sửa câu hỏi gốc và thêm nội dung PLIST. Tôi nghĩ rằng tôi đã thiết lập nó như là một ứng dụng toàn cầu ban đầu mà không nhận ra. Có cách nào dễ dàng để đảo ngược điều này để ứng dụng của tôi sẽ hoạt động như một ứng dụng iPhone trên iPad theo yêu cầu của Apple không? – Sean

7

Để ứng dụng của bạn chạy trên iPad ở chế độ tương thích với iPhone, bạn chỉ cần tạo ứng dụng của mình cho iPhone.

Xóa tất cả các tham chiếu iPad khỏi danh sách ứng dụng (nib base, xib và storyboard) và từ Target Device Settings Targeted Device Family.

+0

Thiên Chúa Tôi hy vọng điều này thực sự hoạt động bởi vì nếu không tôi không có đầu mối fricking phải làm gì – Aerovistae

4

Tôi gặp vấn đề tương tự, tôi có thể chạy ứng dụng của mình trên iPad sau khi thực hiện các thay đổi sau.

  1. trong các thiết lập dự án làm cho thiết bị iPhone (nó đã được phổ biến trước đó)
  2. trong plist loại bỏ các bảng câu chuyện tên cơ sở tập tin chính liên quan đến ipad.
+1

ThanQ nó giúp tôi ...! – Vidhyanand

1

Tôi đã giải quyết vấn đề tương tự bằng cách sử dụng kịch bản này.

Bạn nên kiểm tra hình ảnh bình thường và võng mạc trong thư mục tài nguyên của mình.

Bạn cũng có thể gặp phải lỗi này khi gỡ lỗi Could not load the "image.png" image referenced from a nib in the bundle with identifier.

Ứng dụng iPhone thông thường phải chạy trên iPad ở cả chế độ (1x và 2x) mà không sửa đổi. Bạn có thể kiểm tra điều này bằng Trình mô phỏng SDK.

Có danh sách dài trong Hướng dẫn đánh giá cửa hàng ứng dụng trên Trung tâm Cổng thông tin dành cho nhà phát triển iOS của Apple liệt kê nhiều điều mà Apple đánh giá những điều này khi bạn gửi ứng dụng. Đọc nó cẩn thận.

0

Tôi sẽ cố gắng giải thích vấn đề và giải pháp của mình là gì ..

Tôi có một chỉ ứng dụng iPhone mà chủ yếu là trong bức chân dung, tuy nhiên, vì 1 hoặc 2 UIViewControllers mà phải trong tất cả các UIInterfaceOrientations, tôi phải kích hoạt tất cả UIInterfaceOrientations trong plist tôi.

Khi khởi động ứng dụng trên iPad được xoay ngang và nằm trên bàn (do đó có UIDeviceOrientationFaceUp), toàn bộ ứng dụng được hiển thị ở chế độ ngang, khiến giao diện người dùng của tôi hoàn toàn bị rối loạn.

Tôi không có tham chiếu đến bất kỳ mã/cài đặt liên quan đến iPad nào trong màn hình plist hoặc khởi chạy của tôi (tôi đang sử dụng .xcassets cho màn hình khởi chạy).

Tôi đã sửa nó bằng cách thêm 1 dòng mã vào số AppDelegate.m để đặt định hướng thanh trạng thái để buộc ứng dụng ở chế độ dọc.

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

    //Further setup 
} 
0

tôi đã cùng một vấn đề sử dụng Cocos2d 2.0

Vấn đề của tôi là dự án đã phát triển qua nhiều năm và đã mang theo một số tác phẩm tại thoái hóa như RootViewController và UIViewController và MyRootViewController vv

Họ làm việc vào thời điểm đó nhưng rõ ràng đã nêu ra một lá cờ với ủy ban đánh giá ngày hôm nay bởi vì tôi nhận được "Tất cả các ứng dụng iPhone phải hoạt động trên iPad" thông báo từ chối. Sau khi hét to và cuối cùng chấp nhận thất bại, tôi nghĩ chính sách đó khiến cho iPhone trở nên khá khó khăn. Hãy cho tôi biết nếu tôi sai về điều này.

Mặc dù tôi đã (và vẫn còn) băn khoăn về nó, tôi nghĩ có lẽ bây giờ tôi có thể ít nhất làm sạch dự án với một giải pháp thanh lịch hơn xử lý vấn đề cơ bản: xoay thiết bị + quay nội dung. Tôi đã kết thúc bằng cách sử dụng một cái gì đó từ một dự án gần đây đã được làm việc trên và có vẻ thanh lịch hơn và thực sự làm việc: chỉ cần thêm MyNavigationController vào đầu AppDelegate của tôi.

Tôi đã thêm mã bên dưới. Tôi chắc chắn nó có thể được cải thiện. Hãy bình luận nếu bạn có thể tăng cường nó.

Kết quả là, tôi đã có thể xóa các tệp RootViewController và MyRootViewController cũ để dễ bảo trì hơn. Tôi không bao giờ hiểu mục đích của họ rất tốt. Tốt riddance!

Đây là giải pháp của tôi để hiển thị và phù hợp với định hướng thiết bị + định hướng nội dung:

trong AppDelegate.h Tôi đã phải tuyên bố những gì tôi đã làm:

// đầu của tập tin

@ giao diện MyNavigationController: UINavigationController @end

// interface inside AppDelegate.h

MyNavigationController * navController_;

// cuối tệp trước @end

@property (readonly) MyNavigationController * navController;

Đây là mã hoạt động ở đầu AppDelegate của tôi.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 

Đây là lý do tại sao tôi phải giải quyết việc này:

  1. tôi cần cả hai Cảnh quan và chế độ Portrait để hiển thị cảnh khác nhau.

Dưới đây là một số ảnh chụp màn hình để mô tả tình hình

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!

Các vấn đề liên quan