Java, UX, HTML, CSS, WEB-design

Применение мобильного сервера как услуги на практике (часть 2)

[ad_1]

  • Дэвид Такер

  • 0 Комментарии

Применение мобильного сервера как услуги на практике (часть 2)

  • 12 минут чтения

  • Мобильные устройства, Методы, Приложения, Веб-разработка

Краткое резюме ↬

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

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

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

Скриншоты приложения WaterCooler
Демонстрация приложения для обмена сообщениями WaterCooler. (Посмотреть большую версию)

Настройка

И первая статья в этой серии, и моя начальная статья, объясняющая концепцию MBaaS, являются предпосылками для этой статьи. Кроме того, в этой статье используется подход «настоящего приложения» к пониманию MBaaS. При этом некоторые знания iOS и Swift будут полезны. Однако я предоставил исходный код приложения, чтобы вы могли учиться и анализировать в своем собственном темпе.

Еще после прыжка! Продолжить чтение ниже ↓

Разрешения

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

Дальнейшее чтение на SmashingMag

  • Почему вы должны рассмотреть React Native для своего мобильного приложения
  • Рендеринг на стороне сервера с помощью React, Node и Express
  • Примечания о клиентской доступности

Права доступа к файлам

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

// Extracted from SignupViewController.swift (https://tuck.cc/1vsaWcr)

// Initialize with the default initializer
let metadata = KCSMetadata();

// Ensure that all users can access this file
metadata.setGloballyReadable(true);

// This is added to a params object that is passed to the upload data method
var fileParams = [
  KCSFileMimeType : "image/jpeg",
  KCSFileACL : metadata
];

// By passing in this fileParams object, the file will be readable by all
KCSFileStore.uploadData(photoData, options: fileParams, completionBlock: { (file:KCSFile!, error:NSError!) -> Void in
    println("File Upload Completed")
}, progressBlock: nil);

Разрешения хранилища данных

Чтобы максимально упростить интеграцию в приложение, я определил несколько расширений Swift для классов, представленных в Kinvey SDK для iOS. Одним из таких расширений является удобный инициализатор для KCSMetadata класс для настройки разрешений для Message и MessageThread классы:

/*
  This method is a convenience initializer that sets the permissions
  on a KCSMetadata instance for the user IDs passed in (and, optionally,
  for the current user as well). All persistable data in the Kinvey data
  store can be configured using a KCSMetadata instance.
 */
extension KCSMetadata {

  convenience init(userIds:[String], includeActiveUser:Bool) {
    self.init()
    var ids = userIds
    setGloballyReadable(false)
    setGloballyWritable(false)
    if(includeActiveUser) {
      ids.append(KCSUser.activeUser().userId)
    }
    for userId in ids {
      readers.addObject(userId)
      writers.addObject(userId)
    }
  }
}

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


class Message : NSObject, KCSPersistable {

  var entityId:String = ""
  var messageText:String!
  var senderId:String!
  var threadId:String!
  var userEntryTime:NSDate!
  var metadata:KCSMetadata! = nil

  init(messageText:String, recipientId:String) {
    senderId = KCSUser.activeUser().userId
    messageText = messageText
    entityId = NSUUID().UUIDString
    // This uses our convenience initializer to allow for the limited
    // permissions of only the sender and recipient
    metadata = KCSMetadata(userIds: [recipientId], includeActiveUser:true)
  }

  // You have to let Kinvey know which property corresponds to the meta-data
  // instance. Do this by assigning the property the KCSEntityKeyMetadata
  // value in the hostToKinveyPropertyMapping method.
  override func hostToKinveyPropertyMapping() -> [NSObject : AnyObject]! {
    return [
      "entityId" : KCSEntityKeyId,
      "messageText" : "message",
      "senderId" : "senderId",
      "threadId" : "threadId",
      "metadata" : KCSEntityKeyMetadata
    ]
  }
}

Бизнес-логика и push-уведомления

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

  1. Когда Message экземпляр сохраняется в хранилище данных, нам нужно определить, кому он отправляется. После того, как мы установили получателя сообщения, нам нужно отправить ему push-уведомление.
  2. Когда Message экземпляр сохраняется в хранилище данных, нам также нужно получить MessageThread экземпляр и сохраните latestMessage имущество. Это избавляет нас от необходимости делать дополнительный вызов выборки при заполнении представления потока сообщений.

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

Настройка push-уведомлений

