Azure Mobile Apps için yönetilen istemci kullanma

Genel Bakış

Bu kılavuzda, Windows ve Xamarin uygulamaları için yönetilen istemci kitaplığını kullanarak yaygın Azure App Service Mobile Apps nasıl gerçekleştirebilirsiniz? Yeni bir Mobile Apps, önce Azure Mobile Apps hızlı başlangıç öğreticisi'Mobile Apps göz önünde bulundurabilirsiniz . Bu kılavuzda, istemci tarafı yönetilen SDK'ya odaklanın. Mobile Apps sunucu tarafı SDK'ları hakkında daha fazla bilgi edinmek için .NET Server SDK veyaNode.js Server SDK belgelerine bakın.

Başvuru belgeleri

İstemci SDK'sı için başvuru belgeleri burada bulunur: Azure Mobile Apps .NET istemci başvurusu. Ayrıca Azure-Samples hizmet deposunda birkaç istemci GitHub bulabilirsiniz.

Desteklenen Platformlar

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

  • API 19 ile 24 için Xamarin Android sürümü (KitKat- Noemat)
  • iOS 8.0 ve sonraki sürümleri için Xamarin iOS sürümleri
  • Evrensel Windows Platformu
  • Windows Phone 8.1
  • Windows Phone Silverlight uygulamaları dışında 8.0 sürümü

"Sunucu akışı" kimlik doğrulaması, sunulan kullanıcı arabirimi için bir WebView kullanır. Cihaz bir WebView kullanıcı arabirimi sunamayacaksa, diğer kimlik doğrulama yöntemleri gerekir. Bu nedenle bu SDK, İzleme türü veya benzer şekilde 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şturduğunuz ve yayımlamış olduğunu varsayalım. Bu konu başlığında kullanılan kodda tablosu adlandırılmıştır TodoItem ve şu sütunları içerir: Id, Textve Complete. Bu tablo, Azure hizmeti hızlı başlangıç tamamlandıktan sonra Mobile Apps tablodur.

C# içinde karşılık gelen türe karşılık gelen 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ı ile tablo alanı arasında PropertyName eşlemesini tanımlamak için kullanılır.

Arka uçta tablo oluşturma hakkında Mobile Apps için .NET Server SDK konusuna veyaNode.js Server SDK'sı konusuna bakın. Hızlı Başlangıç'ı kullanarak Mobil Uygulama arka Azure portal oluşturduysanız, uygulamanın Kolay tabloları ayarını da Azure portal.

Nasıl kurulur: Yönetilen istemci SDK paketini yükleme

Mobile Apps'den yönetilen istemci SDK paketini yüklemek için aşağıdaki yöntemlerden birini NuGet:

  • Visual Studio sağ tıklayın, NuGet Paketlerini Yönet'e tıklayın, paketi arayın Microsoft.Azure.Mobile.Client ve yükle'ye tıklayın.
  • Xamarin Studio Projenize sağ tıklayın, Ekleİleri>Ekle'NuGet Paket Ekle'ye tıklayın, paketi Microsoft.Azure.Mobile.Client arayın ve paket ekle'ye tıklayın.

Ana etkinlik dosyanıza aşağıdaki using deyimini 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 platformuna bağımlılığı vardır, dolayısıyla projeniz daha yeni destek paketleri kullanıyorsa çakışmaları önlemek için bu paketi gerekli sürümle doğrudan yüklemeniz gerekir.

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

Microsoft.Azure.Mobile ad alanı simgeleri SymbolSource'ta kullanılabilir. SembolKaynak ile sembol kaynaklarını tümleştirin ve bu yönergeleri Visual Studio.

Mobile Apps oluşturma

Aşağıdaki kod, Mobil Uygulama arka ucunıza erişmek için kullanılan MobileServiceClient nesnesini oluşturur.

var client = new MobileServiceClient("MOBILE_APP_URL");

Yukarıdaki kodda yerine Mobil MOBILE_APP_URL Uygulama arka ucu url'sini yazın. Bu URL, mobil uygulama arka ucundaki Mobil Uygulama arka ucu dikey penceresinde Azure portal. MobileServiceClient nesnesinin tek bir nesne olması gerekir.

Tablolarla çalışma

Aşağıdaki bölümde, tablodaki kayıtları arama ve alma ve verileri değiştirme adımları ayrıntılı olarak ele alın almaktadır. Aşağıdaki konular ele ele ve açıklamalarını içerir:

