Создание и заполнение файла Excel с библиотекой ExcelPHP

👁 48 просмотров

Про установку и подключении библиотеки в статье Чтение Excel из PHP.

Простой пример создания и заполнения файла средствами PHP на основе библиотеки ExcelPHP

<?php
//Поключаем основной класс
require_once $_SERVER['DOCUMENT_ROOT'].'/vendor/PHPExcel/Classes/PHPExcel.php';

//Создаем массив и заполняем некоторыми данными
//Некоторый исходный массив с данными
$users = Array(
    Array("login"=>"login1","name"=>"Имя1","surname"=>"Фамилия1","patronymic"=>"Фамилия1"),
    Array("login"=>"login2","name"=>"Имя2","surname"=>"Фамилия2","patronymic"=>"Фамилия2"),
    Array("login"=>"login3","name"=>"Имя3","surname"=>"Фамилия3","patronymic"=>"Фамилия3"),
    Array("login"=>"login4","name"=>"Имя4","surname"=>"Фамилия4","patronymic"=>"Фамилия4")
);
//Название файла
$fileName = "Название теста: ".$quiz->getName()."";
//Массив для заполнения;
$arrResult;
//Массив с индексом 0 для заголовков колонок
$arrResult[] = Array(0=>"Пользователь", 1=>"Имя", 2=>"Фамилия", 3=>"Отчество", 4=>"Правильно ответил",5=>"Из вопросов");

foreach ($users as $user) :
    $arrResult[] = Array(0=>$user["login"], 1=>$user["name"], 2=>$user["surname"], 3=>$user["patronymic"]);
endforeach;

//Заполняем наш файл Excel
$objPHPExcel = new PHPExcel();
$objPHPExcel->getProperties()
->setCreator("Temporaris")
->setLastModifiedBy("Temporaris")
->setTitle("Template Relevé des heures intérimaires")
->setSubject("Template excel")
->setDescription("Template excel permettant la création d'un ou plusieurs relevés d'heures")
->setKeywords("Template excel");
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->SetCellValue('A1', $fileName);
for($i=0; $i<=(count($arrResult));$i++)
{
    $uLogin = $arrResult[$i][0];
    $uName = $arrResult[$i][1];
    $uSurname = $arrResult[$i][2];
    $uPatro = $arrResult[$i][3];
    //
    $ind = $i + 2;//нулевой строки в Excel нет, а первая для заголовка добавлен выше
    $objPHPExcel->getActiveSheet()->SetCellValue('A'.$ind, $uLogin);
    $objPHPExcel->getActiveSheet()->SetCellValue('B'.$ind, $uName);
    $objPHPExcel->getActiveSheet()->SetCellValue('C'.$ind, $uSurname);
    $objPHPExcel->getActiveSheet()->SetCellValue('D'.$ind, $uPatro);
}
//Сохраняем файл на сервере
$writer = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$writer->save($_SERVER['DOCUMENT_ROOT'] . "/files/result.xls");
//Теперь можно загрузить это через браузер
echo "<a class='btn btn-lg btn-success' href='".$_SERVER['DOCUMENT_ROOT']."/files/result.xls' download='Результаты.xls'>Загрузить в формате Excel</a>";
?>

 

Jodit — лучший WYSIWYG редактор

👁 0 просмотров

Отличный редактор WYSIWYG, написанный на чистом TypeScript без использования дополнительных библиотек. Это редактор файлов и редактор изображений. Позволяет также работать и в динамическом режиме, если вам нужно показать редактор в попап — диалоге. Пример с jsFiddle

Использование Composer с OpenServer на Windows

👁 193 просмотров

Composer — это инструмент управления зависимостями в PHP. Он позволяет вам декларировать библиотеки, от которых зависит ваш проект, и он будет управлять (устанавливать / обновлять) их для вас.

Composer не является менеджером пакетов в том же смысле, что и Yum или Apt. Да, он имеет дело с «пакетами» или библиотеками, но управляет ими на основе каждого проекта, устанавливая их в каталоге (например, vendor) внутри вашего проекта. По умолчанию он не устанавливает ничего глобально. Таким образом, это менеджер зависимостей. Тем не менее, он поддерживает глобальный проект для удобства с помощью глобальной команды. Эта идея не нова, и композитор сильно вдохновлен npm в Node.js и менеджером пакетов в ruby.

Предположим:

  1. У вас есть проект, который зависит от ряда библиотек.
  2. Некоторые из этих библиотек зависят от других библиотек.

Что делает Composer:

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

Для запуска Composer требуется PHP 5.3.2+. Также требуются несколько чувствительных настроек php и флагов компиляции, но при использовании установщика вы будете предупреждены о любых несовместимостях.

Для установки пакетов из источников вместо простых zip-архивов вам понадобятся git, svn, fossil или hg в зависимости от того, как пакет управляется версией.

Composer является многоплатформенным, и разработчики стремятся сделать его одинаково хорошо работающим в Windows, Linux и OSX.

Настройка OpeServer

Для начала необходимо выбрать один из версий модулей PHP 5.3.2+, с которым устанвалвиваемый Composer будет работать. Делается это в настройках

Установка при помощи инсталятора Windows

Установщик загрузит композитор для вас и настроит переменную среды PATH, чтобы вы могли просто вызвать композитор из любого каталога.

Загрузите и запустите Composer-Setup.exe — он будет устанавливать последнюю версию композитора всякий раз, когда он выполняется. В процессе установки установщик запросит место установки и путь к PHP, который нужно указать тот, который мы выбрали в настройках Open Server. Версии модулей PHP у Open Server находятся по пути Open Server\modules\php\[PHP-5.6-x64].

Далее проверяем версию, чтобы убедится на то, что Composer удачно установился командой

php composer.phar -V

Чтобы выполнять команды Composer по команде composer добавляем путь в PATH

echo @php "%~dp0composer.phar" %*>composer.bat

Она создаст .bat файл и в дальнейшем можно будет работать без указания php composer.phar, просто указывая composer Т.е. команда проверки версии (которая была выше) будет выглядеть так:

composer -V

Установка при помощи CMD Windows

Чтобы быстро установить Composer в текущем каталоге, запустите в своем терминале следующий сценарий

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

Этот скрипт установщика будет просто проверять некоторые настройки php.ini, предупреждать вас, если они установлены неправильно, а затем загрузить последнюю версию composer.phar в текущем каталоге. 4 строчки выше, делают следующие действия:

  • Загружает установщик в текущий каталог
  • Проверяет установщик на SHA-384, который вы также можете перекрестно проверить здесь.
  • Запускает установщик
  • Удаляет установщик

Далее проверяем версию, чтобы убедится на то, что Composer удачно установился командой

php composer.phar -V

Чтобы выполнять команды Composer по команде composer добавляем путь в PATH

echo @php "%~dp0composer.phar" %*>composer.bat

Она создаст .bat файл и в дальнейшем можно будет работать без указания php composer.phar, просто указывая composer Т.е. команда проверки версии (которая была выше) будет выглядеть так:

composer -V

 

Постановка задачи

👁 59 просмотров

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

Стадия постановки задачи включает 3 стадии:

  1. Проведение системно-аналитического обследования;
  2. Разработка концепции системы
  3. Разработка технического задания на проект.

 

Системно-аналитическое обследование

Цель обследования – получение моделей данных и описание процедур принятия проектных и управленческих решений. Эта стадия носит неформальный характер, широко привлекаются эксперты.
Основные задачи предпроектного обследования информатизируемых процессов:

  • анализ существующей системы обработки информации – ответ на вопрос «что информатизировать?» (описание участников проекта и распределение задач между ними, определение потоков данных, оценка объемов информации), описание программно-технических средств (аппаратная платформа, операционная система, средства разработки), перспективы развития и предложения по доработке и замене;
  • выявление потребностей, которые должны удовлетворяться системой: описание маршрутов движения информации, описание аналитических задач для принятия решений, описание информационного обеспечения (состав, содержание и форматы данных);
  • построение функциональной и информационной модели – представление в виде схем существующей системы обработки и передачи информации с подробным описанием содержания ее составных частей;
  • определение представляемых данных: классификация пользователей системы (по функциям, по доступу к данным), описание типов представлений данных (таблицы, графики и др.), описание пользовательских интерфейсов, описание процедур обработки данных;
  • разработка рекомендаций по организации процесса информатизации в условиях перехода к работе с информационной системой.

Выбор состава информатизируемых процессов и соизмерение получаемого эффекта с затратами на его достижение осуществляется на основании анализа экономической целесообразности информатизации процесса (эффективности) и степени подготовленности предприятия.

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

 

Разработка концепции системы

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

Формирование концепции осуществляется на основании системного подхода (в единстве выступают анализ и синтез, целостность рассмотрения системы):

  • система разрабатывается на основе целостной картины информации с учетом развития той предметной области, которую она описывает;
  • части и целое выступают в единстве и взаимоопределяются (часть нельзя рассматривать в отрыве от целого, целое нельзя понять, не поняв сути частей – это и есть требование параллельного ведения работ) — отдельные подсистемы могут создаваться независимо, но на основании целостной концепции системы.

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

Цель разработки информационной системы – повышение эффективности работы организации (предприятия).

Обобщенные задачи информатизации:

  • обеспечение необходимого объема и качества информации для принятия проектных решений;
  • сокращение трудозатрат при выполнении типовых информационных процессов: сбора, обработки, регистрации, передачи данных по различным каналам связи, хранения, поиска и выдачи информации.

Информатизация может осуществляться в различных масштабах – от отдельных информационных процессов и процедур обработки данных до создания функционально полных автоматизированных информационных систем.

Различные подходы к решению проблемы информатизации процесса проектирования:

  • развитие (доработка) существующей информационной системы для решения новых задач и переход на новые информационные технологии существующих информационных систем;
  • создание новой информационной системы в полном наборе подсистем, функций и комплексов задач.

От этого зависят цели и концепции построения информационной системы, методология выполнения проектных работ, применяемые средства автоматизации.
Поскольку информатизируемая система создается в изменяющейся среде, постоянно развивается, изменяет свои функции и структуру, и информационная система должна отслеживать эти изменения.
Информационная система никогда не будет разработана окончательно, поскольку она эксплуатируется в постоянно меняющихся условиях, отсюда – системно-аналитическое обследование предметной области должно проводиться постоянно.
Основное требование к процессу проектирования информационной системы – непрерывное протекание процесса, пока существует информатизируемая система (организация). Это предполагает: выявление новых процессов, нуждающихся в информатизации, доработку информационной системы и на основании этого перепроектирование процессов (реинжениринг), изменение структуры предприятия и т.д.

Отсюда особенность проектирование информационной системы – параллельное сосуществование и развитие трех взаимодействующих друг с другом процессов:

  • анализ текущих информационных процессов и структуры предприятия;
  • проектирование информационной системы обеспечения процесса проектирования;
  • изменение информационных процессов и структуры предприятия.

В таком случае процесс проектирования не должен быть строго структурирован. Структурируются:

  • объекты и понятия, которые требуют последовательного уточнения, но последовательность их рассмотрения не регламентируется;
  • крупные уровни архитектуры системы.

Основное содержание концепции:

  • общие положения: цели и задачи создания системы, основные методические и технологические принципы построения;
  • описание объектов информатизации: описание автоматизируемых процессов и декомпозиция их на функции и задачи, информационные потоки;
  • укрупненная архитектура системы и виды обеспечений: архитектура процессов, компонентов, техническая архитектура, описание информационного, программного, технического, организационного обеспечений;
  • план создания системы: стратегия создания системы, стадии и этапы работ;
  • обоснование выбора поставщиков программно-технического обеспечения: определение требований к программно-техническому обеспечению и критериев его выбора, анализ рынка и выбор поставщиков программно-технического обеспечения;
  • технико-экономическое обоснование создания системы: оценка затратной части проекта (закупка общего программного обеспечения и технических средств, разработка специального программного обеспечения, затраты на эксплуатацию и сопровождение), оценка эффективности системы.

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

 

Разработка технического задания

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

Типовые сведения, содержащиеся в техническом задании: цель разработки системы, требования к системе, назначение системы, состав автоматизированных рабочих мест, состав документов или иных информационных объектов в результате ее работы.

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


Источники

  1. Неизвестен

Познание

👁 58 просмотров

Познание — совокупность процессов, процедур и методов приобретения знаний о явлениях и закономерностях объективного мира.

Познание является основным предметом гносеологии (теории познания). Устанавливая сущность познания, его формы и принципы, теория познания стремится ответить на вопрос, как возникает знание и как оно соотносится с действительностью.

Познание изучается не только философией. Существует ряд других специальных наук и научных дисциплин, исследующих тот же предмет:

  • когнитивная психология;
  • научная методология;
  • история науки;
  • науковедение;
  • социология знания и т.д.

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

Цель познания

Декарт видел цель познания в овладении силами природы, а также в усовершенствовании самой природы человека.

Формы познания

Говоря о формах познания, выделяют прежде всего научное и ненаучное познание, причём к последнему относятся обыденное и художественное познание, а также познание мифологическое и религиозное.

Научное

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

Художественное

Отражение существующей реальности через знаки, символы, художественные образы.

Философское

Философское познание представляет собой особый тип целостного познания мира. Спецификой философского познания является стремление выйти за пределы фрагментарной действительности и найти фундаментальные принципы и основы бытия, определить место человека в нём. Философское познание основано на определённых мировоззренческих предпосылках. В его состав входят: гносеология, онтология и этика. В процессе философского познания субъект стремится не только понять бытие и место человека в нём, но и показать, какими они должны быть (аксиология), то есть стремится создать идеал, содержание которого будет обусловлено избранными философом мировоззренческими постулатами.

