Ứng dụng iPhone của tôi (http://hexalex.com) không phổ biến nhưng có tính năng mà tôi muốn bật cho những người đang chơi trên iPad. Có cách nào để phát hiện bạn đang chạy trên iPad ở chế độ tương thích không? Các phương thức UIDevice để phát hiện thông số kỹ thuật máy đều trả về giá trị bạn sẽ nhận được trên iPhone (ít nhất là trên trình mô phỏng). Điều duy nhất tôi có thể nghĩ đến là phát hiện OS 3.2, nhưng kỹ thuật đó sẽ không hoạt động lâu dài.phát hiện ứng dụng iPhone chạy trên iPad ở chế độ tương thích
Trả lời
Nguyên đã trả lời ở đây: https://stackoverflow.com/a/14864400/577237
đăng lại vì nó quá ngắn:
Nếu ứng dụng là một ứng dụng iPhone chạy ở chế độ giả lập trên iPad, nó sẽ có một userInterfaceIdiom của điện thoại, nhưng một loại mô hình của iPad. Bạn có thể kiểm tra điều này bằng mã sau:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone &&
[[[UIDevice currentDevice] model] hasPrefix:@"iPad"]) {
// This app is an iPhone app running on an iPad
}
mã của bạn không chính xác. UI_USER_INTERFACE_IDIOM() sẽ bằng ipad cho ứng dụng iPhone chạy trên iPad. – SpaceDog
@RubberDuck Tôi phải không đồng ý với đánh giá của bạn. Tôi đã tạo một ứng dụng thử nghiệm để kiểm tra chức năng này: https://github.com/michaelpatzer/TestEmulationMode –
điều này thật lạ vì ứng dụng của bạn là hành vi được mong đợi nhưng trong hai ứng dụng của tôi, tôi thấy iPad là cách diễn đạt! WTF !!!! – SpaceDog
1) Sử dụng UIDevice-Extension được viết bởi Erica Sadun. Một lớp học rất toàn diện: http://github.com/erica/uidevice-extension/blob/master/UIDevice-Hardware.m
2) Hoặc bạn cũng có thể sử dụng UIDevice phương pháp lớp:
[[UIDevice currentDevice] name] // eg. "Brock's iPhone"
[[UIDevice currentDevice] model] // eg. @"iPhone", @"iPod Touch"
[[UIDevice currentDevice] localizedModel] // localized version of model
[[UIDevice currentDevice] systemName] // eg. @"iPhone OS"
[[UIDevice currentDevice] systemVersion] // eg. @"3.2"
[[UIDevice currentDevice] uniqueIdentifier] // UDID, a unique string to identify the device
Mỗi phòng trong số dòng trên sẽ trả về một NSString
. Mà bạn có thể làm một chuỗi so sánh như vậy:
NSString *model = [[UIDevice currentDevice] model];
NSLog(@"Current device model: \"%@\"", model);
3) Một cách khác:
http://www.drobnik.com/touch/2009/07/determining-the-hardware-model/ Bạn sẽ cần phải sửa đổi này để sử dụng số lượng phần cứng phù hợp với iPad. Lấy từ liên kết ở trên:
UIDevice-hardware.h
#import
#define IPHONE_1G_NAMESTRING @"iPhone 1G"
#define IPHONE_3G_NAMESTRING @"iPhone 3G"
#define IPHONE_3GS_NAMESTRING @"iPhone 3GS"
#define IPOD_1G_NAMESTRING @"iPod touch 1G"
#define IPOD_2G_NAMESTRING @"iPod touch 2G"
@interface UIDevice (Hardware)
- (NSString *) platform;
- (NSString *) platformString;
@end
UIDevice-hardware.m
#import "UIDevice-hardware.h"
#include <sys/types.h>
#include <sys/sysctl.h>
@implementation UIDevice (Hardware)
/*
Platforms
iPhone1,1 = iPhone 1G
iPhone1,2 = iPhone 3G
iPhone2,1 = iPhone 3GS
iPod1,1 = iPod touch 1G
iPod2,1 = iPod touch 2G
*/
- (NSString *) platform
{
size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString *platform = [NSString stringWithCString:machine];
free(machine);
return platform;
}
- (NSString *) platformString
{
NSString *platform = [self platform];
if ([platform isEqualToString:@"iPhone1,1"]) return IPHONE_1G_NAMESTRING;
if ([platform isEqualToString:@"iPhone1,2"]) return IPHONE_3G_NAMESTRING;
if ([platform isEqualToString:@"iPhone2,1"]) return IPHONE_3GS_NAMESTRING;
if ([platform isEqualToString:@"iPod1,1"]) return IPOD_1G_NAMESTRING;
if ([platform isEqualToString:@"iPod2,1"]) return IPOD_2G_NAMESTRING;
return NULL;
}
@end
Tôi không có iPad để thử nghiệm, nhưng trong mô phỏng iPad' [[UIDevice currentDevice] model] 'trả về' iPhone Simulator', không phải là 'iPad Simulator'. Tôi cho rằng nó sẽ trả về 'iPhone' thay vì' iPad' khi chạy trên thiết bị. Đó là một môi trường iPhone mô phỏng, do đó, điều này là không có gì ngạc nhiên. Các sysctl 'hw.machine' là một gợi ý thú vị, nhưng trên giả lập iPad nó chỉ trả về' i386'. Bạn có biết những gì nó trả về trên iPad khi chạy một ứng dụng iPhone không phổ dụng? – n8gray
Bạn không cần phải kiểm tra điều này trên trình mô phỏng. Bạn cần một thiết bị thực, nếu không thì làm sao bạn biết được wthat xảy ra trong môi trường trường? –
Bạn đã kiểm tra "UIDevice.h"? Nó có thuộc tính mô hình mà bạn có thể tìm thấy trên iPhone, iPod, thiết bị iPad
Tên NSString *; // ví dụ: "My iPhone"
Mô hình NSString *; // ví dụ: @ "iPhone", @ "iPod Touch"
NSString * localizedModel; // phiên bản địa hóa của mô hình
NSString * systemName; // ví dụ: @ "iPhone OS"
NSString * systemVersion; // ví dụ: @ "2.0"
NSString * uniqueIdentifier; (DEPRECATED) // a chuỗi duy nhất cho mỗi thiết bị dựa trên thông tin phần cứng khác nhau.
Tôi không có iPad để thử nghiệm, nhưng trong mô phỏng iPad '[[UIDevice currentDevice] model]' trả về 'iPhone Simulator', không phải là 'iPad Simulator'. – n8gray
Tôi in [[UIDevice currentDevice] model] và nó trả lại cho tôi "iPad" :) –
@ n8gray: yes simulator bị giới hạn. chỉ hoạt động trên các thiết bị iOS. –
Bạn có ý nghĩa gì với chế độ "tương thích"? Đây là iOS, không phải Windows XP. –
Khi bạn chạy một ứng dụng iPhone không phổ dụng trên iPad, nó chạy trong môi trường mô phỏng iPhone. Bạn sẽ phải tha thứ cho tôi vì không biết thuật ngữ chính xác cho nó. – n8gray
Có. Các ứng dụng iPhone chạy trên iPad. Trong trường hợp đó bạn đã biết bạn đã xây dựng một ứng dụng iPhone, bạn chỉ cần kiểm tra xem bạn có đang chạy trên iPad hay không, xem câu trả lời của tôi. –