Azure Mobile Apps için yönetilen istemci kullanma

Genel Bakış

Bu kılavuzda, Windows ve Xamarin uygulamaları için Azure App Service Mobile Apps yönetilen istemci kitaplığını kullanarak genel senaryoları nasıl gerçekleştireceğiniz gösterilmektedir. Mobile Apps yeni olduğunuzda, önce Azure Mobile Apps hızlı başlangıç öğreticisini tamamlamayı düşünmelisiniz. Bu kılavuzda, istemci tarafı yönetilen SDK 'ya odaklanıyoruz. Mobile Apps yönelik sunucu tarafı SDK 'Ları hakkında daha fazla bilgi için, .NET Server SDK veya Node.js Server SDKbelgelerine bakın.

Başvuru belgeleri

İstemci SDK 'Sı için başvuru belgeleri şurada bulunur: Azure Mobile Apps .NET istemci başvurusu. Azure-Samples GitHub deposundabirçok istemci örneği de bulabilirsiniz.

Desteklenen Platformlar

.NET platformu aşağıdaki platformları destekler:

  • API 19 ile 24 arasında Xamarin Android sürümleri (KitKat ile Nougat)
  • İOS sürümleri 8,0 ve üzeri için Xamarin iOS sürümleri
  • Evrensel Windows Platformu
  • Windows Phone 8.1
  • Silverlight uygulamaları hariç Windows Phone 8,0

"Sunucu-akışı" kimlik doğrulaması, sunulan kullanıcı arabirimi için bir WebView kullanır. Cihaz bir WebView Kullanıcı arabirimini sunmıyorsa, diğer kimlik doğrulama yöntemleri gereklidir. Bu SDK bu nedenle, Izleme türü veya benzer kısıtlanmış cihazlar için uygun değildir.

Kurulum ve Önkoşullar

En az bir tablo içeren mobil uygulama arka uç projenizi zaten oluşturmuş ve yayımladığınızı varsayalım. Bu konuda kullanılan kodda, tablo adlandırılır TodoItem ve şu sütunlara sahiptir: Id , Text ve Complete . Bu tablo, Azure Mobile Apps hızlı başlangıçadımlarını tamamladıktan sonra oluşturulan tablodur.

C# ' de karşılık gelen türü belirtilmiş istemci tarafı türü aşağıdaki sınıftır:

public class TodoItem
{
    public string Id { get; set; }

    [JsonProperty(PropertyName = "text")]
    public string Text { get; set; }

    [JsonProperty(PropertyName = "complete")]
    public bool Complete { get; set; }
}

Jsonpropertyattribute , istemci alanı ve tablo alanı arasındaki PropertyName eşlemesini tanımlamak için kullanılır.

Mobile Apps arka ucunuzdaki tablo oluşturmayı öğrenmek için .NET Server SDK konusuna veya Node.js Server SDKkonusuna bakın. Mobil uygulama arka ucunuzu hızlı başlangıç kullanarak Azure portal oluşturduysanız, Azure Portal kolay tablolar ayarını da kullanabilirsiniz.

Nasıl yapılır: yönetilen istemci SDK paketini yüklemek

NuGet'den Mobile Apps için YÖNETILEN istemci SDK paketini yüklemek için aşağıdaki yöntemlerden birini kullanın:

  • Visual Studio Projenize sağ tıklayın, NuGet Paketlerini Yönet ' e tıklayın, paketi arayın ve Microsoft.Azure.Mobile.Client ardından Install ' a tıklayın.
  • Xamarin Studio Projenize sağ tıklayın, Add > NuGet paketleri Ekle Ekle ' ye tıklayın, Microsoft.Azure.Mobile.Client paketi arayın ve ardından paket Ekle ' ye tıklayın.

Ana Etkinlik dosyanızda, aşağıdaki using ifadesini eklemeyi unutmayın:

using Microsoft.WindowsAzure.MobileServices;

Not

Android projenizde başvurulan tüm destek paketlerinin aynı sürüme sahip olması gerektiğini unutmayın. SDK 'nın Xamarin.Android.Support.CustomTabs Android platformu bağımlılığı vardır. bu nedenle, projeniz daha yeni destek paketleri kullanıyorsa, çakışmaları önlemek için bu paketi gerekli sürüme doğrudan yüklemeniz gerekir.

Nasıl yapılır: Visual Studio 'da hata ayıklama sembolleriyle çalışma

Microsoft. Azure. Mobile ad alanı sembolleri, Symbolsource'ta kullanılabilir. Symbols kaynağını Visual Studio ile bütünleştirmek için symbolsource yönergelerine bakın.

Mobile Apps istemcisini oluşturma

Aşağıdaki kod, mobil uygulama arka ucunuza erişmek için kullanılan MobileServiceClient nesnesini oluşturur.

var client = new MobileServiceClient("MOBILE_APP_URL");

Yukarıdaki kodda, MOBILE_APP_URL Azure Portalmobil uygulamanızın arka ucunuzun dikey penceresinde bulunan mobil uygulama arka ucunun URL 'siyle değiştirin. MobileServiceClient nesnesi tek bir olmalıdır.

Tablolarla çalışma

Aşağıdaki bölümde kayıtları arama ve alma ve tablodaki verileri değiştirme ayrıntıları yer alır. Aşağıdaki konular ele alınmıştır:

Nasıl yapılır: tablo başvurusu oluşturma

Bir arka uç tablosundaki verileri erişen veya değiştiren tüm kodlar nesnedeki işlevleri çağırır MobileServiceTable . GetTable metodunu aşağıdaki gibi çağırarak tabloya bir başvuru alın:

IMobileServiceTable<TodoItem> todoTable = client.GetTable<TodoItem>();

Döndürülen nesne, türü belirtilmiş serileştirme modelini kullanır. Türsüz bir serileştirme modeli de desteklenir. Aşağıdaki örnek, türsüz bir tabloya başvuru oluşturur:

// Get an untyped table reference
IMobileServiceTable untypedTodoTable = client.GetTable("TodoItem");

Türsüz sorgularda, temeldeki OData sorgu dizesini belirtmeniz gerekir.

Nasıl yapılır: mobil uygulamanızdan veri sorgulama

Bu bölümde, aşağıdaki işlevleri içeren mobil uygulama arka ucuna sorgu verme açıklanmaktadır:

Not

Tüm satırların döndürülmesini engellemek için sunucu odaklı bir sayfa boyutu zorlanır. Sayfalama, büyük veri kümelerinin varsayılan isteklerini, hizmetin olumsuz şekilde etkilenmeden korur. 50 'den fazla satır döndürmek için, Skip ve Take yöntemini sayfalarda veri dönüşübölümünde açıklandığı gibi kullanın.

Nasıl yapılır: döndürülen verileri filtreleme

Aşağıdaki kod, bir sorguya bir yan tümce ekleyerek verilerin nasıl filtreleneceğini göstermektedir Where . todoTableÖzelliği değerine eşit olan tüm öğeleri döndürür Complete false . [WHERE] işlevi, tabloya karşı sorguya bir satır filtreleme koşulu uygular.