Nasıl olur: Tablo başvurusu oluşturma

Arka uç tablosunda verilere erişen veya bu verileri değiştiren tüm kodlar nesnesinde işlevleri MobileServiceTable çağırabilir. GetTable yöntemini 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ü alınmış serileştirme modelini kullanır. Türü belirlenemeyen bir serileştirme modeli de de desteklenmeli. Aşağıdaki örnek , türlanmamış bir tabloya başvuru oluşturur:

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

Yazlanmamış sorgularda, temel alınan OData sorgu dizesini belirtmeniz gerekir.

Nasıl kullanılır: Mobil Uygulamanıza veri sorgulama

Bu bölümde, aşağıdaki işlevleri içeren Mobil Uygulama arka ucuna nasıl sorgular verilir?

Not

Tüm satırların döndürüleni önlemek için sunucu odaklı sayfa boyutu zorunlu kılındı. Disk belleği, büyük veri kümeleri için varsayılan isteklerin hizmeti olumsuz etkilemelerini önler. 50'den fazla satır dönmek için, Sayfalardaki Skip verileri Take iade altında açıklandığı gibi ve yöntemini kullanın.

Nasıl kullanılır: Döndürülen verileri filtreleme

Aşağıdaki kod, bir sorguya yan tümcesi dahil etmek için verileri Where filtrelemeyi gösterir. özelliğine eşit olan todoTable tüm Complete öğeleri döndürür false. Where işlevi, tabloya karşı sorguya bir satır filtreleme predicate uygular.

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

Tarayıcı geliştirici araçları veya Fiddler gibi ileti inceleme yazılımını kullanarak arka sona gönderilen isteğin URI'lerini görüntüleyebilirsiniz. İstek URI'sini göz atarak sorgu dizesinin değiştirildiğinden dikkat değiştirilebilir:

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

Bu OData isteği, Sunucu SDK'SQL bir sorguya çevrilir:

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

yöntemine geçirilen işlevin Where rastgele sayıda koşulları 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ı SQL bir sorguya çevrilir:

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

Bu sorgu birden çok yan tümceye de ayrılabilirsiniz:

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

İki yöntem eşdeğerdir ve birbirinin yerine kullanılabilir. İlk seçenek olan tek bir sorguda birden fazla seçeneğin bir kez daha sıkıştırarak kullanılması önerilir.

yan Where tümcesi, OData alt kümesine çevrilen işlemleri destekler. İşlemler şunlardır:

  • İ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 belgelerinidüşü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. Alan tarafından Text artan düzende sıralanmış öğeleri todoTable döndürür.

// 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. Sorgu tarafından döndürülen toplam veri kümesinin belirli bir "sayfasını" istemek için Atla yöntemiyle birlikte kullanın Take . 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ğiadlı 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 todoItem edilmemelidir, 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);

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

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, todoItem üzerinde ayarlanan alan tarafından id tanımlanır.

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 null olur. Geçirilecek KIMLIK, çağrının sonucundan InsertAsync elde edilebilir. Alanı belirtmeden id bir öğeyi silmeye çalıştığınızda bir MobileServiceInvalidOperationException oluşturulur.

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, mobil uygulama arka ucunuzdaki her tablo için tanımlanan sistem özelliği sütununu kullanarak version her bir öğedeki değişiklikleri izleyerek iyimser eşzamanlılık denetimini destekler. Kayıt her güncelleştirildiği zaman, Mobile Apps bu kaydın özelliğini yeni bir değere ayarlar version . 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 version değerle yeniden yürütülüp yürütülmeyeceğine karar verebilir.

İyimser eşzamanlılık sağlamak için sistem özelliğine ait version 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, tablodaki bayrağını SystemProperties aşağıdaki gibi ayarlayarak Version iyimser eşzamanlılık sağlar.

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

İyimser eşzamanlılık etkinleştirmenin yanı sıra, UpdateAsyncçağrılırken kodunuzda özel durumu da yakalamalı MobileServicePreconditionFailedException<T> olması gerekir. Güncelleştirilmiş kayda doğru version uygulayarak çakışmayı çözün 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ışı Data Sync 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. Windows uygulamalarda aşağıdaki gibi kullanın MobileServiceIncrementalLoadingCollection :

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 ve IMobileServiceTable<T> üzerinde IMobileServiceTableQuery<T> uzantı yöntemlerini kullanın ToCollection . Verileri yüklemek için çağrısı LoadMoreItemsAsync() yapın.

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

