Чтобы прочитать непосредственно метод, который я использовал для получения плотности пикселей, прочитайте раздел « Мой окончательный метод ». Если вы хотите прочитать, как я пришел к этому, продолжайте читать.
Итак, я провел дальнейшие исследования и нашел решение, которое меня устраивает. Я поделюсь этим здесь для потомков.
Прежде всего, @ ColeX (член команды Xamarin ) сказал мне, что
Нет общедоступного API для получения точек или пикселей на дюйм устройства
в iOS.
Так что требуется другой подход. Сначала я подумал, что смогу получить размер экрана, используя Switch-Casing, размер в пикселях, который доступен в общедоступном API, но, как я писал в комментарии выше к @LucasZ, это было бы неточно, поскольку
iPad mini и iPad Air: они имеют одинаковую высоту (1024) и одинаковую шкалу (2x), но, поскольку ИЦП отличаются, получается, что они равны 7,9 и 9,7 соответственно ...
Затем была опция с кодом из XLabs , о которой я упоминал выше. Этот метод я нашел сначала в ветке на форумах Xamarin , а затем независимо в библиотеке XLabs . Это, тем не менее, было недостатком комментария о нарушении правил Apple ...
К счастью, после дальнейших исследований и дополнительных вопросов и ответов, в форумах Xamarin в другой теме на меня указал @LandLu (также член команды Xamarin ) к еще другой библиотеке : эта библиотека также делает загадочный запрос к hw.machine
. Поэтому я решил спросить автора о риске использования такого метода и он ответил :
Привет, @ deczaloth,
Это не должно быть проблемой, так как Apple проверяет каждое приложение после отправки, чтобы увидеть, какие вызовы API сделаны, и получение аппаратной строки не является нарушением. Есть другие звонки, которые я видел отклоненными, но не hw.machine. Надеюсь, что это отвечает вашим интересам. Привет
Мой последний метод был:
- Получите подробную модель iOS, получив аппаратную строку, используя специальную библиотеку / nuGet / code (или обратитесь к коду в APENDIX ).
- Switch-Case - подробная модель, полученная на предыдущем шаге, с общедоступной информацией о размерах экрана в дюймах (эта информация общедоступна, и существует множество источников, например, печально известный iosres.com ).
- Используйте общедоступный API (
UIScreen.MainScreen.Bounds.Size
), чтобы получить размер диагонали экрана в пикселях (базовая пифагорейская математика) и рассчитать плотность пикселей: pixels per inch = diagonal-size-in-pixels/diagonal-size-in-inches
.
- Voila!
отв
Код для получения аппаратной строки:
using System;
using System.Runtime.InteropServices;
using ObjCRuntime;
public static string GetiOSModel() =>
GetSystemProperty(string property);
public static string GetSystemProperty(string property)
{
var pLen = Marshal.AllocHGlobal(sizeof(int));
sysctlbyname(property, IntPtr.Zero, pLen, IntPtr.Zero, 0);
var length = Marshal.ReadInt32(pLen);
var pStr = Marshal.AllocHGlobal(length);
sysctlbyname(property, pStr, pLen, IntPtr.Zero, 0);
return Marshal.PtrToStringAnsi(pStr);
}
/// <summary>
/// Sysctlbynames the specified property.
/// </summary>
/// <param name="property">The property.</param>
/// <param name="output">The output.</param>
/// <param name="oldLen">The old length.</param>
/// <param name="newp">The newp.</param>
/// <param name="newlen">The newlen.</param>
/// <returns>System.Int32.</returns>
[DllImport(Constants.SystemLibrary)]
internal static extern int sysctlbyname(
[MarshalAs(UnmanagedType.LPStr)] string property,
IntPtr output,
IntPtr oldLen,
IntPtr newp,
uint newlen);