// This query filters out completed TodoItems and items without a timestamp.
List<TodoItem> items = await todoTable
    .Where(todoItem => todoItem.Complete == false)
    .ToListAsync();

Arka uca gönderilen isteğin URI 'sini, tarayıcı geliştirici araçları veya Fiddlergibi ileti İnceleme yazılımını kullanarak görüntüleyebilirsiniz. İstek URI 'sine bakarsanız, sorgu dizesinin değiştirildiğini unutmayın:

GET /tables/todoitem?$filter=(complete+eq+false) HTTP/1.1

Bu OData isteği sunucu SDK 'sı tarafından bir SQL sorgusuna çevrilir:

SELECT *
    FROM TodoItem
    WHERE ISNULL(complete, 0) = 0

Yöntemine geçirilen işlev Where rastgele sayıda koşula sahip olabilir.

// This query filters out completed TodoItems where Text isn't null
List<TodoItem> items = await todoTable
    .Where(todoItem => todoItem.Complete == false && todoItem.Text != null)
    .ToListAsync();

Bu örnek, sunucu SDK 'sı tarafından bir SQL sorgusuna çevrilir:

SELECT *
    FROM TodoItem
    WHERE ISNULL(complete, 0) = 0
          AND ISNULL(text, 0) = 0

Bu sorgu birden çok yan tümce için de ayrılabilir:

List<TodoItem> items = await todoTable
    .Where(todoItem => todoItem.Complete == false)
    .Where(todoItem => todoItem.Text != null)
    .ToListAsync();

İki yöntem eşdeğerdir ve birbirlerinin yerine kullanılabilir. —Tek bir sorgudaki birden çok koşula ilişkin önceki seçenek — daha kompakt ve önerilir.

WhereYan tümcesi OData alt kümesine çevrilen işlemleri destekler. İşlemler şunları içerir:

  • İlişkisel işleçler (= =,! =, <, <=, >, >=),
  • Aritmetik işleçler (+,-,/, *,%),
  • Sayı duyarlığı (Math. Floor, Math. tavan),
  • Dize işlevleri (length, SUBSTRING, Replace, IndexOf, StartsWith, EndsWith),
  • Tarih özellikleri (yıl, ay, gün, saat, dakika, saniye),
  • Bir nesnenin özelliklerine erişin ve
  • Bu işlemlerden herhangi birini birleştiren ifadeler.

Sunucu SDK 'sının neleri desteklediğini düşünürken [OData v3 belgelerini]düşünebilirsiniz.

Nasıl yapılır: döndürülen verileri sıralama

Aşağıdaki kod, sorguya bir OrderBy veya OrderByDescending işlevi ekleyerek verilerin nasıl sıralanacağını gösterir. todoTableAlan tarafından artan düzende sıralanmış öğeleri döndürür Text .

// Sort items in ascending order by Text field
MobileServiceTableQuery<TodoItem> query = todoTable
                .OrderBy(todoItem => todoItem.Text)
List<TodoItem> items = await query.ToListAsync();

// Sort items in descending order by Text field
MobileServiceTableQuery<TodoItem> query = todoTable
                .OrderByDescending(todoItem => todoItem.Text)
List<TodoItem> items = await query.ToListAsync();

Nasıl yapılır: sayfalarda verileri döndürme

Varsayılan olarak, arka uç yalnızca ilk 50 satırı döndürür. [Take] metodunu çağırarak döndürülen satır sayısını artırabilirsiniz. TakeSorgu tarafından döndürülen toplam veri kümesinin belirli bir "sayfasını" istemek Için Atla yöntemiyle birlikte kullanın. Aşağıdaki sorgu yürütüldüğünde, tablodaki en üstteki üç öğeyi döndürür.

// Define a filtered query that returns the top 3 items.
MobileServiceTableQuery<TodoItem> query = todoTable.Take(3);
List<TodoItem> items = await query.ToListAsync();

Aşağıdaki düzeltilen sorgu ilk üç sonucu atlar ve sonraki üç sonucu döndürür. Bu sorgu, sayfa boyutunun üç öğe olduğu, verilerin ikinci "sayfasını" üretir.

// Define a filtered query that skips the top 3 items and returns the next 3 items.
MobileServiceTableQuery<TodoItem> query = todoTable.Skip(3).Take(3);
List<TodoItem> items = await query.ToListAsync();

IncludeTotalCount metodu, belirtilen tüm sayfalama/limit yan tümcesini yoksayarak döndürülen Tüm kayıtların toplam sayısını ister:

query = query.IncludeTotalCount();

Gerçek bir dünya uygulamasında, yukarıdaki örneğe benzer sorguları bir sayfalayıcı denetimiyle veya sayfalar arasında gezinmek için karşılaştırılabilir Kullanıcı arabirimine kullanabilirsiniz.

Not

Bir mobil uygulama arka ucunda 50 satırlık sınırı geçersiz kılmak için, EnableQueryAttribute ÖĞESINI ortak alma yöntemine de uygulamanız ve sayfalama davranışını belirtmeniz gerekir. Yöntemine uygulandığında, aşağıdaki en fazla döndürülen satırları 1000 olarak ayarlar:

[EnableQuery(MaxTop=1000)]

Nasıl yapılır: belirli sütunları seçme

Sorgunuza bir [Select] yan tümcesi ekleyerek sonuçlara hangi özellik kümesinin ekleneceğini belirtebilirsiniz. Örneğin, aşağıdaki kod, tek bir alanın nasıl ve ayrıca birden çok alanı seçme ve biçimlendirme işlemlerinin nasıl yapılacağını göstermektedir:

// Select one field -- just the Text
MobileServiceTableQuery<TodoItem> query = todoTable
                .Select(todoItem => todoItem.Text);
List<string> items = await query.ToListAsync();

// Select multiple fields -- both Complete and Text info
MobileServiceTableQuery<TodoItem> query = todoTable
                .Select(todoItem => string.Format("{0} -- {1}",
                    todoItem.Text.PadRight(30), todoItem.Complete ?
                    "Now complete!" : "Incomplete!"));
List<string> items = await query.ToListAsync();

Şimdiye kadar açıklanan tüm işlevler eklenebilir, bu nedenle zincirleme devam edebilir. Her zincirleme çağrı sorguyu etkiler. Bir örnek daha:

MobileServiceTableQuery<TodoItem> query = todoTable
                .Where(todoItem => todoItem.Complete == false)
                .Select(todoItem => todoItem.Text)
                .Skip(3).
                .Take(3);
List<string> items = await query.ToListAsync();

Nasıl yapılır: KIMLIĞE göre verileri arama

LookupAsync işlevi, veritabanından belırlı bir kimliğe sahip nesneleri aramak için kullanılabilir.

// This query filters out the item with the ID of 37BBF396-11F0-4B39-85C8-B319C729AF6D
TodoItem item = await todoTable.LookupAsync("37BBF396-11F0-4B39-85C8-B319C729AF6D");

