iOS mobil uygulamalarıyla çevrimdışı eşitlemeyi etkinleştirme

Genel Bakış

Bu öğretici, iOS için Azure App Service Mobile Apps özelliğiyle çevrimdışı eşitlemeyi kapsar. Çevrimdışı eşitleme ile son kullanıcılar, ağ bağlantısı olmasa bile verileri görüntülemek, eklemek veya değiştirmek için bir mobil uygulamayla etkileşimde bulunabilir. Değişiklikler yerel veritabanında depolanır. Cihaz yeniden çevrimiçi olduktan sonra, değişiklikler uzak arka uçla eşitlenir.

Mobile Apps ile ilk deneyiminiz buysa, önce iOS Uygulaması Oluşturma öğreticisini tamamlamanız gerekir. İndirilen hızlı başlangıç sunucu projesini kullanmıyorsanız, veri erişim uzantısı paketlerini projenize eklemeniz gerekir. Sunucu uzantısı paketleri hakkında daha fazla bilgi için bkz . Azure Mobile Apps için .NET arka uç sunucu SDK'sı ile çalışma.

Çevrimdışı eşitleme özelliği hakkında daha fazla bilgi edinmek için bkz. Mobile Apps'te Çevrimdışı Veri Eşitleme.

İstemci eşitleme kodunu gözden geçirme

iOS Uygulaması Oluşturma öğreticisi için indirdiğiniz istemci projesi, yerel Çekirdek Veri tabanlı veritabanı kullanarak çevrimdışı eşitlemeyi destekleyen kodu zaten içeriyor. Bu bölümde, öğretici kodunda zaten bulunanlar özetlenmiştir. Özelliğe kavramsal bir genel bakış için bkz. Mobile Apps'te Çevrimdışı Veri Eşitleme.

Mobile Apps'in çevrimdışı veri eşitleme özelliğini kullanan son kullanıcılar, ağa erişilemediğinde bile yerel veritabanıyla etkileşime geçebilir. Bu özellikleri uygulamanızda kullanmak için eşitleme bağlamını MSClient başlatır ve yerel bir depoya başvurursunuz. Ardından MSSyncTable arabirimi aracılığıyla tablonuza başvurursunuz.

QSTodoService.m (Objective-C) veya ToDoTableViewController.swift (Swift) içinde, üye syncTable türünün MSSyncTable olduğuna dikkat edin. Çevrimdışı eşitleme , MSTable yerine bu eşitleme tablosu arabirimini kullanır. Eşitleme tablosu kullanıldığında, tüm işlemler yerel depoya gider ve açık gönderme ve çekme işlemleriyle yalnızca uzak arka uçla eşitlenir.

Bir eşitleme tablosuna başvuru almak için üzerinde MSClientsyncTableWithName yöntemini kullanın. Çevrimdışı eşitleme işlevini kaldırmak için bunun yerine tableWithName kullanın.

Herhangi bir tablo işleminin gerçekleştirilebilmesi için önce yerel deponun başlatılması gerekir. İlgili kod şu şekildedir:

  • Objective-C. QSTodoService.init yönteminde:

    MSCoreDataStore *store = [[MSCoreDataStore alloc] initWithManagedObjectContext:context];
    self.client.syncContext = [[MSSyncContext alloc] initWithDelegate:nil dataSource:store callback:nil];
    
  • Hızlı. ToDoTableViewController.viewDidLoad yönteminde:

    let client = MSClient(applicationURLString: "http:// ...") // URI of the Mobile App
    let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!
    self.store = MSCoreDataStore(managedObjectContext: managedObjectContext)
    client.syncContext = MSSyncContext(delegate: nil, dataSource: self.store, callback: nil)
    

    Bu yöntem, Mobile Apps SDK'sının MSCoreDataStore sağladığı arabirimini kullanarak yerel bir depo oluşturur. Alternatif olarak, protokolü uygulayarak MSSyncContextDataSource farklı bir yerel depo sağlayabilirsiniz. Ayrıca, bir çakışma işleyicisi belirtmek için MSSyncContext'in ilk parametresi kullanılır. 'yi geçtiğimiz niliçin, herhangi bir çakışmada başarısız olan varsayılan çakışma işleyicisini alacağız.

