Есть ли (легальный) способ захватить ВЕСЬ экран под iOS?
Я попробовал несколько методов, чтобы сделать снимок экрана приложения из этого приложения. Похоже, что ни одна из техник не фиксирует строку состояния - она становится черной.
Очевидно, когда-то был способ сделать это, но этот интерфейс является внутренним, и Apple не позволит вам его использовать.
Есть идеи?
Примечание. Это попытка решить эту проблему, когда мне нужно определить, включен или выключен режим полета (и нет, просто знать, достижима ли сеть, недостаточно).
Однако может показаться, что этот вопрос представляет более общий интерес и отличается от этого вопроса.
5 ответов
Фактическая проблема, определяющая, активен ли сетевой интерфейс, может быть решена с помощью сетевых функций BSD. ВОТ.
#include <sys/socket.h>
#include <ifaddrs.h>
#include <net/if.h>
BOOL IsNICTurnedOn(const char *nicName) {
BOOL result = NO;
struct ifaddrs *addrs = NULL;
if (0 == getifaddrs(&addrs)) {
for (struct ifaddrs *addr = addrs; addr != NULL; addr = addr->ifa_next) {
if (0 == strcmp(addr->ifa_name, nicName)) {
result = (0 != (addr->ifa_flags & (IFF_UP | IFF_RUNNING)));
break;
}
}
freeifaddrs(addrs);
}
return result;
}
Чтобы использовать эту функцию:
BOOL isWWANEnabled = IsNICTurnedOn("pdp_ip0");
BOOL isWiFiEnabled = IsNICTurnedOn("en0");
На данный момент кажется очевидным, что не существует простого способа определить, включен ли режим полета. Хотя вы, вероятно, могли бы сделать это, просматривая низкоуровневую информацию о сетевом стеке или просматривая пиксели строки состояния, любой из этих методов полагался бы на недокументированное поведение. Вполне возможно, что в будущих выпусках iOS или будущих устройствах iOS поведение изменится, и ваш код сгенерирует ложное срабатывание или ложное отрицание.
(Не говоря уже о том, что на будущих устройствах помехи могут даже отсутствовать.)
Если бы я был на вашем месте, я бы:
Отправьте сообщение об ошибке, чтобы Apple узнала, что вам нужна эта функция.
Добавьте уведомление в приложение, независимо от того, включен ли режим полета. Да, это может раздражать пользователя, если оно включено, но общий вред минимален. Возможно, я бы сделал это предупреждение, которое появляется только один раз (сохраняя ключ в NSUserDefaults, чтобы указать, был ли он уже отображен).
Если вы хотите получить супер-фантазии, проанализируйте записанный звук и, если гудение обнаружено, еще раз напомните пользователю включить режим полета во время записи. Вы можете сделать это в режиме реального времени или после того, как клип будет записан, что бы ни имело больше смысла для вашего приложения.
В качестве альтернативного решения, возможно, вы могли бы определить тип подключения, например: https://developer.apple.com/library/ios/. После некоторой дополнительной проверки типа устройства вы можете предупредить пользователя только в том случае, если ему нужно действовать.
Вид другого подхода, но вы также можете ссылаться на страницы в приложении "Настройки". Вы могли бы, возможно, дать ссылку на главную страницу и сообщить пользователю изменения, которые вам требуются.