Nasıl yapılır: türsüz sorgular yürütme

Türsüz bir tablo nesnesi kullanarak bir sorgu yürütürken, aşağıdaki örnekte olduğu gibi, ReadAsync'ı çağırarak OData sorgu dizesini açıkça belirtmeniz gerekir:

// Lookup untyped data using OData
JToken untypedItems = await untypedTodoTable.ReadAsync("$filter=complete eq 0&$orderby=text");

Bir özellik paketi gibi kullanabileceğiniz JSON değerlerini geri alırsınız. JToken ve Newtonsoft Json.NET hakkında daha fazla bilgi için bkz. JSON.net sitesi.

Nasıl yapılır: mobil uygulama arka ucuna veri ekleme

Tüm istemci türleri, varsayılan olarak bir dize olan kimliği adlı bir üye içermelidir. Bu kimlik , CRUD işlemlerini gerçekleştirmek ve çevrimdışı eşitleme için gereklidir. Aşağıdaki kod, bir tabloya yeni satırlar eklemek için [ınsertasync] yönteminin nasıl kullanılacağını gösterir. Parametresi .NET nesnesi olarak eklenecek verileri içerir.

await todoTable.InsertAsync(todoItem);

Bir ekleme sırasında öğesine benzersiz bir özel KIMLIK değeri dahil edilmemelidir todoItem , sunucu tarafından BIR GUID oluşturulur. Çağrı dönüşdikten sonra nesneyi inceleyerek oluşturulan kimliği alabilirsiniz.

Türsüz verileri eklemek için Json.NET avantajlarından yararlanabilirsiniz:

JObject jo = new JObject();
jo.Add("Text", "Hello World");
jo.Add("Complete", false);
var inserted = await table.InsertAsync(jo);

Benzersiz bir dize kimliği olarak bir e-posta adresi kullanan bir örnek aşağıda verilmiştir:

JObject jo = new JObject();
jo.Add("id", "myemail@emaildomain.com");
jo.Add("Text", "Hello World");
jo.Add("Complete", false);
var inserted = await table.InsertAsync(jo);

KIMLIK değerleriyle çalışma

Mobile Apps, tablonun kimlik sütunu için benzersiz özel dize değerlerini destekler. Bir dize değeri, uygulamaların, KIMLIK için e-posta adresleri veya Kullanıcı adları gibi özel değerleri kullanmasına izin verir. Dize kimlikleri aşağıdaki avantajları sağlar:

  • Kimlikler, veritabanına gidiş dönüş yapılmadan oluşturulur.
  • Kayıtlar farklı tablolardan veya veritabanlarından birleştirmek daha kolaydır.
  • Kimlikler değerleri, bir uygulamanın mantığı ile daha iyi tümleştirilebilir.

Ekli bir kayıtta bir dize KIMLIĞI değeri ayarlanmamışsa, mobil uygulama arka ucu KIMLIK için benzersiz bir değer oluşturur. İstemci veya arka uçta kendi KIMLIK değerlerinizi oluşturmak için GUID. NewGuid yöntemini kullanabilirsiniz.

JObject jo = new JObject();
jo.Add("id", Guid.NewGuid().ToString("N"));

Nasıl yapılır: bir mobil uygulama arka ucunda verileri değiştirme

Aşağıdaki kod, aynı KIMLIĞE sahip mevcut bir kaydı yeni bilgilerle güncelleştirmek için UpdateAsync yönteminin nasıl kullanılacağını gösterir. Parametresi, .NET nesnesi olarak güncellenen verileri içerir.

await todoTable.UpdateAsync(todoItem);

Türsüz verileri güncelleştirmek için, JSON.net 'den şu şekilde yararlanabilirsiniz:

JObject jo = new JObject();
jo.Add("id", "37BBF396-11F0-4B39-85C8-B319C729AF6D");
jo.Add("Text", "Hello World");
jo.Add("Complete", false);
var inserted = await table.UpdateAsync(jo);

idGüncelleştirme yapılırken bir alanın belirtilmesi gerekir. Arka uç, id hangi satırın güncelleştirilecek olduğunu belirlemek için alanını kullanır. idAlan, çağrının sonucundan elde edilebilir InsertAsync . Bir ArgumentException öğeyi değeri sağlamadan güncelleştirmeye çalışırsanız oluşturulur id .

Nasıl yapılır: bir mobil uygulama arka ucunda verileri silme

Aşağıdaki kod, var olan bir örneği silmek için DeleteAsync yönteminin nasıl kullanılacağını gösterir. Örnek id , üzerinde ayarlanan alan tarafından tanımlanır todoItem .

await todoTable.DeleteAsync(todoItem);

Türsüz verileri silmek için, Json.NET ' den şu şekilde yararlanabilirsiniz:

JObject jo = new JObject();
jo.Add("id", "37BBF396-11F0-4B39-85C8-B319C729AF6D");
await table.DeleteAsync(jo);

Silme isteği yaptığınızda bir KIMLIK belirtilmelidir. Diğer özellikler hizmete geçirilmez veya hizmette yok sayılır. Bir DeleteAsync çağrının sonucu genellikle olur null . Geçirilecek KIMLIK, çağrının sonucundan elde edilebilir InsertAsync . MobileServiceInvalidOperationExceptionAlanı belirtmeden bir öğeyi silmeye çalıştığınızda bir oluşturulur id .

Nasıl yapılır: çakışma çözümü için Iyimser eşzamanlılık kullanma

İki veya daha fazla istemci aynı öğedeki değişiklikleri aynı anda yazabilir. Çakışma algılaması olmadan, son yazma önceki güncelleştirmelerin üzerine yazar. İyimser eşzamanlılık denetimi , her bir işlemin işleme ve bu nedenle herhangi bir kaynak kilitlemeyi kullanmayan varsayılmaktadır. Bir işlemi işlemeden önce, iyimser eşzamanlılık denetimi başka hiçbir işlemin verileri değiştirmadığını doğrular. Veriler değiştirilmişse, işleme işlemi geri alınır.

Mobile Apps version , mobil uygulama arka ucunuzdaki her tablo için tanımlanan sistem özelliği sütununu kullanarak her bir öğedeki değişiklikleri izleyerek iyimser eşzamanlılık denetimini destekler. Kayıt her güncelleştirildiği zaman, Mobile Apps version Bu kaydın özelliğini yeni bir değere ayarlar. Her güncelleştirme isteği sırasında, version isteğe dahil edilen kaydın özelliği, sunucudaki kayıt için aynı özellik ile karşılaştırılır. İstekle geçilen sürüm arka uca eşleşmiyorsa, istemci kitaplığı bir MobileServicePreconditionFailedException<T> özel durum oluşturur. Özel duruma dahil edilen tür, kaydın sunucular sürümünü içeren arka ucun kaydıdır. Uygulama daha sonra bu bilgileri kullanarak değişiklikleri yürütmek için Güncelleştirme isteğinin arka uca doğru değerle yeniden yürütülüp yürütülmeyeceğine karar verebilir version .

versionİyimser eşzamanlılık sağlamak için sistem özelliğine ait tablo sınıfında bir sütun tanımlayın. Örnek:

public class TodoItem
{
    public string Id { get; set; }

    [JsonProperty(PropertyName = "text")]
    public string Text { get; set; }

    [JsonProperty(PropertyName = "complete")]
    public bool Complete { get; set; }

    // **_ Enable Optimistic Concurrency _*_ //
    [JsonProperty(PropertyName = "version")]
    public string Version { set; get; }
}

Türsüz tablolar kullanan uygulamalar, Version tablodaki bayrağını aşağıdaki gibi ayarlayarak iyimser eşzamanlılık sağlar SystemProperties .

//Enable optimistic concurrency by retrieving version
todoTable.SystemProperties |= MobileServiceSystemProperties.Version;

İyimser eşzamanlılık etkinleştirmenin yanı sıra, MobileServicePreconditionFailedException<T> UpdateAsyncçağrılırken kodunuzda özel durumu da yakalamalı olması gerekir. Güncelleştirilmiş kayda doğru uygulayarak çakışmayı çözün version ve çözümlenen kayıtla UpdateAsync çağırın. Aşağıdaki kod, bir yazma çakışmasını tespit edildikten sonra nasıl çözümleneceğini gösterir:

private async void UpdateToDoItem(TodoItem item)
{
    MobileServicePreconditionFailedException<TodoItem> exception = null;

    try
    {
        //update at the remote table
        await todoTable.UpdateAsync(item);
    }
    catch (MobileServicePreconditionFailedException<TodoItem> writeException)
    {
        exception = writeException;
    }

    if (exception != null)
    {
        // Conflict detected, the item has changed since the last query
        // Resolve the conflict between the local and server item
        await ResolveConflict(item, exception.Item);
    }
}


private async Task ResolveConflict(TodoItem localItem, TodoItem serverItem)
{
    //Ask user to choose the resolution between versions
    MessageDialog msgDialog = new MessageDialog(
        String.Format("Server Text: \"{0}\" \nLocal Text: \"{1}\"\n",
        serverItem.Text, localItem.Text),
        "CONFLICT DETECTED - Select a resolution:");

    UICommand localBtn = new UICommand("Commit Local Text");
    UICommand ServerBtn = new UICommand("Leave Server Text");
    msgDialog.Commands.Add(localBtn);
    msgDialog.Commands.Add(ServerBtn);

    localBtn.Invoked = async (IUICommand command) =>
    {
        // To resolve the conflict, update the version of the item being committed. Otherwise, you will keep
        // catching a MobileServicePreConditionFailedException.
        localItem.Version = serverItem.Version;

        // Updating recursively here just in case another change happened while the user was making a decision
        UpdateToDoItem(localItem);
    };

    ServerBtn.Invoked = async (IUICommand command) =>
    {
        RefreshTodoItems();
    };

    await msgDialog.ShowAsync();
}

Daha fazla bilgi için bkz. [Azure 'Da çevrimdışı veri eşitleme Mobile Apps] konusu.

Nasıl yapılır: Windows Kullanıcı arabirimine Mobile Apps verileri bağlama

Bu bölümde, bir Windows uygulamasında kullanıcı arabirimi öğeleri kullanılarak döndürülen veri nesnelerinin nasıl görüntüleneceği gösterilmektedir. Aşağıdaki örnek kod, tamamlanmamış öğeler için bir sorguyla birlikte listenin kaynağına bağlanır. MobileServiceCollection Mobile Apps duyarlı bir bağlama koleksiyonu oluşturur.

// This query filters out completed TodoItems.
MobileServiceCollection<TodoItem, TodoItem> items = await todoTable
    .Where(todoItem => todoItem.Complete == false)
    .ToCollectionAsync();

// itemsControl is an IEnumerable that could be bound to a UI list control
IEnumerable itemsControl  = items;

// Bind this to a ListBox
ListBox lb = new ListBox();
lb.ItemsSource = items;

Yönetilen çalışma zamanındaki bazı denetimler ISupportIncrementalLoadingadlı bir arabirimi destekler. Bu arabirim, Kullanıcı kaydırıldığında denetimlerin ek veri istemesine izin verir. Bu arabirim için, MobileServiceIncrementalLoadingCollectionaracılığıyla Evrensel Windows uygulamaları için yerleşik destek bulunur ve bu, denetimlerden gelen çağrıları otomatik olarak işler. MobileServiceIncrementalLoadingCollectionWindows uygulamalarında aşağıdaki gibi kullanın:

MobileServiceIncrementalLoadingCollection<TodoItem,TodoItem> items;
items = todoTable.Where(todoItem => todoItem.Complete == false).ToIncrementalLoadingCollection();

ListBox lb = new ListBox();
lb.ItemsSource = items;

Yeni koleksiyonu Windows Phone 8 ve "Silverlight" uygulamalarında kullanmak için ToCollection ve üzerinde uzantı yöntemlerini kullanın IMobileServiceTableQuery<T> IMobileServiceTable<T> . Verileri yüklemek için çağrısı yapın LoadMoreItemsAsync() .

MobileServiceCollection<TodoItem, TodoItem> items = todoTable.Where(todoItem => todoItem.Complete==false).ToCollection();
await items.LoadMoreItemsAsync();

Ya da çağırarak oluşturulan koleksiyonu kullandığınızda ToCollectionAsync ToCollection , UI denetimlerine bağlanabilen bir koleksiyon alırsınız. Bu koleksiyon disk belleğine duyarlı. Koleksiyon ağdan veri yüklüyor olduğundan, yükleme bazen başarısız olur. Bu tür sorunları işlemek için, OnException MobileServiceIncrementalLoadingCollection çağrılarından kaynaklanan özel durumları işlemek üzere üzerindeki yöntemini geçersiz kılın LoadMoreItemsAsync .

Tablonuzun çok fazla alan olup olmadığını ve yalnızca bazı bunları denetimenizde göstermek istediğinizi göz önünde bulundurun. Kullanıcı arabiriminde görüntülenecek belirli sütunları seçmek için yukarıdaki "belirli sütunları seç" bölümündeki Kılavuzu kullanabilirsiniz.

Sayfa boyutunu değiştirme

Azure Mobile Apps, varsayılan olarak istek başına en fazla 50 öğe döndürür. Hem istemcide hem de sunucuda maksimum sayfa boyutunu artırarak disk belleği boyutunu değiştirebilirsiniz. İstenen sayfa boyutunu artırmak için şunu PullOptions kullanarak PullAsync() şunları belirtin:

PullOptions pullOptions = new PullOptions
    {
        MaxPageSize = 100
    };

PageSizeSunucu içinde 100 ' den büyük veya ona eşit bir istek yaptıysanız, bir istek en fazla 100 öğe döndürür.

Çevrimdışı tablolarla çalışma

Çevrimdışı tablolar, verileri çevrimdışıyken kullanılmak üzere depolamak için yerel bir SQLite depo kullanır. Tüm tablo işlemleri, uzak sunucu deposu yerine yerel SQLite deposuna göre yapılır. Çevrimdışı bir tablo oluşturmak için önce projenizi hazırlayın:

  1. Visual Studio 'da çözüme sağ tıklayın > _ * çözüm için NuGet Paketlerini Yönet... * *, ardından Çözümdeki tüm projeler için Microsoft. Azure. Mobile. Client. SQLiteStore NuGet paketini arayın ve yüklemeyi yapın.

  2. Seçim Windows cihazlarını desteklemek için aşağıdaki SQLite çalışma zamanı paketlerinden birini yüklemelisiniz:

  3. (İsteğe bağlı). Windows cihazları için Başvurular > Başvuru Ekle... öğesine tıklayın, Windows klasörünü > uzantıları ' nı genişletin ve ardından Windows SDK için Visual C++ 2013 çalışma zamanı ile birlikte Windows SDK için uygun SQLite 'u etkinleştirin. SQLite SDK adları her bir Windows platformunda biraz farklılık gösterir.

Bir tablo başvurusu oluşturulmadan önce, yerel depo hazırlanmalıdır:

var store = new MobileServiceSQLiteStore(Constants.OfflineDbPath);
store.DefineTable<TodoItem>();

//Initializes the SyncContext using the default IMobileServiceSyncHandler.
await this.client.SyncContext.InitializeAsync(store);

Mağaza başlatması normalde istemci oluşturulduktan hemen sonra yapılır. Offlinedbyolu , destekledikleri tüm platformlarda kullanılmak üzere uygun bir dosya adı olmalıdır. Yol tam olarak nitelenmiş bir yoldur (yani eğik çizgiyle başlıyorsa), bu yol kullanılır. Yol tam nitelikli değilse, dosya platforma özgü bir konuma yerleştirilir.

  • İOS ve Android cihazlarda, varsayılan yol "kişisel dosyalar" klasörüdür.
  • Windows cihazlarında, varsayılan yol uygulamaya özgü "AppData" klasörüdür.

Bir tablo başvurusu, yöntemi kullanılarak elde edilebilir GetSyncTable<> :

var table = client.GetSyncTable<TodoItem>();

Çevrimdışı bir tablo kullanmak için kimlik doğrulaması yapmanız gerekmez. Yalnızca arka uç hizmetiyle iletişim kurarken kimlik doğrulaması yapmanız gerekir.

Çevrimdışı bir tabloyu eşitleme

Çevrimdışı tablolar varsayılan olarak arka uca eşitlenmez. Eşitleme iki parçaya bölünür. Değişiklikleri yeni öğeler indirilmeden ayrı olarak gönderebilirsiniz. Tipik bir eşitleme yöntemi aşağıda verilmiştir:

public async Task SyncAsync()
{
    ReadOnlyCollection<MobileServiceTableOperationError> syncErrors = null;

    try
    {
        await this.client.SyncContext.PushAsync();

        await this.todoTable.PullAsync(
            //The first parameter is a query name that is used internally by the client SDK to implement incremental sync.
            //Use a different query name for each unique query in your program
            "allTodoItems",
            this.todoTable.CreateQuery());
    }
    catch (MobileServicePushFailedException exc)
    {
        if (exc.PushResult != null)
        {
            syncErrors = exc.PushResult.Errors;
        }
    }

    // Simple error/conflict handling. A real application would handle the various errors like network conditions,
    // server conflicts and others via the IMobileServiceSyncHandler.
    if (syncErrors != null)
    {
        foreach (var error in syncErrors)
        {
            if (error.OperationKind == MobileServiceTableOperationKind.Update && error.Result != null)
            {
                //Update failed, reverting to server's copy.
                await error.CancelAndUpdateItemAsync(error.Result);
            }
            else
            {
                // Discard local change.
                await error.CancelAndDiscardItemAsync();
            }

            Debug.WriteLine(@"Error executing sync operation. Item: {0} ({1}). Operation discarded.", error.TableName, error.Item["id"]);
        }
    }
}

İçin ilk bağımsız değişken PullAsync null ise, artımlı eşitleme kullanılmaz. Her eşitleme işlemi tüm kayıtları alır.

SDK PushAsync() kayıtları çekmeden önce örtük bir şekilde gerçekleştirir.

Bir yöntemde çakışma işleme gerçekleşir PullAsync() . Çakışmalarla, çevrimiçi tablolarla aynı şekilde ilgilenebilmeniz gerekir. PullAsync()Ekleme, güncelleştirme veya silme sırasında yerine çağrıldığında çakışma üretilir. Birden çok çakışma meydana geliyorsa, bunlar tek bir MobileServicePushFailedException içinde paketlenmiştir. Her başarısızlığı ayrı olarak işleyin.

Özel bir API ile çalışma

Özel bir API, bir INSERT, Update, DELETE veya Read işlemiyle eşleşmeyen sunucu işlevlerini açığa çıkaran özel uç noktalar tanımlamanızı sağlar. Özel bir API kullanarak ileti üzerinde daha fazla denetime sahip olabilirsiniz ve HTTP ileti üst bilgilerini okumak ve ayarlamak ve JSON dışında bir ileti gövdesi biçimi tanımlamak dahil olabilirsiniz.

İstemci üzerindeki [ınvokeapiasync] yöntemlerinden birini çağırarak özel bir API 'yi çağırabilirsiniz. Örneğin, aşağıdaki kod satırı arka uçtaki Completeall API 'SINE bir post isteği gönderir:

var result = await client.InvokeApiAsync<MarkAllResult>("completeAll", System.Net.Http.HttpMethod.Post, null);

Bu form, yazılı bir yöntem çağrıdır ve Markallresult dönüş türünün tanımlanmasını gerektirir. Hem yazılan hem de türsüz yöntemler desteklenir.

Invokeapiasync () yöntemi, API '/' ile başlanmadığı takdirde çağırmak istediğiniz API 'ye '/api/' öğesine eklenir. Örnek:

  • InvokeApiAsync("completeAll",...) arka uçta/api/completeAll çağırır
  • InvokeApiAsync("/.auth/me",...) arka uçta/.exe auth/Me çağırır

Azure Mobile Apps ile tanımlanmayan bu WebAPIs dahil olmak üzere herhangi bir WebAPI çağırmak için ınvokeapiasync kullanabilirsiniz. Invokeapiasync () kullandığınızda, kimlik doğrulama üst bilgileri de dahil olmak üzere uygun üstbilgiler istekle birlikte gönderilir.

Kullanıcıların kimliklerini doğrulama

Mobile Apps, farklı dış kimlik sağlayıcıları kullanarak uygulama kullanıcılarının kimlik doğrulamasını ve yetkilendiriyi destekler: Facebook, Google, Microsoft hesabı, Twitter ve Azure Active Directory. Belirli işlemlere erişimi yalnızca kimliği doğrulanmış kullanıcılarla kısıtlamak için tablolar üzerinde izinler belirleyebilirsiniz. Ayrıca, sunucu betiklerine yetkilendirme kuralları uygulamak için kimliği doğrulanmış kullanıcıların kimliğini de kullanabilirsiniz. Daha fazla bilgi için Uygulamanıza kimlik doğrulaması ekleme öğreticisine bakın.

İki kimlik doğrulama akışı desteklenir: istemci tarafından yönetilen ve sunucu tarafından yönetilen akış. Sunucu tarafından yönetilen akış, sağlayıcının web kimlik doğrulama arabirimini temel aldığından en basit kimlik doğrulama deneyimini sağlar. İstemci tarafından yönetilen akış, sağlayıcıya özel cihaza özgü SDK 'lara bağlı olduğundan cihaza özgü yetenekler ile daha derin tümleştirme sağlar.

Not

Üretim uygulamalarınızda istemci tarafından yönetilen bir akış kullanmanızı öneririz.

Kimlik doğrulaması ayarlamak için uygulamanızı bir veya daha fazla kimlik sağlayıcısıyla kaydetmeniz gerekir. Kimlik sağlayıcısı, uygulamanız için bir istemci KIMLIĞI ve bir istemci gizli anahtarı oluşturur. Bu değerler daha sonra Azure App Service Kimlik Doğrulaması/Yetkilendirmeyi etkinleştirmek için arka ucunuza ayarlanır. Daha fazla bilgi için, uygulamanıza kimlik doğrulaması eklemeöğreticisindeki ayrıntılı yönergeleri izleyin.

Bu bölümde aşağıdaki konular ele alınmıştır:

İstemci tarafından yönetilen kimlik doğrulaması

Uygulamanız kimlik sağlayıcısıyla bağımsız olarak iletişim kurabilerek arka ucunuza oturum açma sırasında döndürülen belirteci sağlayabilir. Bu istemci akışı, kullanıcılar için bir çoklu oturum açma deneyimi sağlamanıza veya kimlik sağlayıcısından ek kullanıcı verileri almanıza olanak sağlar. Kimlik sağlayıcısı SDK 'Sı daha yerel bir UX sağlar ve ek özelleştirmeye izin veriyorsa, istemci akışı kimlik doğrulaması bir sunucu akışı kullanımı için tercih edilir.

Aşağıdaki istemci akışı kimlik doğrulama desenleri için örnekler verilmiştir:

Active Directory Authentication Library kullanıcıların kimliğini doğrulama

Azure Active Directory kimlik doğrulaması kullanarak istemciden kullanıcı kimlik doğrulaması başlatmak için Active Directory Authentication Library (ADAL) kullanabilirsiniz.

  1. [Active Directory oturum açma öğreticisini App Service nasıl yapılandıracağınızı] izleyerek AAD oturum açma için mobil uygulamanızın arka ucunu yapılandırın. Yerel istemci uygulamasını kaydetme işleminin isteğe bağlı adımını tamamladığınızdan emin olun.

  2. Visual Studio veya Xamarin Studio içinde projenizi açın ve NuGet paketine bir başvuru ekleyin Microsoft.IdentityModel.Clients.ActiveDirectory . Arama sırasında yayın öncesi sürümleri dahil edin.

  3. Aşağıdaki kodu, kullandığınız platforma göre uygulamanıza ekleyin. Her birinde aşağıdaki değişiklikleri yapın:

    • Eklentiyi, uygulamanızı sağladığınız kiracının adıyla değiştirin. Biçim olmalıdır https://login.microsoftonline.com/contoso.onmicrosoft.com . Bu değer, Azure portalAzure Active Directory etki alanı sekmesinden kopyalanabilir.

    • Insert-Resource-ID-burada , mobil uygulama arka ucunuzun istemci kimliği ile değiştirin. İstemci KIMLIĞINI, portalda Azure Active Directory ayarlar ' ın altında bulunan Gelişmiş sekmesinden elde edebilirsiniz.

    • Ekle-ISTEMCI kimliği- ' ni yerel istemci uygulamasından KOPYALADıĞıNıZ istemci kimliğiyle değiştirin.

    • {1 & gt; Insert-REDIRECT-URI & lt; 1} ÖĞESINI, https şemasını kullanarak sitenizin /.Auth/login/done uç noktasıyla değiştirin Bu değer değerine benzer olmalıdır https://contoso.azurewebsites.net/.auth/login/done .

      Her platform için gereken kod aşağıdadır:

      Pencerelerin

      private MobileServiceUser user;
      private async Task AuthenticateAsync()
      {
      
         string authority = "INSERT-AUTHORITY-HERE";
         string resourceId = "INSERT-RESOURCE-ID-HERE";
         string clientId = "INSERT-CLIENT-ID-HERE";
         string redirectUri = "INSERT-REDIRECT-URI-HERE";
         while (user == null)
         {
             string message;
             try
             {
                 AuthenticationContext ac = new AuthenticationContext(authority);
                 AuthenticationResult ar = await ac.AcquireTokenAsync(resourceId, clientId,
                     new Uri(redirectUri), new PlatformParameters(PromptBehavior.Auto, false) );
                 JObject payload = new JObject();
                 payload["access_token"] = ar.AccessToken;
                 user = await App.MobileService.LoginAsync(
                     MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload);
                 message = string.Format("You are now logged in - {0}", user.UserId);
             }
             catch (InvalidOperationException)
             {
                 message = "You must log in. Login Required";
             }
             var dialog = new MessageDialog(message);
             dialog.Commands.Add(new UICommand("OK"));
             await dialog.ShowAsync();
         }
      }
      

      Xamarin.iOS

      private MobileServiceUser user;
      private async Task AuthenticateAsync(UIViewController view)
      {
      
         string authority = "INSERT-AUTHORITY-HERE";
         string resourceId = "INSERT-RESOURCE-ID-HERE";
         string clientId = "INSERT-CLIENT-ID-HERE";
         string redirectUri = "INSERT-REDIRECT-URI-HERE";
         try
         {
             AuthenticationContext ac = new AuthenticationContext(authority);
             AuthenticationResult ar = await ac.AcquireTokenAsync(resourceId, clientId,
                 new Uri(redirectUri), new PlatformParameters(view));
             JObject payload = new JObject();
             payload["access_token"] = ar.AccessToken;
             user = await client.LoginAsync(
                 MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload);
         }
         catch (Exception ex)
         {
             Console.Error.WriteLine(@"ERROR - AUTHENTICATION FAILED {0}", ex.Message);
         }
      }
      

      Xamarin.Android

      private MobileServiceUser user;
      private async Task AuthenticateAsync()
      {
      
         string authority = "INSERT-AUTHORITY-HERE";
         string resourceId = "INSERT-RESOURCE-ID-HERE";
         string clientId = "INSERT-CLIENT-ID-HERE";
         string redirectUri = "INSERT-REDIRECT-URI-HERE";
         try
         {
             AuthenticationContext ac = new AuthenticationContext(authority);
             AuthenticationResult ar = await ac.AcquireTokenAsync(resourceId, clientId,
                 new Uri(redirectUri), new PlatformParameters(this));
             JObject payload = new JObject();
             payload["access_token"] = ar.AccessToken;
             user = await client.LoginAsync(
                 MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload);
         }
         catch (Exception ex)
         {
             AlertDialog.Builder builder = new AlertDialog.Builder(this);
             builder.SetMessage(ex.Message);
             builder.SetTitle("You must log in. Login Required");
             builder.Create().Show();
         }
      }
      protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
      {
      
         base.OnActivityResult(requestCode, resultCode, data);
         AuthenticationAgentContinuationHelper.SetAuthenticationAgentContinuationEventArgs(requestCode, resultCode, data);
      }
      

Facebook veya Google 'dan bir belirteç kullanarak tek Sign-On

Facebook veya Google için bu kod parçacığında gösterildiği gibi istemci akışını kullanabilirsiniz.

var token = new JObject();
// Replace access_token_value with actual value of your access token obtained
// using the Facebook or Google SDK.
token.Add("access_token", "access_token_value");

private MobileServiceUser user;
private async Task AuthenticateAsync()
{
    while (user == null)
    {
        string message;
        try
        {
            // Change MobileServiceAuthenticationProvider.Facebook
            // to MobileServiceAuthenticationProvider.Google if using Google auth.
            user = await client.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token);
            message = string.Format("You are now logged in - {0}", user.UserId);
        }
        catch (InvalidOperationException)
        {
            message = "You must log in. Login Required";
        }

        var dialog = new MessageDialog(message);
        dialog.Commands.Add(new UICommand("OK"));
        await dialog.ShowAsync();
    }
}

