簡體   English   中英

是否有可能在運行時檢測到您的iOS應用程序在iPad mini上運行?

[英]Is it possible to detect that your iOS app is running on an iPad mini at runtime?

在運行時檢測不同的硬件對於分析(其中甚至更有問題的目的)是有用的。

許多iOS應用程序創建者可能有興趣知道有多少用戶在iPad mini上體驗他們的應用程序(而不僅僅知道有多少用戶在iPad上以1024x768的屏幕分辨率體驗他們的應用程序 - 這也很有趣)。

Cocoa touch/UIKit/ObjC/C是否有任何公共API可用於檢測您的iOS應用程序是否在運行時在iPad mini上運行? 理想情況下,此方法應區分iPad 2和iPad mini(具有相同像素數,但像素密度不同)。


Post Script:我意識到很多人會考慮在運行時檢測iPad mini是一個壞主意。 但是,我認為這是一個有效的問題,肯定是或否答案。 我認為這個答案對社區有用。

如果沒有調用未定義的行為並且它沒有多余的部分,Boxel的答案會很好。 一, + [NSString stringWithCString:encoding:]需要一個C字符串 - 即一個NUL終止的char指針(否則它很可能會轉儲核心)。 此外,您不需要轉換為NSString - 因為sysctlbyname()為您提供了一個普通的舊C字符串(當然沒有NUL終結符),您可以直接使用strcmp()來保存幾十個CPU周期:

#include <sys/sysctl.h>

size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size + 1);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
machine[size] = 0;

if (strcmp(machine, "iPad2,5") == 0) {
    /* iPad mini */
}

free(machine);

編輯:現在答案也已修復。

使用sysctlbyname獲取平台字符串,然后將其與此處列出的IPSW前綴字符串進行比較。 看起來目前唯一知名的iPad Mini是“iPad2,5”

例:

size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size + 1);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
machine[size] = 0;

if(strcmp(machine, "iPad2,5") == 0) {
    // do something special on the iPad Mini    
}

free(machine);

沒有可靠的,面向未來的方法來檢測iPad mini的像素密度。 其他答案建議查看hw.machine字符串。 但是我們不知道(截至我寫這篇文章的時候)iPad mini蜂窩模型的字符串是什么(雖然我們可以做出有根據的猜測: iPad2,6可能會有GSM和iPad2,7可能會有CDMA )。

可以查看hw.machine字符串進行分析。 但讓它影響你的應用程序的用戶界面是危險的,因為即使是當前iPad mini的iPad2,5字符串也可能會發生變化。

當iPad 2問世時,wifi模型的字符串是iPad2,1 后來(當他們發布iPad 3時), 他們更換了iPad 2硬件並將hw.machine字符串更改為iPad2,4 ,但他們仍將其稱為iPad 2.使用iPad mini也可能發生同樣的事情 - 甚至是iPad 2又來了! 例如,Apple可以發布另一個版本的iPad 2硬件並給它機器字符串iPad2,8

導入CoreTelephony.framework。 在設備上試試吧

#import <sys/utsname.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>

NSString*
machineName()
{
    struct utsname systemInfo;
    uname(&systemInfo);

    return [NSString stringWithCString:systemInfo.machine
                          encoding:NSUTF8StringEncoding];
}

這解決了我到目前為止的目的。 但由於我沒有任何iPad mini,我不知道iPad mini會打印什么。 你能讓我知道嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM