Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 1122 сообщений
Cообщения с меткой

мобильные приложения - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

Удобный REST для Xamarin-приложений

Четверг, 22 Сентября 2016 г. 15:30 (ссылка)

Разработчикам на Xamarin доступен богатый выбор компонентов для работы с сетью, и в сегодняшней нашей статье мы рассмотрим набор модулей, которые также могут быть использованы в PCL-проектах на Xamarin.Forms.



Все статьи из колонки можно найти и прочитать по ссылке #xamarincolumn, или в конце материала под катом.







Refit для удобного описания клиента REST API



Самым популярным в настоящее время протоколом для общения мобильных приложений с сервером является REST в связке с Json. Поэтому наше сегодняшнее знакомство начнем с библиотеки Refit.



Refit позволяет описать спецификации для работы с REST-сервисом в виде простого Interface с понятным набором входных и выходных параметров, включая возможность манипулировать HTTP-заголовками для отдельных запросов. Для примера возьмем демо-API сервиса httpbin.org:



    [Headers("Accept: application/json")]
public interface IHttpbinApi
{
[Get("/basic-auth/{username}/{password}")]
Task BasicAuth(string username, string password, [Header("Authorization")] string authToken, CancellationToken ctx);

[Get("/cache")]
Task CheckIfModified([Header("If-Modified-Since")] string lastUpdateAtString, CancellationToken ctx);

[Post("/post")]
Task FormPost([Body(BodySerializationMethod.UrlEncoded)] FormData data, CancellationToken ctx);
}


После описания данного интерфейса, он подается на вход для Refit:



            var client = new HttpClient(new NativeMessageHandler())
{
BaseAddress = new Uri("http://httpbin.org")
};
_httpbinApiService = RestService.For(client);


Сами данные можно при необходимости (конвертации camel case или snake eyes, преобразование из множества в строковые значения) можно расширить аттрибутами из библиотеки Json.net, так как именно она используется в Refit:



      public class AuthResult
{
[JsonProperty("authenticated")]
public bool IsAuthenticated { get; set; }

[JsonProperty("user")]
public string Login { get; set; }
}


В Refit в качестве выходного значения можно получить уже преобразованные объекты DTO или HttpResponseMessage. Последний позволяет получить информацию о запросе и ответе, что может быть полезно при отладке. При желании также может использоваться ModernHttpClient при создании HttpClient. В целом, Refit — достаточно удобный и универсальный инструмент для Xamarin-разработчиков в том числе.



Примечание 1: для установки Refit 3.0 в PCL-проект Xamarin.Forms потребуется перевести проект на .NET Standard.



Примечание 2: в документации Refit нет упоминания на использование CancelationToken для отмены активных операций, но данный механизм работает и описан в тикете.



Polly



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



Интересный подход по использованию Refit и Polly описал Rob Gibbens в своем блоге (дополнительно там показан пример приоретизацией сетевых запросов с помощью Fusillade).



Вот так мы совершаем запрос:



protected async Task MakeRequest(Func> loadingFunction, CancellationToken cancellationToken)
{
Exception exception = null;
var result = default(T);

try
{
result = await Policy.Handle().Or()
.WaitAndRetryAsync(3, i => TimeSpan.FromMilliseconds(300), (ex, span) => exception = ex)
.ExecuteAsync(loadingFunction, cancellationToken);
}
catch (Exception e)
{
// Сюда приходят ошибки вроде отсутствия интернет-соединения или неправильной работы DNS
exception = e;
}
//TODO: Обработать исключения или передать их дальше
return result;
}


Вместо loadingFunction необходимо передать ваш код обращения к Refit:



   var authToken = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}"));
return await MakeRequest(ct => _httpbinApiService.BasicAuth(username, password, authToken, ct), cancellationToken);


Итак, мы интегрировали Refit, Polly и ModernHttpClient.



Кэш



И в завершении статьи можно рассмотреть использование кэша при работе с сетью. Xamarin-разработчику доступны все возможности целевых платформ, поэтому для реализации кэша можно использовать различные СУБД. Одним из самых популярных кэшеров выступает Akavache, работающий поверх SQLite.



    var cache = BlobCache.LocalMachine;
