Есть ли (законный) способ захватить ВЕСЬ экран под iOS?

Я пробовал несколько методов, чтобы сделать снимок экрана приложения из этого приложения. Кажется, ни один из методов не захватывает строку состояния — она становится черной.

По-видимому, когда-то был способ сделать это, но этот интерфейс является внутренним, и Apple не позволит вам его использовать.

Есть идеи?

Примечание. Это попытка решить эту проблему, где мне нужно определить включен или выключен режим полета (и нет, просто знать, доступна ли сеть, недостаточно).

Однако, казалось бы, этот вопрос представляет более общий интерес и отличается от этого вопроса.


person Hot Licks    schedule 03.04.2012    source источник
comment
вам действительно нужна строка состояния? Потому что можно было просто скрыть его и сделать скриншот, в этом случае скриншот должен быть полным(могу ошибаться, никогда раньше этого не делал)   -  person Novarg    schedule 03.04.2012
comment
Да, мне нужна строка состояния. Это то, что я пытаюсь получить изображение.   -  person Hot Licks    schedule 03.04.2012
comment
Почему бы просто не попросить пользователя сделать это?   -  person CodaFi    schedule 03.04.2012
comment
Потому что (вздох) мне нужно захватить строку состояния, чтобы я мог посмотреть на нее и посмотреть, включен ли режим полета, поскольку другого способа сделать это нет. И мне нужно сделать это, чтобы предупредить пользователя о включении режима полета при работе на iPod Touch второго поколения, поскольку в противном случае WIFI генерировал звуковой шум при записи.   -  person Hot Licks    schedule 03.04.2012
comment
@HotLicks вау... какое странное решение!   -  person Mat    schedule 03.04.2012
comment
+1 за нестандартное мышление, чтобы узнать статус режима полета. +больше, если вы перечислите другие решения, которые вы пытались сделать для захвата экрана   -  person codeperson    schedule 03.04.2012
comment
Я нашел код для обнаружения режима полета и его включения и выключения. Мне это кажется очень хакерским, но это законно.   -  person CodaFi    schedule 03.04.2012
comment
Таким образом, все, что вас на самом деле волнует, это отсутствие возможности сетевой активности; почему бы не проверить доступность? SCNetworkReachabilityGetFlags()   -  person jscs    schedule 03.04.2012
comment
@jonsibley - этот интерфейс теперь находится в PrivateFramework и, предположительно, недоступен.   -  person Hot Licks    schedule 03.04.2012
comment
@IuliusCæsar -- мне нужно, чтобы WIFI был ВЫКЛЮЧЕН, а не просто недоступен.   -  person Hot Licks    schedule 03.04.2012
comment
Чтобы помочь людям, которые ищут похожие проблемы, обновите свой вопрос, указав фактическую проблему (определение состояния WiFi).   -  person Jonathan Grynspan    schedule 03.04.2012
comment
@JonathanGrynspan - для этого у меня открыта отдельная ветка: повторное посещение ipod touch"> stackoverflow.com/questions/9981427/   -  person Hot Licks    schedule 04.04.2012
comment
Вы не должны открывать повторяющиеся вопросы. Обновите существующий, а не распространяйте его.   -  person Jonathan Grynspan    schedule 04.04.2012
comment
@JonathanGrynspan - Вы также не должны менять тему вопроса.   -  person Hot Licks    schedule 04.04.2012
comment
у меня нет. :) Я обновил вопрос для вас с отсутствующей информацией, чтобы другие пользователи могли ее найти.   -  person Jonathan Grynspan    schedule 04.04.2012
comment
@HotLicks, вы должны удалить свой другой вопрос и включить сюда информацию из него. На данный момент это стало сетевым вопросом, а не скриншотом.   -  person benzado    schedule 04.04.2012
comment
@benzado - Как-то бессмысленно, как оказалось, нет ответа ни на один вопрос.   -  person Hot Licks    schedule 04.04.2012
comment
@HotLicks Stack Overflow — это не дискуссионный форум, это создание полезного репозитория вопросов и ответов, так что нет, не бессмысленно.   -  person benzado    schedule 04.04.2012
comment
возможный дубликат Как сделать снимок экрана программно   -  person bjb568    schedule 28.07.2014
comment
Почти уверен, что приведенное выше не является обманом, поскольку оно не захватывает весь экран (включая заголовок), как я пытался сделать.   -  person Hot Licks    schedule 28.07.2014


Ответы (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");
person Jonathan Grynspan    schedule 03.04.2012
comment
Куча неопределенных типов в if.h. - person Hot Licks; 04.04.2012
comment
Каких типов не хватает? Возможно, вам нужно включить еще один заголовок. - person Jonathan Grynspan; 04.04.2012
comment
Например, похоже на sockaddr. - person Hot Licks; 04.04.2012
comment
Попробуй сейчас; Я добавил недостающий заголовок. Функции и типы сокетов разбросаны по нескольким файлам, и найти все правильные заголовки может быть непросто. - person Jonathan Grynspan; 04.04.2012
comment
В режиме полета en0 отображается (1x) и работает (40x) -- 8863x. - person Hot Licks; 04.04.2012
comment
en0 также 8863x, когда не в режиме полета. - person Hot Licks; 04.04.2012
comment
Это интересно, так как флаги определенно меняются, когда Wi-Fi переключается вручную. - person Jonathan Grynspan; 04.04.2012

На данный момент кажется очевидным, что нет простого способа определить, включен ли режим полета. Хотя вы, вероятно, могли бы сделать вывод, просмотрев низкоуровневую информацию о сетевом стеке или просмотрев пиксели строки состояния, любой метод будет полагаться на недокументированное поведение. Очень возможно, что в будущем выпуске iOS или будущем устройстве iOS поведение изменится, и ваш код будет генерировать ложноположительный или ложноотрицательный результат.

(Не говоря уже о том, что на будущих устройствах помех может вообще не быть.)

Если бы я был на вашем месте, я бы:

  1. Сообщите об ошибке, чтобы Apple знала, что вам нужна эта функция.

  2. Внесите уведомление в приложение, независимо от того, включен ли режим полета. Да, это может немного раздражать пользователя, если оно включено, но общий вред минимален. Я бы, вероятно, сделал это предупреждением, которое появляется только один раз (сохранение ключа в NSUserDefaults, чтобы указать, отображалось ли оно уже).

  3. Если вы хотите получить супер-фантазию, проанализируйте записанный звук и, если будет обнаружено жужжание, снова напомните пользователю включить режим полета во время записи. Вы можете сделать это в режиме реального времени или после того, как клип был записан, в зависимости от того, что имеет смысл для вашего приложения.

person benzado    schedule 03.04.2012

В качестве альтернативного решения, возможно, вы могли бы определить тип подключения, например: https://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html . С некоторой дополнительной проверкой типа устройства вы можете предупредить пользователя только в том случае, когда ему нужно действовать.

person strings42    schedule 03.04.2012

Немного другой подход, но вы также можете ссылаться на страницы в приложении «Настройки». Возможно, вы могли бы сделать ссылку на основную страницу и сообщить пользователю о необходимых вам изменениях.

person Sam    schedule 03.04.2012

Кажется, нет никакого способа сделать это.

person Hot Licks    schedule 04.04.2012