Чтобы push-уведомления правильно работали на iOS, нам нужно настроить Kinvey для работы с нашими сертификатами push-уведомлений для приложения. Этот шаг включает в себя два отдельных шага:

  1. Настройте приложение с помощью сертификатов push-уведомлений для разработки и производства в Центре разработчиков iOS.
  2. Экспортируйте и загрузите требуемый сертификат в Kinvey.

Полный процесс выполнения этих шагов выходит за рамки этой статьи, но у Kinvey есть руководство «Push» в документации, которое поможет вам в общем процессе интеграции.

Крючки Kinvey Collection

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

  • onPreSave Эта логика выполняется перед сохранением экземпляра в хранилище данных. Любые ошибки, возникающие в этой логике, будут препятствовать save действие от выполнения.
  • onPreFetch Эта логика выполняется перед любым вызовом выборки на entity тип. Любые ошибки могут помешать fetch действие от выполнения.
  • onPreDelete Эта логика выполняется до любого entity экземпляр удаляется из хранилища данных. Любые ошибки предотвратят удаление экземпляра из хранилища данных.
  • onPostSave Эта логика будет выполняться после сохранения экземпляра в хранилище данных. Любые ошибки здесь не помешают сохранить объект в хранилище данных, но вызовут возврат ошибки по запросу.
  • onPostFetch Эта логика будет выполняться после fetch команда была выполнена хранилищем данных. Любые ошибки здесь не помешают извлечению объекта из хранилища данных, но вызовут возврат ошибки по запросу.
  • onPostDelete Логика будет выполняться после удаления экземпляра из хранилища данных. Любые ошибки здесь не предотвратят удаление объекта, но вызовут возврат ошибки для запроса.

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

Модули бизнес-логики

Kinvey предоставляет набор модулей, которые позволяют вам получить доступ к основным функциям Kinvey в коде вашей бизнес-логики. Доступно несколько модулей, но я использовал следующие модули с хуком бизнес-логики:

  • logger Обеспечивает удобный способ записи информации из вашей бизнес-логики в консоль Kinvey.
  • collectionAccess Предоставляет способ запроса хранилища данных Kinvey из вашей бизнес-логики.
  • push Предоставляет доступ к функциям push-уведомлений для Kinvey с вашей бизнес-логикой.
  • async Предоставляет подход для работы с асинхронным JavaScript. Это асинхронный модуль, который вы могли использовать в приложениях Node.js.

  • Полный справочник по модулям бизнес-логики см. в руководстве «Модули» в разделе «Бизнес-логика» документации Kinvey.

Эти хуки настраиваются через Kinvey Console. Чтобы добавить onPostSave ловушку для коллекции Messages, выполните следующие действия:

  1. Выберите опцию «Бизнес-логика» в навигации в левой части консоли Kinvey.
  2. Выберите опцию «Создать свой первый сценарий».
  3. Во всплывающем меню выберите опцию «Добавить хук» для коллекции сообщений.
  4. Выберите onPostSave вариант.
  5. Вы увидите новые onPostSave Хук JavaScript в браузере, который вы можете редактировать.
Скриншот консоли Kinvey
Раздел бизнес-логики консоли Кинви. (Посмотреть большую версию)

Полный код для бизнес-логики

Объединение этих частей вместе дает один метод JavaScript, который состоит всего из 115 строк (с комментариями). Этот код получает получателя, обновляет поток последним сообщением, а затем отправляет push-уведомление получателю.

Чтобы включить этот хук, скопируйте этот JavaScript в только что созданный хук:

// Extracted from Messages-PostSave.js (https://tuck.cc/1MPrCAc)