Sunucu tarafından yönetilen kimlik doğrulaması

Kimlik sağlayıcınızı kaydettikten sonra, [MobileServiceClient] üzerinde, sağlayıcınızdaki Mobileserviceauthenticationprovider değeri Ile loginasync yöntemini çağırın. Örneğin, aşağıdaki kod Facebook kullanarak bir sunucu akışı oturum açma işlemini başlatır.

private MobileServiceUser user;
private async System.Threading.Tasks.Task Authenticate()
{
    while (user == null)
    {
        string message;
        try
        {
            user = await client
                .LoginAsync(MobileServiceAuthenticationProvider.Facebook);
            message =
                string.Format("You are now logged in - {0}", user.UserId);
        }
        catch (InvalidOperationException)
        {
            message = "You must log in. Login Required";
        }

        var dialog = new MessageDialog(message);
        dialog.Commands.Add(new UICommand("OK"));
        await dialog.ShowAsync();
    }
}

Facebook dışında bir kimlik sağlayıcısı kullanıyorsanız, Mobileserviceauthenticationprovider değerini sağlayıcınızın değerine değiştirin.

Sunucu akışında, Azure App Service seçili sağlayıcının oturum açma sayfasını görüntüleyerek OAuth kimlik doğrulama akışını yönetir. Kimlik sağlayıcısı döntikten sonra, Azure App Service bir App Service kimlik doğrulama belirteci üretir. Loginasync yöntemi, bir JSON Web BELIRTECI (JWT) olarak kimliği doğrulanmış kullanıcının ve Mobileserviceauthenticationtoken'ın [Kullanıcı] kimliğini sağlayan bir mobileserviceuserdöndürür. Bu belirteç önbelleğe alınabilir süresi sona erene kadar yeniden kullanılabilir. Daha fazla bilgi için bkz. kimlik doğrulama belirtecini önbelleğe alma.

