Стандартный способ обнаружить мобильные браузеры в веб-приложении на основе запроса HTTP

Использование boost :: preprocessor делает возможным изящное решение, подобное следующему:

Шаг 1: включить файл заголовка:

#include "EnumUtilities.h"

Шаг 2: объявите объект перечисления со следующим синтаксисом:

MakeEnum( TestData,
         (x)
         (y)
         (z)
         );

Шаг 3: используйте ваши данные:

Получение количества элементов:

td::cout << "Number of Elements: " << TestDataCount << std::endl;

Получение связанной строки:

std::cout << "Value of " << TestData2String(x) << " is " << x << std::endl;
std::cout << "Value of " << TestData2String(y) << " is " << y << std::endl;
std::cout << "Value of " << TestData2String(z) << " is " << z << std::endl;

Получение значения перечисления из связанной строки:

std::cout << "Value of x is " << TestData2Enum("x") << std::endl;
std::cout << "Value of y is " << TestData2Enum("y") << std::endl;
std::cout << "Value of z is " << TestData2Enum("z") << std::endl;

Это выглядит чистым и компактным, без добавления дополнительных файлов. Код, который я написал в EnumUtilities.h, следующий:

#include 
#include 

#define REALLY_MAKE_STRING(x) #x
#define MAKE_STRING(x) REALLY_MAKE_STRING(x)
#define MACRO1(r, data, elem) elem,
#define MACRO1_STRING(r, data, elem)    case elem: return REALLY_MAKE_STRING(elem);
#define MACRO1_ENUM(r, data, elem)      if (REALLY_MAKE_STRING(elem) == eStrEl) return elem;