Ya ToCollection da çağırarak ToCollectionAsync oluşturulan koleksiyonu KULLANDıĞıNıZDA, 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, çağrılarından LoadMoreItemsAsync kaynaklanan özel durumları işlemek üzere üzerindeki MobileServiceIncrementalLoadingCollection yöntemini geçersiz kılın OnException .

Tablonda çok fazla alan olup bu alanların yalnızca bir çoğunu denetiminde görüntülemek istiyor sanız düşünün. Kullanıcı arabiriminde görüntülenmek üzere belirli sütunları seçmek için önceki "Belirli sütunları seçme" bölümündeki kılavuzu kullanabilirsiniz.

Sayfa boyutunu değiştirme

Azure Mobile Apps, istek başına varsayılan olarak en fazla 50 öğe döndürür. Hem istemcide hem de sunucuda en büyük sayfa boyutunu artırarak sayfalama boyutunu değiştirebilirsiniz. İstenen sayfa boyutunu artırmak için kullanırken PullOptions belirtin PullAsync():

PullOptions pullOptions = new PullOptions
    {
        MaxPageSize = 100
    };

Sunucu içinde PageSize 100'e eşit veya 100'den büyük olduğunu varsayarak, bir istek en fazla 100 öğe döndürür.

Çevrimdışı Tablolarla Çalışma

Çevrimdışı tablolar, çevrimdışı olduğunda kullanmak üzere verileri depolamak için yerel bir SQLite deposu kullanır. Tüm tablo işlemleri uzak sunucu deposu yerine yerel SQLite deposuna karşı yapılır. Çevrimdışı tablo oluşturmak için önce projenizi hazırlayın:

  1. > Visual Studio Çözüm için NuGet Paketlerini Yönet... çözümüne sağ tıklayın, ardından çözümde yer alan tüm projeler için Microsoft.Azure.Mobile.Client.SQLiteStore NuGet paketini arayın ve yükleyin.

  2. (İsteğe bağlı) Diğer Windows desteklemek için aşağıdaki SQLite çalışma zamanı paketlerinden birini yükleyin:

  3. (İsteğe bağlı). Windows cihazlar için Başvurular > Başvuru Ekle... seçeneğine tıklayın, Windows> klasörü Uzantılar'ı genişletin, ardından Windows SDK için uygun SQLite'ı ve Windows SDK için Visual C++ 2013 Çalışma Zamanı'Windows etkinleştirin. SQLite SDK'sı adları her platforma göre Windows farklılık gösterir.

Tablo başvurusu oluşturulamadan önce yerel mağazanın hazır olması gerekir:

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

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

Depo başlatma normalde istemci oluşturulduktan hemen sonra yapılır. OfflineDbPath, desteklenen tüm platformlarda kullanmak için uygun bir dosya adı olması gerekir. Yol tam yol ise (eğik çizgiyle başlıyorsa) bu yol kullanılır. Yol tam olarak uygun değilse, dosya platforma özgü bir konuma yerleştirilir.

  • iOS ve Android cihazlar için varsayılan yol "Kişisel Dosyalar" klasörüdür.
  • Bu Windows için varsayılan yol uygulamaya özgü "AppData" klasörüdür.

Tablo başvurusu, yöntemi kullanılarak elde GetSyncTable<> edilir:

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

Çevrimdışı tablo kullanmak için kimlik doğrulamasına gerek yok. Yalnızca arka uç hizmetiyle iletişim kurarken kimlik doğrulaması gerekir.

Çevrimdışı Tabloyu Eşitleme

Çevrimdışı tablolar varsayılan olarak arka uç ile eşitlenmez. Eşitleme iki parçaya ayrılır. Değişiklikleri yeni öğeleri indirmeden ayrı olarak indirebilirsiniz. Tipik bir eşitleme yöntemi şöyledir:

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"]);
        }
    }
}

iç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ınır.

SDK, kayıtları çekmeden önce bir PushAsync() örtülü işlemi gerçekleştirir.