var cachedObjects = cache.GetAndFetchLatest("objects", GetRemoteObjectAsync,
offset =>
{
TimeSpan elapsed = DateTimeOffset.Now - offset;
return elapsed > new TimeSpan(hours: 0, minutes: 30, seconds: 0);
});


Также можно использовать для реализации кэша очень удобную мобильную СУБД Realm. Ниже представлен пример кэшера на базе Realm:



 public static class LocalCache
{
private class CachedObject : RealmObject
{
[PrimaryKey]
public string Key { get; set; }
public string Value { get; set; }
public DateTimeOffset UpdatedAt { get; set; }
}


private static readonly RealmConfiguration Configuration = new RealmConfiguration("cache.realm", true);
private static Realm Db => Realm.GetInstance(Configuration);


public static async Task WriteToCache(string key, T data, DateTimeOffset timeStamp)
{
if (String.IsNullOrEmpty(key) || data == null || timeStamp == DateTimeOffset.MinValue) return;

var currentValue = Db.All().Where(o => o.Key == key).ToList().FirstOrDefault();
if (currentValue == null)
await Db.WriteAsync(db =>
{
var newValue = db.CreateObject();
newValue.Key = key;
newValue.UpdatedAt = timeStamp;
newValue.Value = JsonConvert.SerializeObject(data);
});
else
using (var transaction = Db.BeginWrite())
{
currentValue.Value = JsonConvert.SerializeObject(data);
currentValue.UpdatedAt = timeStamp;
transaction.Commit();
}
}

public static DateTimeOffset CacheLastUpdated(string key)
{
if (String.IsNullOrEmpty(key)) return DateTimeOffset.MinValue;

var currentValue = Db.All().Where(o => o.Key == key).ToList().FirstOrDefault();
return currentValue?.UpdatedAt ?? DateTimeOffset.MinValue;
}

public static void RemoveCache(string key)
{
if (String.IsNullOrEmpty(key)) return;

var currentValue = Db.All().Where(o => o.Key == key).ToList().FirstOrDefault();
if (currentValue == null) return;


using (var transaction = Db.BeginWrite())
{
Db.Remove(currentValue);
transaction.Commit();
}
}

public static T GetFromCache(string key)
{
if (String.IsNullOrEmpty(key)) return default(T);

var currentValue = Db.All().Where(o => o.Key == key).ToList().FirstOrDefault();
return currentValue?.Value == null ? default(T) : JsonConvert.DeserializeObject(currentValue.Value);
}

public static void ClearCache()
{
Realm.DeleteRealm(Configuration);
}
}




Заключение



Итак, сегодня мы рассмотрели использование Refit, Json.net, ModernHttpClient, Polly и Realm при интеграции с REST API. В следующей статье мы рассмотрим вопросы интеграции Xamarin с внешними сервисами и Azure.



Об авторах





Вячеслав Черников — руководитель отдела разработки компании Binwell. В прошлом — один из Nokia Champion и Qt Certified Specialist, в настоящее время — специалист по платформам Xamarin и Azure. В сферу mobile пришел в 2005 году, с 2008 года занимается разработкой мобильных приложений: начинал с Symbian, Maemo, Meego, Windows Mobile, потом перешел на iOS, Android и Windows Phone.



Предыдущие части



1. Быстрое создание MVP (minimum viable product) на базе Microsoft Azure и Xamarin.Forms.

2. Готовим Xamarin.Forms: настройка окружения и первые шаги.

3. Повышаем эффективность работы в Xamarin.Forms.

4. Работаем с состояниями экранов в Xamarin.Forms.



Полезные ссылки




Original source: habrahabr.ru.

https://habrahabr.ru/post/310704/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Дайджест интересных материалов для мобильного разработчика #171 (12-18 сентября)

Воскресенье, 18 Сентября 2016 г. 16:13 (ссылка)

На этой неделе началось распространение iOS 10 и много материалов связано с iMessage и функциями новой ОС. А кроме того в новом дайджесте лучшие окна с призывами оценить или оплатить приложение, обнаружение лиц на фотографиях, путь UX в этом году, отказ Marmalade от своего движка и много других интересных материалов.












Как я потратил отпуск на свое первое приложение

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




Какое окно оценки игры интегрировать в свою мобилку

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




Пишем, собираем и запускаем HelloWorld для Android в блокноте. Java 8 и Android N

