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 MSClient
syncTableWithName 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ü uygulayarakMSSyncContextDataSource
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ğimiznil
iç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, syncData
ilk 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
Öznitelik | Tür |
---|---|
kimlik | Tamsayı 64 |
ıtemıd | Dize |
properties | İkili Veriler |
tablo | Dize |
tableKind | Tamsayı 16 |
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:
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.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); }
tanımını
completeItem
daha önce belirtildiği gibi değiştirin. içinself syncData
bloğunu kaldırın ve aşağıdakilerle değiştirin:if (completion != nil) { dispatch_async(dispatch_get_main_queue(), completion); }
Swift:
viewDidLoad
iç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.
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")
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.
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.
Yeni öğelerin sunucuyla eşitlenmediğini doğrulayın.
QSTodoService.m'de URL'yi doğru url ile değiştirin ve uygulamayı yeniden çalıştırın.
Öğe listesini aşağı çekerek yenileme hareketini gerçekleştirin.
İlerleme döndürücü görüntülenir.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
- Mobile Apps'te Çevrimdışı Veri Eşitleme
- Cloud Cover: Azure Mobile Services'da Çevrimdışı Eşitleme (Video Mobile Services hakkındadır, ancak Mobile Apps çevrimdışı eşitleme de benzer şekilde çalışır.)