В релизной версии iOS 10 Apple представила новую многообещающую функцию под названием Message App Extensions. Этот новый тип расширения может пересылать тексты, стикеры, медиафайлы, а также интерактивные сообщения, и, кроме этого, интегрироваться с приложением Messages, предоставляя пользователям новые функциональные возможности.
С помощью Message App Extensions различные типы контента могут использоваться совместно. И наиболее интересными здесь являются возможности Interactive Messages, которые позволяют запустив приложение прямо из Messages и создав там пользовательский контент, отправить его напрямую в Messages с помощью нового API-интерфейса Messages Framework. В этой статье мы рассмотрим принципы работы iMessage App Extensions, создав интерактивную игру под названием Monkey Tap.
Сознание первого iMessage App Extension
iMessage App Extension создаётся довольно легко. Используя мастера создания нового проекта (New Project), с помощью File -> New Solution, создайте Single View iOS-приложения. Затем добавьте еще один новый проект к этому решению, выбрав его в Pad Solution. В соответствии с шаблонами iOS, выберите пункт Extension menu, а затем iMessage Extension. Основное различие между этим и другими типами расширений заключается в том, что это не «проект-контейнер», поскольку приложение Message, которое мы создаем, само выступает в качестве контейнера.
MSMessagesAppViewController
Message App Extensions позиционируется, как новый тип: MSMessagesAppViewController. Он работает достаточно привычным образом, но также привносит некоторые специфичные для сообщений понятия, которые нам необходимы. К примеру, класс MSConversation представляет собой цепочку сообщений, в которой мы находимся. Это удобно, поэтому что тогда мы знаем, куда отправлять сообщения. Теперь у нас появилась возможность создавать новый контроллер для обработки отображения баллов, заработанных в играх, благодаря которому мы можем отправлять эти данные пользователям в виде сообщений.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | public partial class ScoreViewController : MSMessagesAppViewController { ... public override void ViewDidLoad() { base.ViewDidLoad(); FinalScoreLabel.Text = string.Format("You scored {0}!", finalScore); // Set up the message layout MSMessageTemplateLayout layout = new MSMessageTemplateLayout() { Image = UIImage.FromBundle("Monkey"), Caption = "Try and beat my score!", TrailingCaption = "" + finalScore, Subcaption = "MonkeyTap" }; // Create a new message with the above layout MSMessage message = new MSMessage() { Layout = layout }; // Send the message when the button is tapped PostScore.TouchUpInside += (sender, e) => { conversation.InsertMessage(message, (Foundation.NSError error) => { if (error == null) { // Handle successful send } else { // Report Error Console.WriteLine("Error: {0}", error); } }); }; PlayAgain.TouchUpInside += (sender, e) => { DismissViewController(true, null); }; } } |
Помимо этого, кое-что интересное также происходит и во ViewDidLoad. Здесь создаётся MSMessage и используется для отправки счёта очков. Свойство Layout принимает значение MSMessageTemplateLayout. Эти свойства обрабатывают следующее:
1 2 3 4 5 6 7 | MSMessageTemplateLayout layout = new MSMessageTemplateLayout() { Image = UIImage.FromBundle("Monkey"), Caption = "Try and beat my score!", TrailingCaption = "" + finalScore, Subcaption = "MonkeyTap" }; |
Вот, как выглядит наше iMessage App Extension:
Мы будем использовать другой контроллер для обработки игровой логики. Он будет фиксировать любые нажатия пользователя на экран и засчитает их как заработанные очки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | public partial class GameViewController : MSMessagesAppViewController { public override void ViewDidLoad() { base.ViewDidLoad(); // As we are using a UIImageView, we need to detect taps with a UITapGestureRecognizer UITapGestureRecognizer tapGesture = new UITapGestureRecognizer((obj) => { // Game logic ... }); Monkey.AddGestureRecognizer(tapGesture); gameTimer.Elapsed += (sender, e) => { ... if (time.Equals(0)) { // Once we run out of time, stop the timer gameTimer.Stop(); gameInProgress = false; InvokeOnMainThread(() => { ScoreViewController scoreVC = Storyboard.InstantiateViewController("ScoreVC") as ScoreViewController; // Pass the score and ActiveConversation to the next ViewController scoreVC.finalScore = score; scoreVC.conversation = ActiveConversation; ShowViewController(scoreVC, this); // Reset the labels ScoreLabel.Text = "Tap monkey to begin!"; TimerLabel.Text = "Time: 0.0s"; }); } }; } } |
Готово! Мы создали небольшую игру, где пользователь может тапать по экрану, воздействуя тем самым на view, и получать за это игровые баллы, пока идёт обратный отсчет. Нам нужно, чтобы по его завершении пользователю отправилось написанное нами сообщение. И именно здесь-то нам и пригодится MSConversation.
В этой статье мы прошлись только по самому главному
Сегодня мы коснулись лишь немногих тем, связанных с открывающимися возможностями для использования новых расширений. Если вы хотите узнать об этом вопросе больше, обратитесь к нашей документации. Ознакомившись с материалами Sticker Packs и group conversations, Вы найдете там более подробную информацию обо всех прочих доступных API-интерфейсах, а также о многом другом. Вы можете просмотреть весь исходный код проекта Monkey Tap, пройдя по этой ссылке.
Автор: John Miller
Источник: Официальный блог Xamarin
Написать ответ