Используя только блокнот, мы напишем совсем маленькое учебное Android-приложение. А затем скомпилируем его, соберём и запустим на устройстве — и всё через командную строку. Заинтересовало? Тогда прошу.



Теперь дайджест доступен и в виде рассылки. Подписаться вы можете тут.



iOS



Android



Windows



Разработка



Аналитика, маркетинг и монетизация



Устройства и IoT





<- Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
Original source: habrahabr.ru.

https://habrahabr.ru/post/310294/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Комментарии (0)КомментироватьВ цитатник или сообщество
vendamostswag

iTherm - интеллектуальный термометр

Вторник, 13 Сентября 2016 г. 07:40 (ссылка)

bigimg (197x700, 84Kb)
Если температура выше 43 С, то на дисплее термометра отображается «Hi».
Если температура выше 43 С, то на дисплее термометра отображается «Hi».

Комментарии (0)КомментироватьВ цитатник или сообщество
nonpvicigria

iTherm - интеллектуальный термометр

Понедельник, 13 Сентября 2016 г. 01:57 (ссылка)

bigimg (197x700, 84Kb)
Бывают ситуации, когда воспользоваться градусником нет возможности.
Бывают ситуации, когда воспользоваться градусником нет возможности.

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Дайджест интересных материалов для мобильного разработчика #170 (5-11 сентября)

Воскресенье, 11 Сентября 2016 г. 16:50 (ссылка)

iPhone 7 лишился выхода для наушников, зато приобрел вторую камеру и новый процессор, представление Apple Watch Series 2 и AirPods, игры как бизнес, дизайнеры и разработчики – лишь малая часть нового большого дайджеста. Добро пожаловать!












Вычисление 1000000 знаков числа Пи. На iPhone

История его вычисления занимает более 2х тысячелетий, а точность вычисления колеблется от 256/81 в древнем Египте и 339/108 в Ведах, до Джамшида ал-Каши, вычислившего 16 знаков в 15м веке. Чего стоит хотя бы история Вильяма Шенкса, который потратил 20 лет на вычисление 700 знаков числа Пи, но уже потом выяснилось, что во второй части расчетов он ошибся… Но текст в общем-то не об этом, а об алгоритмах. Стало интересно, можно ли вычислить Пи на iPhone? И если да, то с какой точностью?




Что интересного я вынес за два года разработки и продвижения мобильной игры

С прошлой публикации — «Чему я научился на своих ошибках или как сделать вторую игру лучше» прошло уже целых 2 года! Сегодня я расскажу о том, что нового я попробовал в продвижении, монетизации приложения и конечно же о том, что из этого вышло.




DisQwerty: чтобы печатать не нужно больше одной кнопки

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



Теперь дайджест доступен и в виде рассылки. Подписаться вы можете тут.



iOS



Android



Windows



Разработка



Аналитика, маркетинг и монетизация



Устройства и IoT





<- Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
Original source: habrahabr.ru.

https://habrahabr.ru/post/309700/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Из песочницы] Android: выдвигающийся экран снизу

Понедельник, 05 Сентября 2016 г. 11:49 (ссылка)

Данная статья является переводом статьи Emrullah Luleci, а также её продолжения.


Нижний экран (Здесь и далее под «нижним экраном/слоем» будет подразумеваться элемент bottom sheet — прим. пер.) — компонент, выезжающий снизу экрана, который используется для отображения дополнительного контента. Подробнее об этом элементе можно узнать на официальной сайте посвященном материальному дизайну.



image




Зависимости



Для использования этого элемента, добавьте последние версии библиотек поддержки в свой проект:



dependencies {
//замените X.X.X номером последней версии
compile 'com.android.support:appcompat-v7:X.X.X'
compile 'com.android.support:design:X.X.X'
}


Создайте класс наследник от AppCompatActivity:



public class ButtonActivity extends AppCompatActivity {
...
}


Создание макетов



Содержимое нижнего экрана


Для удобства воспользуемся макетами. Назовем файл с нижним слоем bottom_sheet.xml.



bottom_sheet.xml












behavior_peekHeight: Определяет высоту видимой части.



behavior_hideable: Определяет, может ли нижний экран скрываться свайпом вниз.



Container view