Şimdi gerçek eşitleme işlemini gerçekleştirelim ve uzak arka uçtan veri alalım:

  • Objective-C. syncData önce yeni değişiklikler gönderir ve ardından uzak arka uçtan veri almak için pullData çağrısında bulunur. Buna karşılık pullData yöntemi bir sorguyla eşleşen yeni verileri alır:

    -(void)syncData:(QSCompletionBlock)completion
    {
         // Push all changes in the sync context, and then pull new data.
         [self.client.syncContext pushWithCompletion:^(NSError *error) {
             [self logErrorIfNotNil:error];
             [self pullData:completion];
         }];
    }
    
    -(void)pullData:(QSCompletionBlock)completion
    {
         MSQuery *query = [self.syncTable query];
    
         // Pulls data from the remote server into the local table.
         // We're pulling all items and filtering in the view.
         // Query ID is used for incremental sync.
         [self.syncTable pullWithQuery:query queryId:@"allTodoItems" completion:^(NSError *error) {
             [self logErrorIfNotNil:error];
    
             // Lets the caller know that we have finished.
             if (completion != nil) {
                 dispatch_async(dispatch_get_main_queue(), completion);
             }
         }];
    }
    
  • Swift:

    func onRefresh(sender: UIRefreshControl!) {
        UIApplication.sharedApplication().networkActivityIndicatorVisible = true
    
        self.table!.pullWithQuery(self.table?.query(), queryId: "AllRecords") {
            (error) -> Void in
    
            UIApplication.sharedApplication().networkActivityIndicatorVisible = false
    
            if error != nil {
                // A real application would handle various errors like network conditions,
                // server conflicts, etc. via the MSSyncContextDelegate
                print("Error: \(error!.description)")
    
                // We will discard our changes and keep the server's copy for simplicity
                if let opErrors = error!.userInfo[MSErrorPushResultKey] as? Array<MSTableOperationError> {
                    for opError in opErrors {
                        print("Attempted operation to item \(opError.itemId)")
                        if (opError.operation == .Insert || opError.operation == .Delete) {
                            print("Insert/Delete, failed discarding changes")
                            opError.cancelOperationAndDiscardItemWithCompletion(nil)
                        } else {
                            print("Update failed, reverting to server's copy")
                            opError.cancelOperationAndUpdateItem(opError.serverItem!, completion: nil)
                        }
                    }
                }
            }
            self.refreshControl?.endRefreshing()
        }
    }
    

Objective-C sürümünde, syncDatailk olarak eşitleme bağlamında pushWithCompletion'ı çağırırız. Bu yöntem, değişiklikleri tüm tablolara gönderdiğinden bir üyesidir MSSyncContext (eşitleme tablosunun kendisi değildir). Yalnızca yerel olarak (CUD işlemleri aracılığıyla) bir şekilde değiştirilmiş kayıtlar sunucuya gönderilir. Ardından, uzak verileri almak ve yerel veritabanında depolamak için MSSyncTable.pullWithQuery'yi çağıran pullData yardımcısı çağrılır.

Swift sürümünde, gönderme işlemi kesinlikle gerekli olmadığından pushWithCompletion çağrısı yoktur. Gönderme işlemi yapan tablonun eşitleme bağlamında bekleyen değişiklikler varsa, çekme işlemi her zaman önce bir gönderim gerçekleştirir. Ancak, birden fazla eşitleme tablonuz varsa, her şeyin ilgili tablolar arasında tutarlı olduğundan emin olmak için push'ı açıkça çağırmak en iyisidir.

Objective-C ve Swift sürümlerinde, almak istediğiniz kayıtları filtrelemek üzere bir sorgu belirtmek için pullWithQuery yöntemini kullanabilirsiniz. Bu örnekte sorgu, uzak TodoItem tablodaki tüm kayıtları alır.

pullWithQuery'nin ikinci parametresi, artımlı eşitleme için kullanılan bir sorgu kimliğidir. Artımlı eşitleme, kaydın zaman damgasını kullanarak (yerel depoda çağrılırupdatedAt) yalnızca son eşitlemeden sonra değiştirilmiş olan kayıtları UpdatedAt alır. Sorgu kimliği, uygulamanızdaki her mantıksal sorgu için benzersiz olan açıklayıcı bir dize olmalıdır. Artımlı eşitlemeyi geri çevirmek için sorgu kimliği olarak geçirin nil . Her çekme işlemindeki tüm kayıtları aldığından bu yaklaşım verimsiz olabilir.

Objective-C uygulaması, verileri değiştirdiğinizde veya eklediğinizde, kullanıcı yenileme hareketini gerçekleştirdiğinde ve başlatıldığında eşitlenir.

Kullanıcı yenileme hareketini gerçekleştirdiğinde ve başlatıldığında Swift uygulaması eşitlenir.

Uygulama, veriler her değiştirildiğinde (Objective-C) veya uygulama her başlatıldığında (Objective-C ve Swift) eşitlendiğinden, uygulama kullanıcının çevrimiçi olduğunu varsayar. Sonraki bir bölümde, kullanıcıların çevrimdışıyken bile düzenleyebilmeleri için uygulamayı güncelleştireceksiniz.

Çekirdek Veri modelini gözden geçirme

Çekirdek Veriler çevrimdışı depoyu kullandığınızda, veri modelinizde belirli tabloları ve alanları tanımlamanız gerekir. Örnek uygulama zaten doğru biçime sahip bir veri modeli içeriyor. Bu bölümde, nasıl kullanıldıklarını göstermek için bu tabloları inceleyeceğiz.

QSDataModel.xcdatamodeld dosyasını açın. Dört tablo tanımlanır: SDK tarafından kullanılan üç tablo ve yapılacaklar öğelerinin kendileri için kullanılan bir tablo:

  • MS_TableOperations: Sunucuyla eşitlenmesi gereken öğeleri izler.
  • MS_TableOperationErrors: Çevrimdışı eşitleme sırasında oluşan hataları izler.
  • MS_TableConfig: Tüm çekme işlemleri için son eşitleme işlemi için son güncelleştirme zamanını izler.
  • TodoItem: Yapılacaklar öğelerini depolar. CreatedAt, updatedAt ve version sistem sütunları isteğe bağlı sistem özellikleridir.

Not

Mobile Apps SDK'sı "``" ile başlayan sütun adlarını ayırır. Bu ön eki sistem sütunları dışında hiçbir şeyle kullanmayın. Aksi takdirde, uzak arka ucu kullandığınızda sütun adlarınız değiştirilir.

Çevrimdışı eşitleme özelliğini kullandığınızda, üç sistem tablosunu ve veri tablosunu tanımlayın.

Sistem tabloları

MS_TableOperations

Tablo özniteliklerini MS_TableOperations

Öznitelik Tür
kimlik Tamsayı 64
ıtemıd Dize
properties İkili Veriler
tablo Dize
tableKind Tamsayı 16

MS_TableOperationErrors

Tablo özniteliklerini MS_TableOperationErrors

Öznitelik Tür
kimlik Dize
operationId Tamsayı 64
properties İkili Veriler
tableKind Tamsayı 16

MS_TableConfig

Öznitelik Tür
kimlik Dize
anahtar Dize
Keytype Tamsayı 64
tablo Dize
değer Dize

Veri tablosu

TodoItem

Öznitelik Tür Not
kimlik Dize, gerekli olarak işaretlendi Uzak depodaki birincil anahtar
tamamlama Boole Yapılacaklar öğesi alanı
metin Dize Yapılacaklar öğesi alanı
createdAt Tarih (isteğe bağlı) CreatedAt sistem özelliğiyle eşler
updatedAt Tarih (isteğe bağlı) UpdatedAt sistem özelliğiyle eşler
sürüm Dize (isteğe bağlı) Çakışmaları algılamak için kullanılır, sürüme eşler

Uygulamanın eşitleme davranışını değiştirme

Bu bölümde, uygulamayı uygulama başlatıldığında veya öğeleri ekleyip güncelleştirdiğinizde eşitlenmemesi için değiştirirsiniz. Yalnızca yenileme hareketi düğmesi gerçekleştirildiğinde eşitlenir.