function onPostSave(request, response, modules) {

  // Get references to Kinvey's business logic modules
  var push = modules.push;
  var collectionAccess = modules.collectionAccess;
  var logger = modules.logger;
  var async = modules.async;

  // Pull information from the request (the postSave messages request)
  var senderUsername = request.username;
  var messageId = request.entityId;
  var message = request.body;

  // Set up our state variables
  var recipient = {};

  // This method fetches the recipient of the message based on the thread
  // ID. This is needed to send the push notification to the correct user.
  var getRecipient = function(callback) {
    var recipientId = recipientIdToFetch();
    collectionAccess.collection('user').findOne({ "_id": recipientId }, function(error, user) {
      if(error) {
        logger.info("ERROR Fetching Recipient KCSUser");
        callback(error);
      } else {
        recipient = user;
        callback(null, recipient);
      }
    });
  };

  // This method sets the lastMessage on the MessageThread
  var updateLatestMessage = function(callback) {
    var threadId = message.threadId;

    // This is how Kinvey stores relationships to other entities.
    // We simply need to insert this object for the thread at the
    // specified ID and we will have updated the reference.
    var lastMessageRef = {
      _type: "KinveyRef",
      _id: threadId,
      _collection: "Messages"
    };

    // This method finds and updates the thread with the updated
    // reference to the message. It returns the updated thread from
    // the data store.
    collectionAccess.collection('MessageThreads').findAndModify({ "_id": threadId }, { "_id": 1 }, { $set: { "lastMessage" : lastMessageRef } }, { new: true }, function(error, thread) {
      if(error) {
        logger.error("Could Not Fetch Thread from ID: " + threadId);
      } else {
        callback(null, thread);
      }
    });
  };

  // This checks the threadId and, based on the ID of the user who saved the
  // message, determines the ID of the recipient of the message.
  var recipientIdToFetch = function() {
    var threadId = message.threadId;
    var ids = threadId.split(":");
    var recipientId = (ids[0] == message.senderId) ? ids[1] : ids[0];
    return collectionAccess.objectID(recipientId);
  };

  // This method creates both the APS and extras objects to be used in the push
  // notification.
  var pushDataFromMessageAndUser = function(user) {
    return {
      aps: {
        alert: notificationAlertMessage(user),
        badge: 0,
        sound: "notification.wav"
      },
      extras: {
        messageText: message.message,
        creationDate: message._kmd.ect,
        threadId: message.threadId,
        senderId: message.senderId,
        entityId: messageId
      }
    };
  };

  // This method calculates the text of the push notification based on the
  // sender and the text of the message.
  var notificationAlertMessage = function(user) {
    var alertMessageComponents = [];
    var alertMessage = user.first_name + " ";
    alertMessage += user.last_name + ": ";
    alertMessage += message.message;
    return alertMessage;
  };

  // This method is executed after the recipient has been fetched from the
  // user collection.  It proceeds with making the push notification call to
  // the recipient with the correct information.
  var callback = function(error, results) {
    if(error) {
      response.body = {
        error: error.message
      };
      response.complete(400);
    } else {
      var pushData = pushDataFromMessageAndUser(results[1]);
      push.sendPayload(recipient, pushData.aps, pushData.extras);
      response.complete(200);
    }
  };

  // This kicks off the process to fetch the recipient and update the thread.
  // Once that is complete, it calls the callback function to send the
  // push notification.
  async.parallel([updateLatestMessage, getRecipient], callback);
}

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

Скриншот push-уведомления в приложении WaterCooler
Push-уведомление в приложении WaterCooler. (Посмотреть большую версию)

Собираем кусочки вместе

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

Скриншоты приложения WaterCooler
Демонстрация приложения для обмена сообщениями WaterCooler. (Посмотреть большую версию)

Если вы хотите продолжить обучение, вы можете добавить в это приложение множество функций:

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

Все эти функции были бы возможны с серверной частью Kinvey.

Дополнительные ресурсы

Вот несколько ресурсов, которые использовались при создании нашего приложения:

  • SlackTextViewController, Slack, GitHub Команда Slack выпустила потрясающий элемент управления для ввода текста в приложении для обмена сообщениями.
  • MBProgressHUD, Джонатан Джордж, GitHub Это общий элемент управления для отображения наложений, когда приложение ожидает завершения задачи. Это очень настраиваемый и настраиваемый.
  • Поиск по лицензии Creative Commons иконки на Freepik, SimpleIcon, Google и Flaticon.
  • Brandon McQuilkin, GitHub McQuilkin раньше предоставлял отличные Быстрые расширения изображений для маскировки изображений. С момента моей первоначальной работы над приложением он удалил их с GitHub.

Вывод

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

Следующие дополнительные ресурсы из документации Kinvey помогут вам создавать приложения для iOS:

  • «Начиная,»
  • «Примеры приложений Kinvey»
  • «Хронология: посмотрите, как развивается наша платформа iOS»
Сокрушительная редакция
(да, ал, мл)



[ad_2]
Source: https://smashingmagazine.com

Заключение

Вы ознакомились с статьей — Применение мобильного сервера как услуги на практике (часть 2)

Пожалуйста оцените статью, и напишите комментарий.

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован.

Краткое описание по статье Применение мобильного сервера как услуги на практике (часть 2)

Название: Применение мобильного сервера как услуги на практике (часть 2) . Краткое описание: [ad_1] ⭐ Дэвид Т . Дата публикации: 08.02.2022 . Автор: Алишер Валеев .

Для чего создан сайт Novosti-Nedeli.ru

Данный сайт посвящен новостям мира и мира технологий . Также тут вы найдете руководства по различным девайсам.

Сколько лет сайту?

Возраст составляет 3 года

Кнопка «Наверх»