Мифологическое

Мифологическое познание характерно для первобытной культуры. Такое познание выступает как целостное дотеоретическое объяснение действительности при помощи чувственно-наглядных образов сверхъестественных существ, легендарных героев, которые для носителя мифологического познания предстают реальными участниками его повседневной жизни. Мифологическое познание характеризуется персонификацией, олицетворением сложных понятий в образах богов и антропоморфизмом.

Моторное познание

Понятие моторного познания охватывает явление познания, воплощенного в действии, при котором моторная система участвует в том, что рассматривается как умственная обработка, включая процессы, обеспечивающие социальное взаимодействие. Моторное познание принимает во внимание подготовку и производство действий, а также процессов, участвующих в распознавании, предсказании, имитации и понимании поведения других людей. Основная единица моторной парадигмы познания — действие, выраженное как перемещения, произведенные, чтобы удовлетворить намерение определенной моторной цели, или выраженное в реакции на значимое событие в физических и социальных средах. Эта парадигма получила большое внимание и эмпирическую поддержку в последние годы со стороны множества грандов исследования (Соммервиль Ж.А., Десети Дж.), включая психологию развития, познавательную (когнитивную) нейробиологию и социальную психологию.

Уровни научного познания

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

История понятия

Платон

Всё, доступное познанию, Платон в VI книге «Государство» делит на два рода: чувственно-воспринимаемое и познаваемое умом. Отношение между сферами чувственно-воспринимаемого и умопостигаемого определяет и отношение разных познавательных способностей: ощущения позволяют познавать (хоть и недостоверно) мир вещей, разум позволяет узреть истину.

Кант

«Существуют два основных ствола человеческого познания, вырастающие, быть может, из одного общего, но неизвестного нам корня, а именно чувственность и рассудок: посредством чувственности предметы нам даются, рассудком же они мыслятся». И. Кант.

Познание в психологии

В психологии познание (когнитивность) рассматривают как способность к умственному восприятию и переработке внешней информации[8]. Это понятие применяется по отношению к психическим процессам личности и особенно к так называемым «психическим состояниям» (убеждениям, желаниям и намерениям). Данный термин также используется шире, обозначая акт познания или само знание и может быть интерпретирован в культурно-социальном смысле как обозначающий появление знания и концепций, связанных с этим знанием.

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

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

Теоретическую школу, изучающую мышление с позиции когнитивности, обычно называют «школой когнитивизма» (англ. cognitivism).

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

  • Философия сознания
  • Лингвистика (в особенности, психолингвистика и когнитивная лингвистика)
  • Экономика (особенно экспериментальная экономика)
  • Теория обучения

В свою очередь, когнитивная теория, будучи весьма эклектичной в самом общем смысле, заимствует знания из следующих областей:

  • Информатика и теория информации, где попытки построить искусственный интеллект и так называемый «коллективный интеллект» фокусируются на имитации способностей живых существ к распознаванию (то есть к когнитивным процессам);
  • Философия, эпистемология и онтология;
  • Биология и неврология;
  • Математика и теория вероятности;
  • Физика, где принцип наблюдателя изучается математически.

Источники

  1. https://ru.wikipedia.org/wiki/Познание

Системный подход

👁 109 просмотров

Системный подход — направление методологии научного познания, в основе которого лежит рассмотрение объекта как системы: целостного комплекса взаимосвязанных элементов (И. В. БлаубергВ. Н. СадовскийЭ. Г. Юдин); совокупности взаимодействующих объектов (Л. фон Берталанфи); совокупности сущностей и отношений (А. Д. Холл, Р. И. Фейджин, поздний Л. фон Берталанфи).

Основные принципы системного подхода:

  • Целостность, позволяющая рассматривать одновременно систему как единое целое и в то же время как подсистему для вышестоящих уровней.
  • Иерархичность строения, то есть наличие множества (по крайней мере, двух) элементов, расположенных на основе подчинения элементов низшего уровня элементам высшего уровня. Реализация этого принципа хорошо видна на примере любой конкретной организации. Как известно, любая организация представляет собой взаимодействие двух подсистем: управляющей и управляемой. Одна подчиняется другой.
  • Структуризация, позволяющая анализировать элементы системы и их взаимосвязи в рамках конкретной организационной структуры. Как правило, процесс функционирования системы обусловлен не столько свойствами её отдельных элементов, сколько свойствами самой структуры.
  • Множественность, позволяющая использовать множество кибернетических, экономических и математических моделей для описания отдельных элементов и системы в целом.
  • Системность, свойство объекта обладать всеми признаками системы.

Основные определения системного подхода

Основоположниками системного подхода являются: А. А. Богданов, Л. фон Берталанфи, Э. де Боно, Л. ла Руш, Г. Саймон, П. Друкер, А.Чандлер, С. А. Черногор, Малюта А.Н.

  • Система — совокупность элементов, действующих вместе как целое и выполняющих этим определенную функцию.
  • Структура — способ взаимодействия элементов системы посредством определённых связей (картина связей и их стабильностей).
  • Процесс — динамическое изменение системы во времени.
  • Функция — работа элемента в системе.
  • Состояние — положение системы относительно других её положений.
  • Системный эффект — такой результат специальной переорганизации элементов системы, когда целое становится больше простой суммы частей.
  • Структурная оптимизация — целенаправленный итерационный процесс получения серии системных эффектов с целью оптимизации прикладной цели в рамках заданных ограничений. Структурная оптимизация практически достигается с помощью специального алгоритма структурной переорганизации элементов системы. Разработана серия имитационных моделей для демонстрации феномена структурной оптимизации и для обучения.

Базовая аксиоматика

  1. Системы существуют.
  2. Системное представление истинно.
  3. Системы взаимодействуют друг с другом, и следовательно, могут быть взаимосвязаны.
  4. Системы состоят из элементов действующих вместе как целое и являющих этим сущность систем.
  5. Любой элемент системы можно представить как отдельную систему. Любую систему можно представить как отдельный элемент вышестоящей системы.
  6. Мир выразим в понятиях системного представления.

Особенности системного подхода

Системный подход — это подход, при котором любая система (объект) рассматривается как совокупность взаимосвязанных элементов (компонентов), имеющая выход (цель), вход (ресурсы), связь с внешней средой, обратную связь. Это наиболее сложный подход. Системный подход представляет собой форму приложения теории познания и диалектики к исследованию процессов, происходящих в природе, обществе, мышлении. Его сущность состоит в реализации требований общей теории систем, согласно которой каждый объект в процессе его исследования должен рассматриваться как большая и сложная система и одновременно как элемент более общей системы.

Развёрнутое определение системного подхода включает также обязательность изучения и практического использования следующих восьми его аспектов:

  1. системно-элементного или системно-комплексного, состоящего в выявлении элементов, составляющих данную систему. Во всех социальных системах можно обнаружить вещные компоненты (средства производства и предметы потребления), процессы (экономические, социальные, политические, духовные и т. д.) и идеи, научно-осознанные интересы людей и их общностей;
  2. системно-структурного, заключающегося в выяснении внутренних связей и зависимостей между элементами данной системы и позволяющего получить представление о внутренней организации (строении) исследуемой системы;
  3. системно-функционального, предполагающего выявление функций, для выполнения которых созданы и существуют соответствующие системы;
  4. системно-целевого, означающего необходимость научного определения целей и подцелей системы, их взаимной увязки между собой;
  5. системно-ресурсного, заключающегося в тщательном выявлении ресурсов, требующихся для функционирования системы, для решения системой той или иной проблемы;
  6. системно-интеграционного, состоящего в определении совокупности качественных свойств системы, обеспечивающих её целостность и особенность;
  7. системно-коммуникационного, означающего необходимость выявления внешних связей данной системы с другими, то есть её связей с окружающей средой;
  8. системно-исторического, позволяющего выяснить условия во времени возникновения исследуемой системы, пройденные ею этапы, современное состояние, а также возможные перспективы развития.

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

Как построить и запустить релиз-приложение iOS в Cordova

👁 97 просмотров

Будем исходить из того, что вы написали свое первое приложение под Android на Windows, используя, к примеру, редактор Visual Code и теперь хотите на основе уже написанного кода построить приложение под iOS, перекинув все исходник на ваш Mac — машину, где мы будет подготавливать, построить и подписывать приложение под iOS, прибегнув к помощи XCode.

Здесь представлен текст описания одного из вариантов построения приложения Cordova для платформы iOS. Перед началом работы условимся, что у  нас в инструментарии есть следующие необходимые условия:

  • у нас есть Mac OS High Sierra(или неважно какая версия, но чтобы работала стабильно);
  • на нашем Mac OS установлен XCode последней версии(или неважно какой версии, но чтобы работало стабильно);
  • на нашем Mac OS установлен Node.js v8 и выше(или неважно какой версии, но чтобы работало стабильно);
  • на нашем Node.js установлен Cordova;
  • у нас есть годовая подписка на возможность разрабатывать приложения под продукты Apple. Стоит это удовольствие $99, без этого ваш проект так и будет на стадии дебагинга, без возможности устанавливать на сторонние устройства или загружать на App Store.

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

Подписка на Apple Developer

Особо следует остановиться на покупку лицензии разработки в виде подписки, потому что без этого никак, если вы хотите подписать приложение и распространять его. У Apple распространители делятся на 4 категории:

  1. Sign in with Apple ID — распространители, которые имеют возможность использовать разработку только в режиме тестирования. Т.е., вы не можете распространять ваши приложения за пределы эмулятора на вашем Mac или вашего личного устройства, но весь функционал разработки вам все равно доступен. Стоит $0;
  2. Individual — распространитель в виде индивидуального разработчика. Apple выдает вам сертификат, в котором прописаны ваши личные данные, как физического лица. Стоит $99;
  3. Organization — распространитель от имени организации. Apple выдает вам сертификат, в котором прописаны вашей организации. Стоит $99;
  4. Enterprise Program — распространитель корпоративного ПО. Стоит $299.

Подробно про фичи разработки под тем или иной подпиской можно почитать по ссылке.

Настройка проекта Cordova

Добавляем платформу iOS и подготавливаем проект для XCode

cordova platform add ios
cordova prepare              # или "cordova build"

Развертывание проекта в Cordova

Примечание. Этап развертывания средствами Cordova можно пропустить, так как дальнейщую работу с проектом мы будем производить в XCode.

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

npm install -g ios-sim
npm install -g ios-deploy

В данной статье мы не будем работать через эти утилиты, а будем работать через XCode. Также через командную строку мы можем задеплоить приложение.

Для развертывания приложения на подключенном iOS устройстве:

cordova run ios --device

Для развертывания приложения на iOS эмуляторе по умолчанию:

cordova emulate ios

Можно использовать cordova run android —list чтобы увидеть все доступные цели и cordova run android —target=имя_устройства для запуска приложения на конкретном устройстве или эмуляторе (например, cordova run android --target="Nexus4_emulator").

Чтобы увидеть дополнительные параметры построения и запуска также можно использовать cordova run —help.

Работа с проектом в XCode iOS SDK

Первым делом открываем сгенерированный проект XCode в директории проекта Cordova по пути ProjectName/platforms/ios/PrjectName.xcpdeproj

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

Первым делом выбираем модуль Cordova в списке и при его контексте нажимаем на вкладку General, где устанавливаем галочку на автоуправление подпиской и в выпадающем нижнем списке выбираем команду разработки. В данном случае там указываем вашу купленную подписку разработчика у Apple

Первым делом выбираем конечное устройство в виде физического устройства

Далее заходим в настройку схемы проекты и там должен быть выбран название проекта,а  не библиотека Cordova

Если он не установлен, то заходим в Edit Scheme и во всех вкладках устанавливаем конфигурацию Build Configuration в режим Release, кроме вкладки Test

Теперь, нам нужно сначала почистить проект нажав на Clean, построить, нажав на Build и архивировать, нажав на Archive

Если мы все правильно настроили в проекте, то проект должен удачно архивировать в формат *.xcarchive по пути проекта ProjectName/platforms/ios/PrjectName.xcarchive

Чтобы увидеть все сгенерированные архивы проектов необходимо найти в верхнем меню Window > Organizer

В данном диалоге мы увидим список всех архивов. Это не полноценное приложение, которое можно уже установить на iOS — устройство и его нельзя разместить в маркет. Для этого нам нужно его экспортировать в один из вариантов и для этого сначала выбираем проект, далее нужный архив из проекта и нажав на кнопку Export вызываем окно выбора типа распространения нашего приложения в формате *.ipa

В способе распространения *.ipa выбираем нужный вариант. Если хотим распространить через App Store, о выбираем первый пункт. Второй пунтк — это распространение подписанного приложения с возможность индивидуальной установки без App Store. Другие можно понять по их кратким описаниям, но основные — это 2 первых, если вы новоиспеченный разработчик iOS.

К примеру выберем тип распространения Ad Hoc и жмем на Next и в следующем диалоге у нас будет возможность выбрать какое-то специфическое устройство или все поддерживающие данной разработкой устройства все сразу, также есть возможность добавить файл манифеста, который даст возможность установить приложение только из определенной ссылки скачивания и жмем на Next

В данном шаге необходимо выбрать режим подписи. Оставим автоподпись средой XCode и жмем на Next

Дальше среда будет генерировать подписанные дистрибутивы под разные устройства iOS

По окончании процесса среда выдаст подробную информацию о сборке

Жмем на кнопку Export и среда нас запросит выбрать место хранения сгенерированных подписанных дистрибутивов *.ipa

После сохранения создастся отдельная папка, в которой будут все наши подписанные дистрибутивы iOS

 

Чат на PHP, Ajax, HTML, CSS

👁 196 просмотров