Çakışma işleme bir yöntemde PullAsync() gerçekleşir. Çakışmalarla çevrimiçi tablolarla aynı şekilde ilgilenebilirsiniz. Ekleme, güncelleştirme veya PullAsync() silme işlemi sırasında yerine çağrıldıklarda çakışma ortaya çıkar. Birden çok çakışma olursa, bunlar tek bir MobileServicePushFailedException içinde paket haline paketlenmiştir. Her bir hatayı ayrı ayrı işle.

Özel API ile çalışma

Özel API bir ekleme, güncelleştirme, silme veya okuma işlemiyle eşlemez sunucu işlevselliğini ortaya çıkaran özel uç noktalar tanımlamanızı sağlar. Özel BIR API kullanarak, HTTP ileti üst bilgilerini okuma ve ayarlama ve JSON dışında bir ileti gövdesi biçimi tanımlama da dahil olmak üzere mesajlaşma üzerinde daha fazla denetime sahip olabilirsiniz.

İstemcide InvokeApiAsync yöntemlerinden birini çağırarak özel bir API çağırırsınız. Örneğin, aşağıdaki kod satırı arka uçta completeAll API'sinde bir POST isteği gönderir:

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

Bu form türü türüne sahip bir yöntem çağrısıdır ve MarkAllResult dönüş türünün tanımlanmış olduğunu gerektirir. Hem türü hem de türü belirlenemeyen yöntemler de desteklene.

InvokeApiAsync() yöntemi, API '/' ile başlamadıkça çağırmak istediğiniz API'ye '/api/' ön ucu sağlar. Örnek:

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

InvokeApiAsync'i kullanarak Azure Mobile Apps ile tanımlanmamış WebAPI'ler de dahil olmak üzere herhangi bir WebAPI'Mobile Apps. InvokeApiAsync() kullanırsanız, kimlik doğrulama üst bilgileri de dahil olmak üzere uygun üst bilgiler istekle birlikte gönderilir.

Kullanıcıların kimliklerini doğrulama

Mobile Apps facebook, Google, Microsoft Hesabı, Twitter ve diğer dış kimlik sağlayıcılarını kullanarak uygulama kullanıcılarının kimliğini doğrulamayı ve yetkilendirmeyi Azure Active Directory. Belirli işlemlere erişimi yalnızca kimliği doğrulanmış kullanıcılarla kısıtlamak için tablolarda izinler oluşturabilirsiniz. Sunucu betikleri içinde 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ışı de destekler: 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 alan en basit kimlik doğrulama deneyimini sağlar. İstemci tarafından yönetilen akış, sağlayıcıya özgü cihaza özgü SDK'lere bağlı olduğu için cihaza özgü özelliklerle daha derin tümleştirmeye olanak sağlar.

Not

Üretim uygulamalarınıza istemci tarafından yönetilen bir akış kullanılması önerilir.

Kimlik doğrulamasını ayarlamak için, bir veya daha fazla kimlik sağlayıcısına uygulama kaydetmeniz gerekir. Kimlik sağlayıcısı, uygulamanıza bir istemci kimliği ve bir istemci gizli adı üretir. Bu değerler daha sonra kimlik doğrulaması/yetkilendirme için arka Azure App Service ayarlanır. Daha fazla bilgi için Uygulamanıza kimlik doğrulaması ekleme öğreticisinde verilen ayrıntılı yönergeleri izleyin.

Bu bölümde aşağıdaki konular ele almaktadır:

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