Objective-C:

  1. QSTodoListViewController.m dosyasında viewDidLoad yöntemini değiştirerek yönteminin sonundaki çağrısını [self refresh] kaldırın. Artık veriler uygulama başlangıcında sunucuyla eşitlenmez. Bunun yerine, yerel mağazanın içeriğiyle eşitlenir.

  2. QSTodoService.m dosyasında öğesinin tanımınıaddItem, öğe eklendikten sonra eşitlenmeyecek şekilde değiştirin. self syncData Bloğu kaldırın ve aşağıdakilerle değiştirin:

    if (completion != nil) {
        dispatch_async(dispatch_get_main_queue(), completion);
    }
    
  3. tanımını completeItem daha önce belirtildiği gibi değiştirin. için self syncData bloğunu kaldırın ve aşağıdakilerle değiştirin:

    if (completion != nil) {
        dispatch_async(dispatch_get_main_queue(), completion);
    }
    

Swift:

viewDidLoadiçinde, ToDoTableViewController.swift'te, uygulama başlangıcında eşitlemeyi durdurmak için burada gösterilen iki satıra açıklama ekleyin. Bu yazma sırasında Swift Todo uygulaması, birisi bir öğe eklediğinde veya tamamladığında hizmeti güncelleştirmez. Hizmeti yalnızca uygulama başlangıcında güncelleştirir.

self.refreshControl?.beginRefreshing()
self.onRefresh(self.refreshControl)

Uygulamayı test etme

Bu bölümde, çevrimdışı senaryo benzetimi yapmak için geçersiz bir URL'ye bağlanacaksınız. Veri öğeleri eklediğinizde, bunlar yerel Çekirdek Veri deposunda tutulur, ancak mobil uygulama arka ucuyla eşitlenmez.

  1. QSTodoService.m içindeki mobil uygulama URL'sini geçersiz bir URL olarak değiştirin ve uygulamayı yeniden çalıştırın:

    Objective-C. QSTodoService.m dosyasında:

    self.client = [MSClient clientWithApplicationURLString:@"https://sitename.azurewebsites.net.fail"];
    

    Hızlı. ToDoTableViewController.swift dosyasında:

    let client = MSClient(applicationURLString: "https://sitename.azurewebsites.net.fail")
    
  2. Bazı yapılacaklar öğeleri ekleyin. Simülatörden çıkın (veya uygulamayı zorla kapatın) ve ardından yeniden başlatın. Değişikliklerinizin devam ettiğini doğrulayın.

  3. Uzak TodoItem tablosunun içeriğini görüntüleyin:

    • Node.js arka uç için Azure portal gidin ve mobil uygulama arka ucunuzda Kolay Tablolar>TodoItem öğesine tıklayın.
    • .NET arka ucu için SQL Server Management Studio gibi bir SQL aracı ya da Fiddler veya Postman gibi bir REST istemcisi kullanın.
  4. Yeni öğelerin sunucuyla eşitlenmediğini doğrulayın.

  5. QSTodoService.m'de URL'yi doğru url ile değiştirin ve uygulamayı yeniden çalıştırın.

  6. Öğe listesini aşağı çekerek yenileme hareketini gerçekleştirin.
    İlerleme döndürücü görüntülenir.

  7. TodoItem verilerini yeniden görüntüleyin. Yeni ve değiştirilmiş yapılacaklar öğeleri artık görüntülenmelidir.

Özet

Çevrimdışı eşitleme özelliğini desteklemek için arabirimini kullandık MSSyncTable ve yerel bir depoyla başlatıldık MSClient.syncContext . Bu durumda, yerel depo Çekirdek Veri tabanlı bir veritabanıdır.

Çekirdek Veri yerel deposu kullandığınızda , doğru sistem özelliklerine sahip birkaç tablo tanımlamanız gerekir.

Mobil uygulamalar için normal oluşturma, okuma, güncelleştirme ve silme (CRUD) işlemleri, uygulama hala bağlı gibi çalışır, ancak tüm işlemler yerel depoda gerçekleşir.

Yerel depoyu sunucuyla eşitlediğimizde MSSyncTable.pullWithQuery yöntemini kullandık.

Ek kaynaklar