Разделим код проекта на несколько частей: база данных, серверная и клиентская.

Клиентская часть

Клиентский интерфейс взимодействия

<!DOCTYPE HTML>
    <html>
    <head>
        <title>PhpAjaxChat</title>
        <!-- У нас всё работает в UTF-8 -->
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">

        <!-- Загружаем стили для чата -->
        <link rel="stylesheet" type="text/css" media="screen" href="style.css" />

        <!-- Подключаем jQuery -->
        <script src="jquery.js"></script>
        <!-- Подключаем скрипт чата -->
        <script src="script.js"></script>
    </head>
    <body>
        <div style="padding: 100px;">
            <h1>Php Ajax Chat</h1>
            <!-- Вот в этих 2-х div-ах будут идти наши сообщения из чата -->
            <div class="chat r4">
                <div id="chat_area"><!-- Сюда мы будем добавлять новые сообщения --></div>
            </div>
            <form id="pac_form" action=""><!-- Наша форма с именем, сообщением и кнопкой для отправки -->
                <table style="width: 100%;">
                    <tr>
                        <td>Имя:</td>
                        <td>Сообщение:</td>
                        <td></td>
                    </tr>
                    <tr>
                        <!-- Поле ввода имени -->
                        <td><input type="text" id="pac_name" class="r4" value="Гость"></td>
    
                        <!-- Поле ввода сообщения -->
                        <td style="width: 80%;"><input type="text" id="pac_text" class="r4" value=""></td>
    
                        <!-- Кнопка "Отправить" -->
                        <td><input type="submit" value="Отправить"></td>
                    </tr>
                </table>
            </form>
        </div>
    </body>
</html>

Скрипт работы на стороне клиента на JQuery/JavaScript

$(document).ready(function () {
                $("#pac_form").submit(Send); // вешаем на форму с именем и сообщением событие которое срабатывает когда нажата кнопка "Отправить" или "Enter"
                $("#pac_text").focus(); // по поле ввода сообщения ставим фокус
                setInterval("Load();", 2000); // создаём таймер который будет вызывать загрузку сообщений каждые 2 секунды (2000 миллисекунд)
            });

            // Функция для отправки сообщения
            function Send() {
                // Выполняем запрос к серверу с помощью jquery ajax: $.post(адрес, {параметры запроса}, функция которая вызывается по завершению запроса)
                $.post("ajax.php",
                        {
                            act: "send",  // указываем скрипту, что мы отправляем новое сообщение и его нужно записать
                            name: $("#pac_name").val(), // имя пользователя
                            text: $("#pac_text").val() //  сам текст сообщения
                        },
                        Load ); // по завершению отправки вызываем функцию загрузки новых сообщений Load()

                $("#pac_text").val(""); // очистим поле ввода сообщения
                $("#pac_text").focus(); // и поставим на него фокус

                return false; // очень важно из Send() вернуть false. Если этого не сделать то произойдёт отправка нашей формы, те страница перезагрузится
            }

            var last_message_id = 0; // номер последнего сообщения, что получил пользователь
            var load_in_process = false; // можем ли мы выполнять сейчас загрузку сообщений. Сначала стоит false, что значит - да, можем

            // Функция для загрузки сообщений
            function Load() {
                // Проверяем можем ли мы загружать сообщения. Это сделано для того, чтобы мы не начали загрузку заново, если старая загрузка ещё не закончилась.
                if(!load_in_process)
                {
                    load_in_process = true; // загрузка началась
                    // отсылаем запрос серверу, который вернёт нам javascript
                    $.post("ajax.php",
                            {
                                act: "load", // указываем на то что это загрузка сообщений
                                last: last_message_id, // передаём номер последнего сообщения который получил пользователь в прошлую загрузку
                                rand: (new Date()).getTime()
                            },
                            function (result) { // в эту функцию в качестве параметра передаётся javascript код, который мы должны выполнить
                                $(".chat").scrollTop($(".chat").get(0).scrollHeight); // прокручиваем сообщения вниз
                                load_in_process = false; // говорим что загрузка закончилась, можем теперь начать новую загрузку
                            });
                }
            }

Стили интерфейса

* {
    margin: 0;
    padding: 0;
    }

    body {
    font: normal normal normal 16px "Trebuchet MS", Arial, Times;
    color: #000000;
    }

    /* Важное свойство */
    .chat {
    height: 500px;
    overflow: auto; /* Это позволяет отображать полосу прокрутки */
    position: relative; /* Это позволяет съезжать тексту в слое, не растягивая страницу */
    text-align: left;
    border: solid #818181 1px;
    }

    .chat div {
    position: absolute; /* Страница остаётся того же размера */
    }

    .chat span {
    display: block;
    }

    input[type=text],textarea {
    width: 100%;
    font: normal normal normal 16px "Trebuchet MS", Arial, Times;
    border: solid #818181 1px;
    }

    /* Для CSS 3 */
    .r4 {
    -moz-border-radius: 4px;
    -khtml-border-radius: 4px;
    -webkit-border-radius: 4px;
    border-radius: 4px;
    }

База данных

В этой таблице у нас будут храниться сообщения чата:

  • id – номер сообщения, он должен быть помечен как AUTO_INCREMENT для того что бы для каждого сообщения создавался уникальный индекс
  • name – имя пользователя отправившего сообщение
  • text – само сообщение
CREATE TABLE `messages` (
    `id` int(5) NOT NULL AUTO_INCREMENT,
    `name` char(255) character SET utf8 NOT NULL,
    `text` text character SET utf8,
    PRIMARY KEY  (`id`)
    );

 

Серверная часть

<?php
// настройки для подключения к MySQl
$config = array('hostname' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'pacdb');

// подключаемся к MySQL, если не вышло то выходим
if (!mysql_connect($config['hostname'], $config['username'], $config['password'])) {
    exit();
}
// Выбираем базу данных, если не вышло то выходим
if (!mysql_select_db($config['dbname'])) {
    exit();
}
mysql_query("SET NAMES 'utf8'"); // говорим MySQl'у то что мы будем работать с UTF-8

Header("Cache-Control: no-cache, must-revalidate"); // говорим браузеру что-бы он не кешировал эту страницу
Header("Pragma: no-cache");

Header("Content-Type: text/javascript; charset=utf-8"); // говорим браузеру что это javascript в кодировке UTF-8

// проверяем есть ли переменная act (send или load), которая указываем нам что делать
if (isset($_POST['act'])) {
    // $_POST['act'] - существует
    switch ($_POST['act']) {
        case "send" : // если она равняется send, вызываем функцию Send()
            Send();
            break;
        case "load" : // если она равняется load, вызываем функцию Load()
            Load();
            break;
        default : // если ни тому и не другому  - выходим
            exit();
    }
}