#define MakeEnum(eName, SEQ) \
    enum eName { BOOST_PP_SEQ_FOR_EACH(MACRO1, , SEQ) \
    last_##eName##_enum}; \
    const int eName##Count = BOOST_PP_SEQ_SIZE(SEQ); \
    static std::string eName##2String(const enum eName eel) \
    { \
        switch (eel) \
        { \
        BOOST_PP_SEQ_FOR_EACH(MACRO1_STRING, , SEQ) \
        default: return "Unknown enumerator value."; \
        }; \
    }; \
    static enum eName eName##2Enum(const std::string eStrEl) \
    { \
        BOOST_PP_SEQ_FOR_EACH(MACRO1_ENUM, , SEQ) \
        return (enum eName)0; \
    };

Есть некоторые ограничения, то есть препроцессор boost ::. В этом случае список констант не может превышать 64 элемента.

Следуя той же логике, вы также можете подумать о создании разреженного перечисления:

#define EnumName(Tuple)                 BOOST_PP_TUPLE_ELEM(2, 0, Tuple)
#define EnumValue(Tuple)                BOOST_PP_TUPLE_ELEM(2, 1, Tuple)
#define MACRO2(r, data, elem)           EnumName(elem) EnumValue(elem),
#define MACRO2_STRING(r, data, elem)    case EnumName(elem): return BOOST_PP_STRINGIZE(EnumName(elem));

#define MakeEnumEx(eName, SEQ) \
    enum eName { \
    BOOST_PP_SEQ_FOR_EACH(MACRO2, _, SEQ) \
    last_##eName##_enum }; \
    const int eName##Count = BOOST_PP_SEQ_SIZE(SEQ); \
    static std::string eName##2String(const enum eName eel) \
    { \
        switch (eel) \
        { \
        BOOST_PP_SEQ_FOR_EACH(MACRO2_STRING, _, SEQ) \
        default: return "Unknown enumerator value."; \
        }; \
    };  

В этом случае, синтаксис:

MakeEnumEx(TestEnum,
           ((x,))
           ((y,=1000))
           ((z,))
           );

Использование аналогично выше (минус функция eName ## 2Enum, которую вы могли бы попробовать экстраполировать из предыдущего синтаксиса).

Я протестировал его на mac и linux, но имейте в виду, что boost :: preprocessor не может быть полностью переносимым.

56
задан Peter 16 September 2009 в 19:14
поделиться

11 ответов

Разве стандартный путь не состоял бы в том, чтобы проверить агент пользователя? Вот база данных агентов пользователя , можно использовать для обнаружения мобильных браузеров.

42
ответ дан David 26 November 2019 в 17:22
поделиться

можно использовать веб-сервис для обнаружения мобильного просмотра как handsetdetection.com.

0
ответ дан 26 November 2019 в 17:22
поделиться

Необходимо будет проверить строку агента пользователя с ранее определенным списком, как этот

0
ответ дан hayalci 26 November 2019 в 17:22
поделиться

Вы получите большую часть информации как браузер, устройство, принял языки, принятые форматы и т.д. от заголовка запроса. Упомянутый выше агент пользователя является частью заголовка запроса.

1
ответ дан Vijesh VP 26 November 2019 в 17:22
поделиться

Эта статья продолжение ) кажется хорошей.

4
ответ дан Milen A. Radev 26 November 2019 в 17:22
поделиться

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

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

Прямо сейчас могло бы быть достаточно кодировать сайт, который работает с iPhone и с Opera посредством сниффинга браузера - но Гуглит Android, прибывает в любой момент и существует много других мобильных телефонов, которые будут иметь функциональность браузера близко к iPhone в ближайшем будущем, и это были бы отходы для разработки мобильного веб-сайта, который не поддерживал те устройства, максимально хорошие с нуля.

6
ответ дан Valery Viktorovsky 26 November 2019 в 17:22
поделиться

ответ @David упомянул, что использовал WURFL - который является, вероятно, Вашим наилучшим вариантом. Будьте предупреждены, однако, показатель успешности составляет обычно приблизительно 60% (от моего и опыта других). С поставщиками услуг, изменяющими UA постоянно и сумма профилей устройства, которые существуют (60,000 +?), нет никакого пуленепробиваемого способа получить все правильные данные, которые Вы хотите.

Просто немного предупреждения прежде, чем положиться в большой степени на DB устройства. Я попытался бы не торопиться с решением, позволив им изменить опции сессии в случае, если я не угадал.

20
ответ дан user151019 26 November 2019 в 17:22
поделиться

Предлагаю бесплатную систему обнаружения, основанную на uaprof и пользовательском агенте: http://www.mobilemultimedia.be UAprof должен быть первичным ключом для обнаружения, когда он доступен, поскольку обычно существует несколько пользовательских агентов для одного и того же uaprof. Если вы хотите управлять этим самостоятельно, вам следует выбрать Wurfl, потому что вы можете загрузить всю базу данных и управлять ею локально самостоятельно.

2
ответ дан 26 November 2019 в 17:22
поделиться

Дело в том, что просто полагаться на агент пользователя недостаточно для обнаружения мобильных браузеров.

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

Я нашел отличный сайт по текст ссылки , который основан на том же решении, что и MTV использовать для всех своих мобильных веб-сайтов. Он ДЕЙСТВИТЕЛЬНО хорош, поскольку имеет независимый от устройства язык разметки, но, что более важно, они предлагают вызов веб-службы для isMobileDevice ().

Просто посмотрите в руководстве, а затем «как это работает».

I » Я использую его для сайтов моих клиентов и еще не нашел мобильного браузера, который он не обнаруживал бы точно. Совершенно ослепляюще!

0
ответ дан 26 November 2019 в 17:22
поделиться

Когда недавно у меня была аналогичная потребность, Я нашел этот код , который использует HTTP_X_WAP_PROFILE , HTTP_ACCEPT и HTTP_USER_AGENT , чтобы идентифицировать браузер как мобильный или немобильный. Это PHP, но его можно довольно легко преобразовать во все, что вам нужно (я реализовал его на VBScript для классического ASP).

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

2
ответ дан 26 November 2019 в 17:22
поделиться

После нескольких дней поисков правильного способа обнаружения мобильного устройства, я решил не усложнять [глупость] и поместить кнопку "Сайт мобильных устройств" на свою индексную страницу. ... это всего в один клик!

5
ответ дан 26 November 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: