Есть ли (легальный) способ захватить ВЕСЬ экран под iOS? - PullRequest
5 голосов
/ 03 апреля 2012

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

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

Есть идеи?

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

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

Ответы [ 5 ]

6 голосов
/ 03 апреля 2012

Фактическая проблема, определяющая, активен ли сетевой интерфейс, может быть решена с помощью сетевых функций 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");
2 голосов
/ 04 апреля 2012

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

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

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

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

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

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

0 голосов
/ 04 апреля 2012

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

0 голосов
/ 03 апреля 2012

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

0 голосов
/ 03 апреля 2012

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

...