// Функция выполняем сохранение сообщения в базе данных
function Send()
{
    // тут мы получили две переменные переданные нашим java-скриптом при помощи ajax
    // это:  $_POST['name'] - имя пользователя
    // и $_POST['text'] - сообщение

    $name = substr($_POST['name'], 0, 200); // обрезаем до 200 символов
    $name = htmlspecialchars($name); // заменяем опасные теги (<h1>,<br>, и прочие) на безопасные
    $name = mysql_real_escape_string($name); // функция экранирует все спец-символы в unescaped_string , вследствие чего, её можно безопасно использовать в mysql_query()

    $text = substr($_POST['text'], 0, 200); // обрезаем до 200 символов
    $text = htmlspecialchars($text); // заменяем опасные теги (<h1>,<br>, и прочие) на безопасные
    $text = mysql_real_escape_string($text); // функция экранирует все спец-символы в unescaped_string , вследствие чего, её можно безопасно использовать в mysql_query()

    // добавляем новую запись в таблицу messages
    mysql_query("INSERT INTO messages (name,text) VALUES ('" . $name . "', '" . $text . "')");
    }



    // функция выполняем загрузку сообщений из базы данных и отправку их пользователю через ajax виде java-скрипта
    function Load()
    {
    // тут мы получили переменную переданную нашим java-скриптом при помощи ajax
    // это:  $_POST['last'] - номер последнего сообщения которое загрузилось у пользователя

    $last_message_id = intval($_POST['last']); // возвращает целое значение переменной

    // выполняем запрос к базе данных для получения 10 сообщений последних сообщений с номером большим чем $last_message_id
    $query = mysql_query("SELECT * FROM messages WHERE ( id > $last_message_id ) ORDER BY id DESC LIMIT 10");

    // проверяем есть ли какие-нибудь новые сообщения
    if (mysql_num_rows($query) > 0) {
    // начинаем формировать javascript который мы передадим клиенту
    $js = 'var chat = $("#chat_area");'; // получаем "указатель" на div, в который мы добавим новые сообщения

    // следующий конструкцией мы получаем массив сообщений из нашего запроса
    $messages = array();
    while ($row = mysql_fetch_array($query)) {
    $messages[] = $row;
    }

    // записываем номер последнего сообщения
    // [0] - это вернёт нам первый элемент в массиве $messages, но так как мы выполнили запрос с параметром "DESC" (в обратном порядке),
    // то это получается номер последнего сообщения в базе данных
    $last_message_id = $messages[0]['id'];

    // переворачиваем массив (теперь он в правильном порядке)
    $messages = array_reverse($messages);

    // идём по всем элементам массива $messages
    foreach ($messages as $value) {
    // продолжаем формировать скрипт для отправки пользователю
    $js .= 'chat.append("<span>' . $value['name'] . '» ' . $value['text'] . '</span>");'; // добавить сообщние (<span>Имя » текст сообщения</span>) в наш div
    }

    $js .= "last_message_id = $last_message_id;"; // запишем номер последнего полученного сообщения, что бы в следующий раз начать загрузку с этого сообщения

    // отправляем полученный код пользователю, где он будет выполнен при помощи функции eval()
    echo $js;
    }
}

?>

Использование Google Firebase Cloud Messages (FCM) в проектах

👁 71 просмотров

Firebase Cloud Messaging (FCM) — это межплатформенное решение для обмена сообщениями, которое позволяет надежно доставлять сообщения без каких-либо затрат. Используя FCM, вы можете уведомить клиентское приложение о том, что для синхронизации доступны новые электронные или другие данные.

Статья состоит из 2 частей. В первой рассматривается введение и начальная настройка, а далее подробно раскрывается принцип отправки и обработки уведомлений FCM.

Часть 2. Принцип работы отправки и приемки уведомлений в Firebase Cloud Messages (FCM)

👁 241 просмотров

Это перевод и дополнение официальной статьи по плагину cordova-plugin-fcm.

Установка

Процесс установки мы уже рассматривали в первой части статьи. Перед началом, убедитесь, что у вас есть google-services.json для Android или GoogleService-Info.plist для iOS в корневой папке вашего проекта Cordova. Вам не нужно настраивать что-либо еще, чтобы иметь push-уведомление, работающее для обеих платформ, все это волшебство. Установка плагина FCM занимает не много времени

cordova plugin add cordova-plugin-fcm

Файлы конфигурации Firebase

Получите необходимые файлы конфигурации для Android или iOS из Firebase Console (см. документацию: https://firebase.google.com/docs/).

Детали компиляции под Android

Поместите загруженный файл «google-services.json» в корневую папку проекта Кордовы. Вам нужно будет убедиться, что вы установили соответствующие библиотеки Android SDK.

Если хотите добавить значок уведомления в Android> 5.0, то вы должны поместить картинку со значком с именем «fcm_push_icon.png» в папку «res» так же, как вы добавляете другие значки приложений. Если вы не установите этот ресурс, SDK будет использовать значок по умолчанию для вашего приложения, который может не соответствовать стандартам для Android> 5.0.

Детали компиляции под iOS

Поместите загруженный файл «GoogleService-Info.plist» в корневую папку проекта Cordova.

Использование FCM в Cordova

Пример заполнения JSON данных для отправки на сервер FCM по REST API представлен в ниже в подразделе Отправить уведомление. Пример из песочницы (REST API).

Настоятельно рекомендуется использовать REST API для отправки push-уведомлений, потому что консоль Firebase не имеет всех функций. Обратите внимание на пример в песочнице, чтобы научиться правильно использовать плагин. Вы также можете протестировать свои уведомления на бесплатном сервере тестирования: https://cordova-plugin-fcm.appspot.com.

Получение обновления токена

Токен — это идентификатор, выданный серверами соединения FCM, в клиентское приложение, который позволяет приложению получать сообщения. Обратите внимание, что регистрационные токены должны храниться в секрете.

//FCMPlugin.onTokenRefresh( onTokenRefreshCallback(token) );
/**
 * Обратите внимание, что этот Callback будет срабатывать каждый раз, 
 * когда будет сгенерироваться новый токен, в том числе и первый раз.
 */
FCMPlugin.onTokenRefresh(function(token){
    alert( token );
});

При первом запуске вашего приложения FCM SDK генерирует регистрационный токен для экземпляра клиентского приложения. Если вы хотите настроить таргетинг на отдельные устройства или создать группы устройств, вам необходимо получить доступ к этому токену или токенам.

Получение токена

Функция getToken возвращает токен текущего устройства или нулевое значение, если токен еще не установлен для устройства.

//FCMPlugin.getToken( successCallback(token), errorCallback(err) );
/**
 * Имейте в виду, то функция возвращает нулевое значение, 
 * если токен не был установлен еще.
 */
FCMPlugin.getToken(function(token){
    alert(token);
});
Подписаться на тему(топик)
//FCMPlugin.subscribeToTopic( topic, successCallback(msg), errorCallback(err) );
/**
 * Все устройства подписаны автоматически, 
 * ко 'всем' - и 'ios' и 'android' темам соответственно.
 * Должен соответствовать следующему регулярному выражению: "[a-zA-Z0-9-_.~%]{1,900}"
 */
 FCMPlugin.subscribeToTopic('topicExample');
Отписаться от темы(топика)
//FCMPlugin.unsubscribeFromTopic( topic, successCallback(msg), errorCallback(err) );
FCMPlugin.unsubscribeFromTopic('topicExample');
Получение данных push-уведомлений

Функция FCMPlugin.onNotification(…) принимает все уведомления, по токену или по топику, на который подписаны пользователи

//FCMPlugin.onNotification( onNotificationCallback(data), successCallback(msg), errorCallback(err) )
/**
 * Здесь Вы можете определить свое поведение приложения на основе данных уведомления.
 */
 FCMPlugin.onNotification(function(data){
    if(data.wasTapped){
      //Уведомление было получено в трей устройства и постучал пользователю.
      alert( JSON.stringify(data) );
    }else{
      //Уведомление было получено на переднем плане. Возможно, пользователя нужно уведомить.
      alert( JSON.stringify(data) );
    }
});

Следует отметить, что если вы используете Vue.js, как программную архитектуру или jQuery, то необходимо дождаться, пока ресурсы устройства подгрузятся, иначе можно получить ошибку, что плагин FCMPlugin не определен. Один из вариантов — размещение обработчика в setTimeout

var app = {
    initialize: function() {
        this.bindEvents();
        this.setupApp();
    },
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    onDeviceReady: function() {
    },
    setupApp: function() {
        //Программная логика на какой-то библиотеке
        setTimeout(function(){
            FCMPlugin.onNotification(function(data) {
                console.log(data);
            });
        },2000);
    }
}

app.initialize();

или разместить весь код в обработчике события deviceready

var app = {
    initialize: function() {
        this.bindEvents();
        this.setupApp();
    },
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    onDeviceReady: function() {
        FCMPlugin.onNotification(function(data) {
            console.log(data);
        });
    },
    setupApp: function() {
        //Программная логика на какой-то библиотеке
    }
}

app.initialize();
Отправить уведомление. Пример из песочницы (REST API)

Чтобы отправлять FCM — уведомления тому или иному устройству нам необходимо знать токен этого устройства и тему (топик), на который подписано устройство.

Как получить токен, подписаться устройство на тему(топик) и как отписаться мы выше уже привели примеры с кодом. Теперь нам осталось уметь отправлять уведомления и как мы уже говорили выше, для этого нужно отправлять JSON — с заполненными данными методом POST на адрес https://fcm.googleapis.com/fcm/send и потребуется указать еще 2 заголовка отправки, как Content-Type: application/json и Authorization: key=AIzaSy*******************. Первый заголовок указывает, что мы передаем JSON — данные и второй — что, запрос содержит учетные данные для аутентификации пользовательского агента с сервером. Второй заголовок принимает параметр ключа API для веб-приложения, который можно узнать в консоли FCM

 

Пример этой JSON приведен ниже и еще ниже описаны параметры, которые входят в эту строку.

Дополнительно:

{
  "notification":{
    "title":"Notification title",
    "body":"Notification body",
    "sound":"default",
    "click_action":"FCM_PLUGIN_ACTIVITY",
    "icon":"fcm_push_icon"
  },
  "data":{
    "param1":"value1",
    "param2":"value2"
  },
    "to":"/topics/topicExample",
    "priority":"high",
    "restricted_package_name":""
}

Метод передачи и заголовки с параметрами:

  • POST: https://fcm.googleapis.com/fcm/send
  • HEADER: Content-Type: application/json
  • HEADER: Authorization: key=AIzaSy*******************

Передаваемые параметры в JSON методом POST:

  • sound — необязательный параметр для указания своего звука уведомления
  • click_action — должен присутствовать с указанным значением для Android
  • icon — значок — имя ресурса для Android >5.0
  • data — положите любые «param»:»value» и получите их в JavaScript callback — уведомлениях
  • to — токен устройства или /topic/topicExample
  • priority — должен быть установлен в «high» для доставки уведомлений закрытым iOS — приложениям
  • restricted_package_name — Необязательное поле, если вы хотите отправить только на ограниченный пакет приложений (т.е.: com.myapp.test)
Пример отправки POST — запроса FCM — уведомления при помощи jQuery

В коде представлен пример AJAX запроса методом POST с указанием необходимых заголовков и их параметров

var fcm_server_key = "AIzaSy*******************";

$.ajax({
  method: "POST",
  dataType: 'json',
  headers: {'Content-Type': 'application/json', 'Authorization': 'key=' + fcm_server_key},
  url: "https://fcm.googleapis.com/fcm/send",
  data: JSON.stringify(
      {
        "notification":{
          "title":"Title",  //Любое значение
          "body": "Body",  //Любое значение
          "sound": "default", //Если вы хотите звучание в уведомление
          "click_action": "FCM_PLUGIN_ACTIVITY",  //Должен присутствовать для Android
          "icon": "fcm_push_icon"  //Белая иконка ресурса Android
        },
        "data":{
          "param1":"value1",  //Любые данные, получаемые в callback - уведомлении
          "param2": "Prueba"
        },
        "to":"/topics/all", //Тема(топик) или какое-то одно устройство
        "priority":"high", //Если не установлен, то уведомления не могут быть доставлены для закрытых приложений iOS
        "restricted_package_name":"" //Необязательно. Устанавливается для фильтрации приложений
      }
    )
}).success(function(data){
  alert("Success: " + JSON.stringify(data));
}).error(function(data){
  alert("Error: " + JSON.stringify(data));
});
Пример отправки POST — запроса FCM — уведомления при помощи cURL с сервера

Вот пример cURL. Не забудьте заменить авторизацию заголовка собственной учетной записью службы Firebase

curl -X POST \
  https://fcm.googleapis.com/fcm/send \
  -H 'authorization: key=YOUR-FIREBASE-SERVER-KEY' \
  -H 'cache-control: no-cache' \
  -H 'content-type: application/json' \
  -d '{
	"to": "/topics/all",
	"notification": {
	    "title": "Hello World!",
	    "body": "Proin rutrum, nunc vitae porta volutpat, mi nibh.",
        "icon": "fcm_push_icon",
    	"color": "#F79838",
        "sound":"default"
	},
	"priority": "high",
        "click_action":"FCM_PLUGIN_ACTIVITY"
}'

 

Пример отправки POST — запроса FCM — уведомления при помощи Axios из устройства

Axios — это отличная клиентская библиотека, которая использует промисы по умолчанию, а так же работает как на сервере(что делает его подходящим для получения данных при рендеринге на сервере), так и на клиенте. Axios очень легко начать использовать с Vue.js. Поэтому, если у вас приложение написано с использованием Vue.js или Ionic, то отправку уведомлений нам придется реализовать через Axios

var fcm_server_key = "AIzaSy*******************";