Uygulamanız kimlik sağlayıcısıyla bağımsız olarak iletişim kurarak arka ucuyla oturum açma sırasında döndürülen belirteci silebilir. Bu istemci akışı, kullanıcılar için çoklu oturum açma deneyimi sağlamanızı veya kimlik sağlayıcısından ek kullanıcı verileri amanızı sağlar. Kimlik sağlayıcısı SDK'sı daha yerel bir UX deneyimi sağladığı ve ek özelleştirmelere olanak sağladığı için istemci akışı kimlik doğrulaması sunucu akışı kullanmak için tercih edilir.

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

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

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

  1. Active Directory oturum açma için AAD yapılandırma öğreticisi'App Service için mobil uygulama arka ucu yapılandırma. Yerel istemci uygulamasını kaydetmenin isteğe bağlı adımını tamamlayın.

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

  3. Kullanmakta olduğu platforma göre aşağıdaki kodu uygulamanıza ekleyin. Her biri için aşağıdaki değiştirmeleri yapın:

    • INSERT-AUTHORITY-HERE yerine, uygulamanıza sağlanan kiracının adını yazın. Biçimi olmalıdır https://login.microsoftonline.com/contoso.onmicrosoft.com. Bu değer, etki alanındaki etki alanı Azure Active Directory kopya Azure portal.

    • INSERT-RESOURCE-ID-HERE yerine mobil uygulama arka ucun istemci kimliğini girin. İstemci kimliğini portalda oturum açma bilgileri altındakiGelişmiş Azure Active Directory Ayarlar edinebilirsiniz.

    • INSERT-CLIENT-ID-HERE yerine yerel istemci uygulamasından kopyalanan istemci kimliğini girin.

    • HTTPS şemasını kullanarak INSERT-REDIRECT-URI-HERE yerine sitenizin /.auth/login/done uç noktasını girin. Bu değer ile benzer bir değere sahip olması gerekir https://contoso.azurewebsites.net/.auth/login/done.

      Her platform için gereken kod aşağıdaki gibidir:

      Windows:

      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 Sign-On Google'dan belirteç kullanan tek bir uygulama

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ı kaydettiktan sonra, sağlayıcınızın MobileServiceAuthenticationProvider değeriyle [MobileServiceClient] üzerinde LoginAsync yöntemini arayın. Örneğin, aşağıdaki kod Facebook kullanarak bir sunucu akışı oturum açma başlatıyor.

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ğeriyle değiştirebilirsiniz.

Sunucu akışında, Azure App Service 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ı geri döndüğünde Azure App Service kimlik doğrulama belirteci App Service oluşturulur. LoginAsync yöntemi, JSON web belirteci (JWT) olarak hem kimliği doğrulanmış kullanıcının UserId'sini hem de MobileServiceAuthenticationToken kullanıcı adını sağlayan bir MobileServiceUser döndürür. Bu belirteç önbelleğe alınabilir süresi sona erene kadar yeniden kullanılabilir. Daha fazla bilgi için bkz. Önbelleğe Alma doğrulama belirteci.

Xamarin (Android veya iOS) kullanılırken Xamarin.Essentials WebAuthenticator kullanılır. Yöntemine varsayılan bağlamı (Android) veya UIViewController 'i (iOS) geçmeniz LoginAsync gerekir. Ayrıca, web kimlik doğrulayıcıdan dönüş işlemeniz gerekir. Android'de bu, içinde işleme:MainActivity.cs

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

iOS'ta bu, AppDelegate.cs':

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

Önbelleğe Alma doğrulama belirteci

Bazı durumlarda, sağlayıcıdan kimlik doğrulama belirteci depolayarak ilk başarılı kimlik doğrulamasından sonra oturum açma yöntemi çağrısı önilebilir. Microsoft Store ve UWP uygulamaları, başarılı bir oturum açma sonrasında geçerli kimlik doğrulama belirteci önbelleğe almak için PasswordVault'u aşağıdaki gibi 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 bilgilerinin UserName değeri olarak, belirteç ise Parola olarak depolanır. Sonraki başlangıçlarda, önbelleğe alınmış kimlik bilgileri için PasswordVault'a bakabilirsiniz. Aşağıdaki örnek, bulundukları zaman önbelleğe alınmış kimlik bilgilerini kullanır ve aksi takdirde arka uç ile yeniden kimlik doğrulaması girişiminde bulunur:

// 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 oturum açmasını tamamlarken depolanan kimlik bilgilerini de aşağıdaki gibi kaldırmanız gerekir:

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

Xamarin uygulamaları, kimlik bilgilerini bir Hesap nesnesinde güvenli bir şekilde depolamak için Xamarin.AuthAPI'lerini kullanır. Bu API'leri kullanma örneği için ContosoMoments fotoğraf paylaşım örneğinde AuthStore.cskod dosyasına bakın.

İstemci tarafından yönetilen kimlik doğrulamasını kullanıyorsanız, sağlayıcınızdan facebook veya Twitter gibi alınan erişim belirteci de önbelleğe alabilirsiniz. Bu belirteç, aşağıdaki gibi arka uçtan yeni bir kimlik doğrulama belirteci isteği için 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 İletme Bildirimleri

Aşağıdaki konular Anında Bildirimlerini içerir:

Nasıl yapılanlar: Anında Anında Bildirime Kaydolma