Xamarin (Android ya da iOS) kullanırken Xamarin. Essentials WebAuthenticator kullanılır. Varsayılan bağlamı (Android) veya UIViewController 'ı (iOS) yöntemine geçirmeniz gerekir LoginAsync . Ayrıca, Web doğrulayıcısından geri dönüşü işlemeniz gerekir. Android 'de bu, içinde işlenir MainActivity.cs :

public override void OnResume()
{
    base.OnResume();
    Xamarin.Essentials.Platform.OnResume();
}

İOS 'ta bu, AppDelegate. cs içinde işlenir:

public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
    if (client.ResumeWithURL(app, url, options))
        return true;
    return base.OpenUrl(app, url, options);
}

Kimlik doğrulama belirtecini önbelleğe alma

Bazı durumlarda, oturum açma yöntemine yapılan çağrının kimlik doğrulama belirteci sağlayıcıdan depolanarak ilk başarılı kimlik doğrulamasından sonra kaçınılabilir. Microsoft Store ve UWP uygulamaları, başarılı bir oturum açma işleminden sonra geçerli kimlik doğrulama belirtecini şu şekilde önbelleğe almak için [Passwordkasasını] kullanabilir:

await client.LoginAsync(MobileServiceAuthenticationProvider.Facebook);

PasswordVault vault = new PasswordVault();
vault.Add(new PasswordCredential("Facebook", client.currentUser.UserId,
    client.currentUser.MobileServiceAuthenticationToken));

UserID değeri kimlik bilgisinin Kullanıcı adı olarak depolanır ve belirteç parola olarak depolanır. Sonraki başlangıçlarda, önbelleğe alınmış kimlik bilgileri için Passwordkasasını kontrol edebilirsiniz. Aşağıdaki örnek, bulunan önbelleğe alınmış kimlik bilgilerini kullanır, aksi halde arka uca yeniden kimlik doğrulaması yapmayı dener:

// Try to retrieve stored credentials.
var creds = vault.FindAllByResource("Facebook").FirstOrDefault();
if (creds != null)
{
    // Create the current user from the stored credentials.
    client.currentUser = new MobileServiceUser(creds.UserName);
    client.currentUser.MobileServiceAuthenticationToken =
        vault.Retrieve("Facebook", creds.UserName).Password;
}
else
{
    // Regular login flow and cache the token as shown above.
}

Bir kullanıcının oturumunu kapattığınızda, depolanan kimlik bilgilerini aşağıdaki gibi de kaldırmanız gerekir:

client.Logout();
vault.Remove(vault.Retrieve("Facebook", client.currentUser.UserId));

Xamarin Apps, kimlik bilgilerini bir Hesap nesnesinde güvenli bir şekilde depolamak için Xamarin. auth API 'lerini kullanır. Bu API 'Leri kullanmayla ilgili bir örnek için Contosodakika fotoğraf paylaşma örneğindeki AuthStore.cs kod dosyasına bakın.

İstemci tarafından yönetilen kimlik doğrulaması kullandığınızda, sağlayıcınızda Facebook veya Twitter gibi alınan erişim belirtecini de önbelleğe alabilirsiniz. Bu belirteç arka uca yeni bir kimlik doğrulama belirteci istemek için aşağıdaki gibi sağlanabilir:

var token = new JObject();
// Replace <your_access_token_value> with actual value of your access token
token.Add("access_token", "<your_access_token_value>");

// Authenticate using the access token.
await client.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token);

Anında iletme bildirimleri

