2012-09-01 21 views
7

我正在尋找一種方法來檢測我的應用程序正在運行的設備。我對軟件版本不感興趣。我搜索了很多問題,但他們都不(奇怪)滿足我的需求,原因如下:如何檢測我的用戶正在使用哪個iOS設備?

解決方案1:

NSString *deviceType = [UIDevice currentDevice].model; 

這不起作用,因爲它給了我剛剛的「iPad」。我想知道它是否是的iPad,iPad 2的,新的iPad,iPhone 3GS,iPhone4的等

解決方案2:不測試的設備類型,檢查這並不適用,因爲我個人的能力

希望此數據收集用戶統計信息,而不是執行任何設備特定的操作。

解決方案3:使用UIDeviceHardware發現here

這段代碼看起來很過時,似乎在設備上訪問私人數據。甚至有關於使用此應用程序的應用程序是否會得到批准的爭論。更重要的是,我不知道它是如何工作:)還有一種替代方法是here

是我提到的最後兩個安全嗎?他們未來是否合規?他們是否遵守Apple的審批規定?

或者還有其他方法可以解決這個問題嗎?

在此先感謝。

回答

6

Apple在其示例代碼中使用了這樣的API。引述LargeImageDownsizing示例項目,與線83開頭的文件LargeImageDownsizingViewController.m在:

選擇合適的生成的圖像尺寸和瓷磚尺寸可以做到, 但作爲練習留給開發人員。請注意,設備 類型/版本字符串(例如,「iPhone2,1」可以在運行時 通過使用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在我的情況會是iPod4,1一個iPod touch第4代。

此代碼是您發佈的兩個Github示例的根源。

+0

謝謝。現在我知道它是安全的,我將它包含在我的項目中並解決了這個問題。 –

1

從技術上講,[UIDeviceHardware platform]應該可以正常工作,您應該將它發送到您的服務器。如果平臺ID在未來的操作系統中發生變化,您還應該發送iOS版本以及平臺ID以免麻煩。

由於此處使用的函數sysctlbyname已有詳細記錄,所以我不認爲Apple可以對您使用規則編號2.5。然而,仍然有規則的編號17.1:

17.1 Apps,而無需獲得用戶的事先許可,並提供訪問用戶 相關信息無法發送關於用戶數據的方式和位置數據將被用來

這是有爭議的,如果設備平臺是關於用戶或沒有。我的建議是你應該提交應用程序,假設你沒有違反17.1並永遠不會提及這個。評論者極有可能不知道你在幕後做了些什麼。

+0

謝謝。我正在收集我收集的數據,而不是將它綁定到用戶,所以我不認爲它也違反了17.1規則。我也確信他們甚至不會注意到。 –

0

您提到的UIDeviceHardware足夠好,但有點過時。 你可以試試this 使它更具蘋果風格,所以可能會因爲它們會更喜歡它。

相關問題