İstemci Mobile Apps, Azure Notification Hubs'a anında anında Notification Hubs. Kaydolarak platforma özgü Anında İ bildirim hizmeti (PNS) ile elde edilen tanıtıcıyı alırsınız. Ardından bu değeri, kaydı 7.000.000'den sonra tüm etiketlerle birlikte sağlar. Aşağıdaki kod, Windows Bildirim Hizmeti'ne (WNS) Windows anında Windows için uygulamalarınızı kaydedmektedir:

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'ye itmeye başladıysanız, SID paketi için Microsoft Store GEREKIR. Şablon kayıtlarına nasıl Windows dahil olmak üzere uygulamanıza ilişkin daha fazla bilgi için bkz. Uygulamanıza anında Windows bildirimleri ekleme.

İstemciden etiket isteği desteklenmiyor. Etiket İstekleri kayıttan sessizce bırakılır. Cihazınızı etiketlere kaydetmek isterseniz, kaydı sizin adına gerçekleştirmek için Notification Hubs API'sini kullanan bir Özel API oluşturun. yöntemi yerine Özel API'yi RegisterNativeAsync() çağırma.

Nasıl edilir: Bir Microsoft Store SID'si alma

Uygulama uygulamalarında anında Microsoft Store gereklidir. Bir paket SID'si almak için, uygulamalarınızı Microsoft Store.

Bu değeri elde etmek için:

  1. Bu Visual Studio Çözüm Gezgini uygulama projesine sağ tıklayın, Microsoft Store'a>tıklayınUyma ile Mağazayı Ekle... öğesini seçin.
  2. Sihirbazda, Sonraki'ye tıklayın, Microsoft hesabı için bir ad yazın, Yeni uygulama adı yedekle'ye ve ardından Yedekle'ye tıklayın.
  3. Uygulama kaydı başarıyla oluşturulduktan sonra uygulama adını seçin, Sonraki'ye ve ardından İş ortağı'ya tıklayın.
  4. Microsoft Hesabınızla Windows Geliştirme Merkezi oturum açın. Uygulamalarım altında, oluşturduğunuz uygulama kaydına tıklayın.
  5. Uygulama yönetimiApp>identity'ye tıklayın ve paket SID'nizi bulmak için aşağı kaydırın.

Paket SID'lerinin çoğu bunu bir URI olarak kullanır, bu durumda şema olarak ms-app:// gerekir. Bu değeri ön ek olarak bir arada kullanarak paket SID'nizin oluşturduğu sürümü not edin.

Xamarin uygulamaları, iOS veya Android platformlarında çalışan bir uygulamayı kaydetmek için bazı ek kodlar gerektirir. Daha fazla bilgi için platformunun konu başlığına bakın:

Nasıl yapılanlar: Platformlar arası bildirimler göndermek için anında gönderme şablonlarını kaydetme

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

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

Şablonlarınız tür 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 İkincil Kutucukları kabul eder:

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

Güvenlik kaydı sırasında tüm etiketler çıkarılmış olur. Yüklemeler içindeki yüklemelere veya şablonlara etiket eklemek için bkz. [Azure Mobile Apps için .NET arka uç sunucusu SDK'sı ile çalışma].

Bu kayıtlı şablonları kullanarak bildirim göndermek için Notification Hubs bakın.

Çeşitli Konular

Nasıl yapılanlar: Hataları işleme

Arka uçta bir hata oluştuğunda, istemci SDK'sı bir döndürür MobileServiceInvalidOperationException. Aşağıdaki örnek, arka uç tarafından döndürülen bir özel durumun nasıl işley olduğunu gösterir:

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ıyla ilgilenmeye başka bir örnek de Mobile Apps Örnek'te bulunabilir. LoggingHandler örneği, arka end'e yapılan istekleri günlüğe kaydetmeye bir günlük temsilcisi işleyicisi sağlar.

Nasıl yapılanlar: İstek üst bilgilerini özelleştirme

Belirli bir uygulama senaryosunu desteklemek için Mobil Uygulama arka ucuyla iletişimi özelleştirmeniz gerekir. Örneğin, her giden istek için özel bir üst bilgi eklemek, hatta yanıt durum kodlarını değiştirmek istiyor olabilirsiniz. Aşağıdaki örnekte olduğu gibi özel bir DelegatingHandler kullanabilirsiniz:

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;
    }
}