Aşağıdaki konularda anında Iletme bildirimleri ele alınmaktadır:

Nasıl yapılır: anında Iletme bildirimleri için kaydolma

Mobile Apps istemcisi Azure Notification Hubs anında iletme bildirimleri için kayıt yapmanızı sağlar. Kayıt sırasında, platforma özgü anında Iletme bildirimi hizmetinden (PNS) edindiğiniz bir tanıtıcı elde edersiniz. Daha sonra, kaydı oluştururken bu değeri herhangi bir etiketle birlikte sağlarsınız. Aşağıdaki kod, Windows Notification hizmeti (WNS) ile birlikte anında iletme bildirimleri için Windows uygulamanızı kaydeder:

private async void InitNotificationsAsync()
{
    // Request a push notification channel.
    var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();

    // Register for notifications using the new channel.
    await MobileService.GetPush().RegisterNativeAsync(channel.Uri, null);
}

WNS ' a itiediyorsanız bir Microsoft Store paketi SID 'si EDINMENIZgerekir. Şablon kayıtlarına kaydolma da dahil olmak üzere Windows uygulamaları hakkında daha fazla bilgi için bkz. uygulamanıza anında iletme bildirimleri ekleme.

İstemciden etiket isteme desteklenmiyor. Etiket Istekleri kayıttan sessizce kesilir. Cihazınızı etiketlere kaydetmek isterseniz, kayıt işlemini gerçekleştirmek için Notification Hubs API 'sini kullanan özel bir API oluşturun. Yöntemi yerine özel API 'YI çağırın RegisterNativeAsync() .

Nasıl yapılır: Microsoft Store paketi SID 'SI edinme

Microsoft Store uygulamalarda anında iletme bildirimlerini etkinleştirmek için bir paket SID 'SI gerekir. Bir paket SID 'SI almak için, Microsoft Store uygulamanızı kaydedin.

Bu değeri elde etmek için:

  1. Visual Studio Çözüm Gezgini Microsoft Store uygulama projesine sağ tıklayın, > uygulamayı mağaza ile ilişkilendir... öğesine tıklayın.
  2. Sihirbazda, İleri ' ye tıklayın, Microsoft hesabı ile oturum açın, Yeni bir uygulama adı ayırarak uygulamanız için bir ad yazın ve ardından Ayır ' a tıklayın.
  3. Uygulama kaydı başarıyla oluşturulduktan sonra uygulama adını seçin, İleri ' ye tıklayın ve ardından ilişkilendir ' e tıklayın.
  4. Microsoft hesabınızı kullanarak Windows Geliştirme Merkezi ' nde oturum açın. Uygulamalarım altında oluşturduğunuz uygulama kaydına tıklayın.
  5. Uygulama yönetimi > uygulama kimliği ' ne tıklayın ve ardından aşağı kaydırarak paket SID 'nizi bulun.

Paket SID 'sinin birçok kullanımı, bunu bir URI olarak değerlendirir ve bu durumda, şema olarak MS-App:// kullanmanız gerekir. Bu değeri bir ön ek olarak birleştirerek, paket SID 'sinin oluşturulmuş sürümünü unutmayın.

Xamarin uygulamaları, iOS veya Android platformlarında çalışan bir uygulamayı kaydedebilmek için bazı ek kodlar gerektirir. Daha fazla bilgi için platformunuzun konusuna bakın:

Nasıl yapılır: platformlar arası bildirimler göndermek için gönderme şablonlarını kaydetme

Şablonları kaydetmek için RegisterAsync() aşağıdaki gibi şablonlarla birlikte yöntemi kullanın:

JObject templates = myTemplates();
MobileService.GetPush().RegisterAsync(channel.Uri, templates);

Şablonlarınız türler olmalıdır JObject ve AŞAĞıDAKI JSON biçiminde birden çok şablon içerebilir:

public JObject myTemplates()
{
    // single template for Windows Notification Service toast
    var template = "<toast><visual><binding template=\"ToastText01\"><text id=\"1\">$(message)</text></binding></visual></toast>";

    var templates = new JObject
    {
        ["generic-message"] = new JObject
        {
            ["body"] = template,
            ["headers"] = new JObject
            {
                ["X-WNS-Type"] = "wns/toast"
            },
            ["tags"] = new JArray()
        },
        ["more-templates"] = new JObject {...}
    };
    return templates;
}

RegisterAsync () yöntemi de ikincil kutucukları kabul eder:

MobileService.GetPush().RegisterAsync(string channelUri, JObject templates, JObject secondaryTiles);

Güvenlik için kayıt sırasında tüm Etiketler kaldırılır. Yüklemeler içindeki yüklemelere veya şablonlara Etiketler eklemek için, bkz. [Azure için .NET arka uç sunucu SDK 'Sı ile çalışma Mobile Apps].

Bu kayıtlı şablonların kullanılmasıyla bildirim göndermek için [Notification Hubs API 'lerine]bakın.

Çeşitli konular

Nasıl yapılır: hataları Işleme

Arka uçta bir hata oluştuğunda, istemci SDK 'Sı oluşturur MobileServiceInvalidOperationException . Aşağıdaki örnek, arka uç tarafından döndürülen bir özel durumun nasıl işleneceğini göstermektedir:

private async void InsertTodoItem(TodoItem todoItem)
{
    // This code inserts a new TodoItem into the database. When the operation completes
    // and App Service has assigned an Id, the item is added to the CollectionView
    try
    {
        await todoTable.InsertAsync(todoItem);
        items.Add(todoItem);
    }
    catch (MobileServiceInvalidOperationException e)
    {
        // Handle error
    }
}

Hata koşulları ile ilgilenme ile ilgili başka bir örnek [Mobile Apps Files örneğinde]bulunabilir. Logginghandler örneği, arka uca yapılan istekleri günlüğe kaydetmek için bir günlüğe kaydetme temsilci işleyicisi sağlar.

Nasıl yapılır: istek üstbilgilerini özelleştirme

Belirli uygulama senaryonuzu desteklemek için, mobil uygulama arka ucu ile iletişimi özelleştirmeniz gerekebilir. Örneğin, her giden isteğe özel bir üst bilgi eklemek ve hatta yanıt durum kodlarını değiştirmek isteyebilirsiniz. Aşağıdaki örnekte olduğu gibi özel bir DelegatingHandlerkullanabilirsiniz:

public async Task CallClientWithHandler()
{
    MobileServiceClient client = new MobileServiceClient("AppUrl", new MyHandler());
    IMobileServiceTable<TodoItem> todoTable = client.GetTable<TodoItem>();
    var newItem = new TodoItem { Text = "Hello world", Complete = false };
    await todoTable.InsertAsync(newItem);
}

public class MyHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage>
        SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // Change the request-side here based on the HttpRequestMessage
        request.Headers.Add("x-my-header", "my value");

        // Do the request
        var response = await base.SendAsync(request, cancellationToken);

        // Change the response-side here based on the HttpResponseMessage

        // Return the modified response
        return response;
    }
}