axios({
  method: 'POST', //Метод отправки
  url: 'https://fcm.googleapis.com/fcm/send',
  data: JSON.stringify(
      {
        "notification":{
          "title":"Title",  //Любое значение
          "body": "Body",  //Любое значение
          "sound": "default", //Если вы хотите звучание в уведомление
          "click_action": "FCM_PLUGIN_ACTIVITY",  //Должен присутствовать для Android
          "icon": "fcm_push_icon"  //Белая иконка ресурса Android
        },
        "data":{
          "param1":"value1",  //Любые данные, получаемые в callback - уведомлении
          "param2": "Prueba"
        },
        "to":"/topics/all", //Тема(топик) или какое-то одно устройство
        "priority":"high", //Если не установлен, то уведомления не могут быть доставлены для закрытых приложений iOS
        "restricted_package_name":"" //Необязательно. Устанавливается для фильтрации приложений
      }
    ),
  headers: {
    'Content-Type': 'application/json', 'Authorization': 'key=' + fcm_server_key
  }
}).then((response) => {
    console.log(response)
})
.catch((error) => {
    console.log(error)
});
    
Пример отправки POST — запроса FCM — уведомления при помощи Axios из Node.js

Для начала нам потребуется установить Axios в систему при помощи простой команды через менеджер модулей npm

npm install axios

Теперь создаем index.js в корневом каталоге вашего проекта и заполняем его следующим образом

var axios = require('axios');
const fcmKey = 'YOUR_FCM_SERVER_KEY'
const fcmUrl = 'https://fcm.googleapis.com/fcm/send'
const phoneToken = 'MY_PHONE_TOKEN'

Здесь мы просто импортируем модуль axios, устанавливаем ключ сервера api и указываем адрес сервера взаимодействия, на который мы отправляем POST наши уведомления. Константа phoneToken является идентификатором вашего телефона, который раздается клиентам сервером FCM для регистрации в системе обмена.

Чтобы наше уведомление отвечало на событие, мы заставим его прослушивать конечную точку тестирования в базе данных Firebase

ref.child('test').on('child_added', (snapshot) => {
  const notification = buildNotification(snapshot.val())
  sendNotification(notification)
})

Как вы можете видеть, это просто наблюдает за конечной точкой/тестом(endpoint /test) для нового потомка. Потомок — это просто ключ/значение(key/value) с ключом «name». Перейдем к нашей функции buildNotification()

function buildNotification (data) {
  const { name } = data
  return {
    "notification": {
      "title":"New name",
      "text":`${name} is awesome`,
      "sound":"default"
    },
    "to":phoneToken,
    "priority":"high"
  }
}

Не забудьте установить приоритет на высокий уровень при разработке, иначе может потребоваться некоторое время, прежде чем ваше уведомление поступит

function buildRequest (notification) {
  return {
    url: fcmURL,
    method: 'post',
    headers: {
      "Content-Type":"application/json",
      "Authorization":`key=${fcmKey}`
    },
    data: notification
  }
}
function sendNotification(notification) {
  const request = buildRequest(notification)
axios(request).then((r) => {
    console.log(r)
  }).catch((error) => {
    console.log(error)
  })
}

Сначала мы создаем запрос с нашим уведомлением и токеном FCM в заголовках запросов. Затем мы передаем этот запрос в Axios и слушаем ответ или ошибку. Теперь вы должны увидеть уведомление, появившееся на вашем устройстве.

Если у вас не получилось, то есть несколько вещей, на которые стоит обратить внимание:

  • Убедитесь, что приоритет установлен на высокий
  • Убедитесь, что у вас есть сертификат push-уведомления, загруженный в консоль Firebase (В iOS 10 могут быть изменения на использование)

Как это работает

К примеру, мы отправляем push-уведомление на одно устройство или в тему(топик). При этом возможны 2 случая:

a. Приложение находится на переднем плане:

  • Данные уведомления принимаются в Callback — вызове JavaScript без сообщения в панели уведомлений (это обычное поведение push — уведомлений в мобильных ).

b. Приложение находится в фоновом режиме или закрыто:

  • Устройство отображает сообщение уведомления на панели уведомлений устройства.
  • Если пользователь удаляет уведомление, приложение выходит на передний план и данные уведомления принимаются в Callback —  вызове JavaScript.
  • Если пользователь не обращается к уведомлению, но открывает приложение, то ничего не происходит до тех пор, пока уведомление не будет обработано.

Реальный пример отправки из Axios

Код отправки уведомления

/**
 * to - кому и куда отправляется уведомление и может быть:
 * 1. токеном
 * 2. топиком
 * 3. или можем отправить всем сразу
 * title - заголовок уведомления
 * message - тело уведомления
 * apiKey - секретный ключ из облачного приложения Android Google FCM
 */
var to =  "cicx9RtKXdk:APA91bGsk16she-DPkwjSrM5_9ZfJ4v189k53ETUF081DXtIH6vl6MwsSy8ky6Orn5MUzZJqzUoCNHOZ3BxWquTvIJis2X5zzFtJQSY6ozQFUsMb6157lKS27HTDN4vuMcF4_CuTpEJH";          
//var to = "/topics/topicExample";
//var to = "/topics/all";

var title = "Новое сообщение";
var message = "Мое сообщение!";
var apiKey = "AIzaSyDqYOMoJ1jVoIfLTErYboDOtuqfCHcnWfE";

axios({
method: 'POST', //Метод отправки
url: 'https://fcm.googleapis.com/fcm/send', 
data:{
    "notification":{
      "title":title,  //Любое значение
      "body": message,  //Любое значение
      "sound": "default", //Если вы хотите звучание в уведомление
      "click_action": "FCM_PLUGIN_ACTIVITY",  //Должен присутствовать для Android
      "icon": "fcm_push_icon"  //Белая иконка ресурса Android
    },
    "data":{
      "param1":"value1",  //Любые данные, получаемые в callback - уведомлении
      "param2": "Prueba"
    },
    "to":to,
    "priority":"high" //Если не установлен, то уведомления не могут быть доставлены для закрытых приложений iOS
    //"restricted_package_name":"" //Необязательно. Можно закомментить
},
headers: {
    'Content-Type': 'application/json', 'Authorization': 'key=' + apiKey
}
}).then((response) => {
console.log(response)
})
.catch((error) => {
console.log(error)
});

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

setTimeout(function(){
    if(data.wasTapped){
      //Уведомление было получено в трей устройства и постучал пользователю.
      alert( JSON.stringify(data) );
    }else{
      //Уведомление было получено на переднем плане. Возможно, пользователя нужно уведомить.
      alert( JSON.stringify(data) );
    }
},2000);

или можно закинуть в обработчик Cordova ‘deviceready’

var app = {
    initialize: function() {
        this.bindEvents();
        this.setupApp();
    },
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    onDeviceReady: function() {
        FCMPlugin.onNotification(function(data) {
            console.log(data);
        });
    },
    setupApp: function() {
        //Программная логика на какой-то библиотеке
    }
}

app.initialize();