Создайте CoordinatorLayout в качестве корневого вью. Добавьте в него прямым наследником bottom_sheet.xml. Элементы app_bar и activity_bottom_sheet_content не имеют прямого отношения к нижнему экрану, поэтому их можно заменить или удалить.



Макет

















На данном этапе нижний экран должен работать примерно так:



image


Динамическое управление



Поведением и свойствами нижнего экрана можно также управлять динамически с помощью Java.



Спойлер

// получение вью нижнего экрана
LinearLayout llBottomSheet = (LinearLayout) findViewById(R.id.bottom_sheet);

// настройка поведения нижнего экрана
BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(llBottomSheet);

// настройка состояний нижнего экрана
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);

// настройка максимальной высоты
bottomSheetBehavior.setPeekHeight(340);

// настройка возможности скрыть элемент при свайпе вниз
bottomSheetBehavior.setHideable(false);

// настройка колбэков при изменениях
bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {

}

@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {

}
});




Прикрепление элементов к нижнему экрану



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



image


Добавим Floating Action Button в макет созданный выше. Новый компонент должен являться непосредственным наследником CoordinatorLayout также как и bottom_sheet. Для прикрепления элемента к нижнему экрану необходимо добавить app:layout_anchor с id вью нижнего экрана, а также app:layout_anchorGravity со значением top|end.



Макет



















Теперь плавающая кнопка закреплена в верхнем углу нашего нижнего экрана и перемещается вместе с ним.



Скрытие плавающей кнопки при скроле



Для скрытия кнопки при скроле необходимо добавить слушатель к нижнему экрану и отображать/скрывать кнопку. Для начала найдем необходимые вью:



Спойлер

fab = findViewById(R.id.fab);
View llBottomSheet = findViewById(R.id.bottom_sheet);

// настройка поведения нижнего экрана
BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(llBottomSheet);

Если хотите, чтоб кнопка масштабировалась во время скрола, используйте это:

// настройка колбэков при изменениях
bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
}

@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
fab.animate().scaleX(1 - slideOffset).scaleY(1 - slideOffset).setDuration(0).start();
}
});




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



Спойлер

// настройка колбэков при изменениях
bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {

// этот код скрывает кнопку сразу же
// и отображает после того как нижний экран полностью свернется
if (BottomSheetBehavior.STATE_DRAGGING == newState) {
fab.animate().scaleX(0).scaleY(0).setDuration(300).start();
} else if (BottomSheetBehavior.STATE_COLLAPSED == newState) {
fab.animate().scaleX(1).scaleY(1).setDuration(300).start();
}
}

@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
}
});


Результат обоих вариантов можно увидеть ниже:



image


Вот и всё!
Original source: habrahabr.ru.

https://habrahabr.ru/post/309200/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Дайджест интересных материалов для мобильного разработчика #169 (29 августа-4 сентября)

Воскресенье, 04 Сентября 2016 г. 16:06 (ссылка)

Мы в ожидании мероприятия Apple в среду обсуждаем красоту Unity, лучшие проекты на Swift, заработок на Pokemon Go (или, вернее, попытку заработка), использование расширений в браузере Яндекса и большую кнопку «Счастье».












DisType: простое приложение для общения

Сентябрь 2015 года. Волонтер, который собирался везти меня на концерт “15 лет фильму Брат 2: живой саундтрек”, попросил меня что-то придумать, чтобы она могла и рулить, и со мной говорить. Да, да, со словами #ТЫЖПРОГРАММИСТ. Я сделал простое приложение на Cordova с input’ом на весь экран.




Unity с позиции художника при разработке кроссплатформенной игры

«Работать в Unity так приятно и удобно: много возможностей для самореализации» — говорили мне, но всё оказалось не так просто. В данной статье не будет петься хвалебных од Unity. Эта статья о суровых реалиях, ограничениях и сложностях, с которыми столкнулась наша маленькая команда инди-разработчиков при создании своей первой, но достаточно крупной игры Death Point.



Теперь дайджест доступен и в виде рассылки. Подписаться вы можете тут.



iOS



Android



Windows



Разработка



Аналитика, маркетинг и монетизация



Устройства и IoT





<- Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
Original source: habrahabr.ru.

https://habrahabr.ru/post/309164/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<мобильные приложения - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda