Archiwum kategorii: How-To

Monitorowanie aplikacji hybrydowych. Cordova i HockeyApp

Monitorowanie aplikacji hybrydowych jest bardzo ważnym etapem w produkcji każdego rozwiązania IT. Dlatego jego wybór może być kluczowym punktem każdego projektu.

Z własnego doświadczenia powiem im szybciej się zdecydujemy na dane rozwiązanie tym lepiej.

W trakcie produkcji aplikacji na którymś jej etapie stajemy przed wyborem metody monitorowania na urządzeniach. Dzisiaj chciałbym się skupić na  Apache Cordova i rozwiązaniu do monitorowania HockeyApp.

Nie będę się tutaj rozpisywał na temat samej Apache Cordova ponieważ zostało już wiele powiedziane i napisane. Skupmy się na HockeyApp co nam daje ta technologia i dlaczego ją wybrałem.

HockeyApp

Dlaczego akurat HockeyApp, a nie jakieś inne rozwiązanie do monitorowania aplikacji mobilnych lub pisanych w JavaScript.

Przyczyna była prosta jest to obecnie produkt Microsoft, mamy plugin dla Cordova, oraz API jest bardzo proste w użyciu. No może też kryterium była znajomość tego narzędzia :).

Instalacja

W celu dodania do naszej aplikacji HockeyApp SDK musimy zainstalować odpowiedni plugin. Robimy to komendą

cordova plugin add cordova-plugin-hockeyapp@latest

Kolejnym krokiem jest konfiguracja naszej aplikacji w panelu administratora i generacja App ID które jest wymagane przez SDK do komunikacji. W tym celu klikamy New App w panelu i podążamy według kroków.

automatyczne definiowanie aplikacji

Możemy cały proces wykonać również ręcznie. W tym celu klikamy „Create the app manually instead”.

ręczne definiowanie aplikacji

Po poprawnym skonfigurowaniu aplikacji mamy wygenerowany app id dla naszej aplikacji.

wygenerowania aplikacja

Możliwości

Jako, że skupiam się w tym artykule na monitorowaniu aplikacji przedstawię najważniejsze możliwe opcje. HockeyApp dla Cordova daje nam dostęp do:

  • Pobrania feedback od użytkownika
  • Pobrania feedback z dodatkowymi meta danymi od użytkownika
  • Monitorowania zdarzeń w aplikacji
  • Rozszerzone raporty z błędami

Jak tego wszystkiego użyć…?

API jest dostępne na event ondeviceready w globalnym obiekcie hockeyapp jest ono wystawiane przez szereg dostępnych metod. Które jest niezwykle proste w użyciu.

hockeyapp.addMetaData(null, null { someCustomProp: 23, anotherProp: "Value" });
hockeyapp.trackEvent(null, null, "EVENT_NAME");
hockeyapp.feedback();
hockeyapp.composeFeedback(null, null, true, appData);

W ramach podsumowania

HockeyApp daje nam szybki i łatwy dostęp do rozwiązania dającego nam możliwość monitorowania aplikacji w produkcji. Znacie jakieś inne narzędzia do monitorowania hybrydowych aplikacji mobilnych? Dajcie znać w komentarzach.

 

 

Komunikacja w czasie rzeczywistym w Xamarin

Komunikacja w czasie rzeczywistym w Xamarin

W dzisiejszym wpisie chciałbym zaprezentować jak wysyłać powiadomienia push przy użyciu biblioteki ASP.NET SignalR.

Komunikacja w czasie rzeczywistym – Czym jest SignalR

ASP.NET SignalR is a new library for ASP.NET developers that makes developing real-time web functionality easy. SignalR allows bi-directional communication between server and client. Servers can now push content to connected clients instantly as it becomes available. SignalR supports Web Sockets, and falls back to other compatible techniques for older browsers. SignalR includes APIs for connection management (for instance, connect and disconnect events), grouping connections, and authorization

Według definicji ze strony www.asp.net/signalr jest to biblioteka umożliwiająca komunikację w czasie rzeczywistym, wykorzystująca Websockets lub Ajax long polling do swojego działania.

A teraz mięso

W tym demo użyjemy SignalR hostowanego w aplikacji konsolowej. W tym celu należy zainstalować dwa pakiety NuGet

Install-Package Microsoft.AspNet.SignalR.SelfHost
Install-Package Microsoft.Owin.Cors

Następnie tworzymy Hub mający na celu przekazywanie wiadomości pomiędzy podłączonymi klientami

    public class NotificationHub : Hub
    {
        public void SendNotification(Notification notification)
        {
            Clients.All.sendNotification(notification);
        }

        public override Task OnConnected()
        {
            Console.WriteLine($"Connection with ID {Context.ConnectionId} connected");
            return base.OnConnected();
        }

        public override Task OnDisconnected(bool stopCalled)
        {
            Console.WriteLine($"Connection with ID {Context.ConnectionId} disconnected");
            return base.OnDisconnected(stopCalled);
        }

        public override Task OnReconnected()
        {
            Console.WriteLine($"Connection with ID {Context.ConnectionId} reconnected");
            return base.OnReconnected();
        }
    }

Back office i Frontend

Naszym klientem symulującym działanie back office jest aplikacja konsolowa wysyłająca mock powiadomień dla klienta. Klient mobilny został zrealizowany za pomocą Xamarin Forms.

W naszych klientach instalujemy pakiet NuGet

Install-Package Microsoft.AspNet.SignalR.Client

Żeby klient mógł użyć serwera SignalR należy napisać mały kawałek kodu

var hubConnection = new HubConnection($"{Servers.NotificationHubServer}/signalr");
var hubProxy = hubConnection.CreateHubProxy(Hubs.NotificationHubName);

hubConnection.Start().Wait();

hubProxy.Invoke<Notification>(Actions.SendNotification, notification);

Cały kod źródłowy demo jest dostępny na GitHub.

Zapraszam do komentowania. Jakie macie doświadczenia z użycia SignalR w aplikacjach mobilnych jakieś alternatywy?

Code

CorFlags.exe (CorFlags Conversion Tool). Jak sprawdzić wersję biblioteki z przykładami

Witajcie dev czytelnicy. W dzisiejszym poście pomówimy o użyciu narzędzia CorFlags.exe (CorFlags Conversion Tool).

CorFlags.exe. Czym jest narzędzie CorFlags Conversion Tool

console

Jest to małe przydatne (i niebezpieczne) narzędzie przy pomocy, którego sprawdzimy wersję .Net biblioteki i nie tylko.

Użycie

Corflags.exe assembly [options]

Narzędzie jest dostarczane wraz z .Net Framework SDK i można je łatwo wywołać z konsoli Developer Command Prompt for VS2015.

C:\CorFlags.exe TestMe.exe
Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.6.1055.0
Copyright (c) Microsoft Corporation. All rights reserved.

Version : v4.0.30319
CLR Header: 2.5
PE : PE32
CorFlags : 0x20003
ILONLY : 1
32BITREQ : 0
32BITPREF : 1
Signed : 0

Co my tu mamy

CLR Header mówi nam tyle, że jest to .Net > 2.0. Z takich ciekawostek wszystkie biblioteki z .Net > 2.0 będą miały wersję 2.5, natomiast .Net 1.0 i 1.1 ma nagłówek 2.0. Jest z tym mały bałagan….

Jak sprawdzić czy biblioteka jest x86, a może x64

Mówi nam o tym flaga PE, oraz 32BITREQ.

Poniższy listing mówi, że mamy do czynienia z biblioteką 64 bitową

Version   : v4.0.30319
CLR Header: 2.5
PE : PE32+
CorFlags : 0x1
ILONLY   : 1
32BITREQ : 0
32BITPREF : 0
Signed   : 0

Natomiast biblioteka 32 bitowa ma nagłówek

Version   : v4.0.30319
CLR Header: 2.5
PE       : PE32
CorFlags : 0x3
ILONLY   : 1
32BITREQ : 1
32BITPREF : 0
Signed   : 0

Xamarin.iOS – Jak pokazać kontrolkę daty tak jak w kalendarzu iOS

Jest to tips & tricks działający dla Xamarin.iOS

W dzisiejszym odcinku chciałbym pokazać wam jak dodać kontrolkę daty „iOS style” (z takim fajnym rozwijaniem wierszy jak w np. w kalendarzu).

Xamarin.iOS – Jak pokazać kontrolkę daty tak jak w kalendarzu iOS

Ja w swoim przykładzie użyłem na Storyboard kontrolki TableViewController. Wywyższa kontrolka zapewnia nam funkcjonalność kontrolki TableView i ScrollView w jednym.

Następnie należy skonfigurować sekcji i wiersze, dodajemy kontrolkę DatePicker i wysokość wiersza ustawiamy na 216.

Reszta magii dzieje się w kodzie… Cały kod źródłowy można znaleźć na GitHub

Kod

using Foundation;
using System;
using UIKit;

namespace DatePickerDemo
{
    public partial class MainViewController : UITableViewController
    {
        private NSDateFormatter formatter;
        private bool showDatePicker;

        public MainViewController (IntPtr handle) : base (handle)
        {
            formatter = new NSDateFormatter();
            formatter.DateStyle = NSDateFormatterStyle.Short;
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();


            dateLabel.Text = formatter.ToString(datePicker.Date);
            datePicker.ValueChanged += DatePicker_ValueChanged;
        }

        public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
        {
            nfloat rowHeight = tableView.RowHeight;

            if(indexPath.Section == 1 && indexPath.Row == 2)
            {
                rowHeight = 0;
            }

            if (showDatePicker && (indexPath.Section == 1 && indexPath.Row ==2))
            {
                rowHeight = 216;
            }

            return rowHeight;
        }

        public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
        {
            tableView.BeginUpdates();

            if (indexPath.Section == 1 && indexPath.Row == 1)
            {
                showDatePicker = !showDatePicker;
            }

            tableView.DeselectRow(indexPath, true);
            tableView.EndUpdates();
        }

        private void DatePicker_ValueChanged(object sender, EventArgs e)
        {
            dateLabel.Text = formatter.ToString(datePicker.Date);
        }
    }
}