2012-09-01 31 views
7

Tôi đang tìm cách phát hiện thiết bị mà ứng dụng của tôi đang chạy. Tôi không quan tâm đến phiên bản phần mềm. Tôi đã tìm kiếm nhiều câu hỏi nhưng không ai trong số họ (ngạc nhiên) đáp ứng nhu cầu của tôi vì những lý do sau đây:Làm cách nào để phát hiện thiết bị iOS mà người dùng của tôi đang sử dụng?

Giải pháp 1:

NSString *deviceType = [UIDevice currentDevice].model; 

này không hoạt động bởi vì nó mang lại cho tôi chỉ là "iPad". Tôi muốn biết cho dù đó là iPad, iPad 2, mới iPad, iPhone 3GS, iPhone 4, vv

Giải pháp 2: Không thử nghiệm cho loại thiết bị, kiểm tra các khả năng cá nhân

này không áp dụng vì tôi muốn dữ liệu này thu thập số liệu thống kê người dùng, không thực hiện bất kỳ thao tác cụ thể nào của thiết bị.

Giải pháp 3: Sử dụng UIDeviceHardware tìm thấy here

Mã này trông khá lỗi thời và dường như để truy cập dữ liệu cá nhân trên thiết bị. Thậm chí còn có cuộc tranh luận liệu một ứng dụng sử dụng điều này sẽ được chấp thuận hay không. Quan trọng hơn, tôi không biết làm thế nào nó hoạt động :) Một sự thay thế cũng được tìm thấy here

Có bất kỳ điều gì trong số hai vừa qua mà tôi đề cập đến an toàn để sử dụng không? Họ có tuân thủ trong tương lai không? Họ có tuân thủ các quy tắc phê duyệt của Apple không?

Hoặc có phương pháp nào khác để giải quyết vấn đề này không?

Xin cảm ơn trước.

Trả lời

6

Apple sử dụng API như vậy trong mã mẫu của nó. Để Trích dẫn dự án LargeImageDownsizing Ví dụ, trong file LargeImageDownsizingViewController.m bắt đầu với dòng 83:

Chọn thích hợp dẫn đến kích thước hình ảnh và kích thước gạch có thể được thực hiện, nhưng là trái như một bài tập để các nhà phát triển. Lưu ý rằng chuỗi thiết bị loại/phiên bản (ví dụ:"IPhone2,1" có thể được xác định tại thời gian chạy thông qua sử dụng các chức năng sysctlbyname:

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 encoding:NSASCIIStringEncoding]; 
free(machine); 

_platform trong trường hợp của tôi sẽ là iPod4,1 cho một iPod touch 4th gen.

Mã này là nội dung gốc của cả hai ví dụ về Github mà bạn đã đăng.

+0

Cảm ơn. Bây giờ tôi biết nó là an toàn, tôi đưa nó vào dự án của mình và giải quyết vấn đề. –

1

Về mặt kỹ thuật, [UIDeviceHardware platform] sẽ hoạt động tốt và bạn nên gửi nó đến máy chủ của mình. Bạn cũng nên gửi phiên bản iOS cùng với id nền tảng để giúp bạn tránh khỏi sự cố nếu id nền tảng thay đổi trong hệ điều hành trong tương lai.

Bởi vì chức năng sysctlbyname đang được sử dụng ở đây là tài liệu, vì vậy tôi không nghĩ Apple có thể sử dụng quy tắc số 2.5 đối với bạn. Tuy nhiên, vẫn còn số quy tắc 17,1:

17,1 Apps không thể truyền dữ liệu về người dùng mà không có sự cho phép trước của người dùng và cung cấp cho người dùng truy cập vào thông tin về cách thức và nơi dữ liệu sẽ được sử dụng

Có thể lập luận nếu nền tảng thiết bị là về người dùng hay không. Lời khuyên của tôi là bạn nên gửi ứng dụng giả sử bạn không vi phạm 17.1 và chưa bao giờ đề cập đến điều đó. Rất có khả năng người đánh giá sẽ không biết bạn đang làm gì đằng sau hiện trường.

+0

Cảm ơn. Tôi đang tập hợp dữ liệu tôi thu thập và không ràng buộc dữ liệu đó với người dùng, vì vậy tôi không nghĩ rằng nó cũng chống lại quy tắc 17.1. Tôi cũng chắc chắn rằng họ thậm chí sẽ không nhận thấy. –

0

UIDevicePhần mềm bạn đã đề cập đủ tốt nhưng hơi lỗi thời. Bạn có thể dùng thử this Làm cho nó có phong cách táo hơn, do đó chúng có thể sẽ thích nó hơn.

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