تمكين المزامنة في وضع عدم الاتصال لتطبيق Xamarin.iOS للجوال

نظرة عامة

يقدم هذا البرنامج التعليمي ميزة المزامنة دون اتصال بالإنترنت في Azure Mobile Apps for Xamarin.iOS. تسمح المزامنة في وضع عدم الاتصال للمستخدمين النهائيين بالتفاعل مع تطبيق جوال - عرض البيانات أو إضافتها أو تعديلها - حتى في حالة عدم وجود اتصال بالشبكة. يتم تخزين التغييرات في قاعدة بيانات محلية. بمجرد عودة الجهاز إلى الاتصال بالإنترنت، تتم مزامنة هذه التغييرات مع الخدمة عن بعد.

في هذا البرنامج التعليمي، قم بتحديث مشروع تطبيق Xamarin.iOS من إنشاء تطبيق Xamarin iOS لدعم الميزات غير المتصلة بالإنترنت لتطبيقات Azure للأجهزة المحمولة. إذا لم تستخدم مشروع خادم البدء السريع الذي تم تنزيله، فيجب إضافة حزم ملحق الوصول إلى البيانات إلى مشروعك. لمزيد من المعلومات حول حزم ملحقات الخادم، راجع العمل مع حزمة SDK لخادم الواجهة الخلفية .NET لتطبيقات Azure للأجهزة المحمولة.

لمعرفة المزيد حول ميزة المزامنة دون اتصال، راجع الموضوع مزامنة البيانات دون اتصال في Azure Mobile Apps.

تحديث تطبيق العميل لدعم الميزات غير المتصلة بالإنترنت

تتيح لك ميزات Azure Mobile App غير المتصلة بالإنترنت التفاعل مع قاعدة بيانات محلية عندما تكون في سيناريو غير متصل بالإنترنت. لاستخدام هذه الميزات في تطبيقك، قم بتهيئة SyncContext إلى متجر محلي. راجع جدولك من خلال واجهة [iObileServiceSyncTable]. يتم استخدام SQLite كمتجر محلي على الجهاز.

  1. افتح مدير حزم NuGet في المشروع الذي أكملته في البرنامج التعليمي لإنشاء تطبيق Xamarin iOS، ثم ابحث عن حزمة Microsoft.Azure.Mobile.Client.SQLiteStore NuGet وقم بتثبيتها.
  2. افتح ملف QSTodoService.cs وقم بإلغاء التعليق على التعريف #define OFFLINE_SYNC_ENABLED .
  3. أعد إنشاء تطبيق العميل وتشغيله. يعمل التطبيق بنفس الطريقة التي كان يعمل بها قبل تمكين المزامنة في وضع عدم الاتصال. ومع ذلك، يتم الآن تعبئة قاعدة البيانات المحلية بالبيانات التي يمكن استخدامها في سيناريو غير متصل.

تحديث التطبيق لقطع الاتصال بالواجهة الخلفية

في هذا القسم، يمكنك قطع الاتصال بالواجهة الخلفية لتطبيق الجوال لمحاكاة موقف غير متصل بالإنترنت. عند إضافة عناصر بيانات، يخبرك معالج الاستثناءات بأن التطبيق في وضع عدم الاتصال. في هذه الحالة، تتم إضافة عناصر جديدة في المتجر المحلي وسيتم مزامنتها مع الواجهة الخلفية لتطبيق الجوال عند تشغيل الدفع التالي في حالة متصلة.

  1. تحرير QSToDoService.cs في المشروع المشترك. تغيير عنوان URL للتطبيق للإشارة إلى عنوان URL غير صالح:

      const string applicationURL = @"https://your-service.azurewebsites.fail";
    

    يمكنك أيضا إظهار السلوك في وضع عدم الاتصال عن طريق تعطيل شبكة wifi والشبكات الخلوية على الجهاز أو استخدام وضع الطائرة.

  2. قم بإنشاء التطبيق وتشغيله. لاحظ فشل المزامنة عند التحديث عند تشغيل التطبيق.

  3. أدخل عناصر جديدة ولاحظ فشل الدفع بحالة [CancelledByNetworkError] في كل مرة تنقر فيها فوق حفظ. ومع ذلك ، توجد عناصر todo الجديدة في المتجر المحلي حتى يمكن دفعها إلى الواجهة الخلفية لتطبيق الجوال. في تطبيق إنتاج، إذا قمت بمنع هذه الاستثناءات، فسيتصرف تطبيق العميل كما لو كان لا يزال متصلا بالواجهة الخلفية لتطبيق الجوال.

  4. أغلق التطبيق وأعد تشغيله للتحقق من استمرار العناصر الجديدة التي أنشأتها في المتجر المحلي.

  5. (اختياري) إذا كان لديك Visual Studio مثبتا على جهاز كمبيوتر، فافتح "مستكشف الخادم". انتقل إلى قاعدة البيانات الخاصة بك في قواعد بياناتAzure-SQL>. انقر بزر الماوس الأيمن فوق قاعدة البيانات وحدد فتح في SQL Server مستكشف الكائنات. يمكنك الآن الاستعراض للوصول إلى جدول قاعدة بيانات SQL ومحتوياته. تحقق من عدم تغيير البيانات الموجودة في قاعدة البيانات الخلفية.

  6. (اختياري) استخدم أداة REST مثل Fiddler أو Postman للاستعلام عن الواجهة الخلفية للجوال ، باستخدام استعلام GET في النموذج https://<your-mobile-app-backend-name>.azurewebsites.net/tables/TodoItem.

قم بتحديث التطبيق لإعادة توصيل الواجهة الخلفية لتطبيق الجوال

في هذا القسم، أعد توصيل التطبيق بالواجهة الخلفية لتطبيق الجوال. هذا يحاكي التطبيق الانتقال من حالة عدم الاتصال إلى حالة متصل بالإنترنت مع الواجهة الخلفية لتطبيق الجوال. إذا قمت بمحاكاة انقطاع الشبكة عن طريق إيقاف تشغيل اتصال الشبكة، فلن تكون هناك حاجة إلى تغييرات التعليمات البرمجية. قم بتشغيل الشبكة مرة أخرى. عند تشغيل التطبيق لأول مرة، RefreshDataAsync يتم استدعاء الطريقة. وهذا بدوره يستدعي SyncAsync مزامنة متجرك المحلي مع قاعدة البيانات الخلفية.

  1. افتح QSToDoService.cs في المشروع المشترك، وقم بإرجاع التغيير الذي أجريته على خاصية عنوان URL للتطبيق .

  2. أعد إنشاء التطبيق وتشغيله. يقوم التطبيق بمزامنة التغييرات المحلية مع الواجهة الخلفية لتطبيق Azure Mobile App باستخدام عمليات الدفع والسحب عند OnRefreshItemsSelected تنفيذ الطريقة.

  3. (اختياري) عرض البيانات المحدثة باستخدام إما مستكشف الكائنات SQL Server أو أداة REST مثل Fiddler. لاحظ أنه تمت مزامنة البيانات بين قاعدة بيانات الواجهة الخلفية لتطبيق Azure Mobile App والمتجر المحلي.

  4. في التطبيق، انقر فوق خانة الاختيار الموجودة بجانب بعض العناصر لإكمالها في المتجر المحلي.

    CompleteItemAsync مكالمات SyncAsync لمزامنة كل عنصر مكتمل مع الواجهة الخلفية لتطبيق الجوال. SyncAsync يدعو كل من الدفع والسحب. كلما قمت بتنفيذ سحب مقابل جدول قام العميل بإجراء تغييرات عليه، يتم دائما تنفيذ دفعة على سياق مزامنة العميل أولا تلقائيا. يضمن الدفع الضمني بقاء جميع الجداول في المتجر المحلي إلى جانب العلاقات متسقة. لمزيد من المعلومات حول هذا السلوك، راجع مزامنة البيانات دون اتصال في Azure Mobile Apps.

مراجعة رمز مزامنة العميل

مشروع عميل Xamarin الذي قمت بتنزيله عند الانتهاء من البرنامج التعليمي إنشاء تطبيق Xamarin iOS يحتوي بالفعل على تعليمات برمجية تدعم المزامنة في وضع عدم الاتصال باستخدام قاعدة بيانات SQLite محلية. فيما يلي نظرة عامة موجزة على ما تم تضمينه بالفعل في رمز البرنامج التعليمي. للحصول على نظرة عامة مفاهيمية حول الميزة، راجع مزامنة البيانات دون اتصال في Azure Mobile Apps.

  • قبل إجراء أي عمليات جدول، يجب تهيئة المتجر المحلي. تتم تهيئة قاعدة بيانات المتجر المحلي عند QSTodoListViewController.ViewDidLoad() التنفيذ QSTodoService.InitializeStoreAsync(). تقوم هذه الطريقة بإنشاء قاعدة بيانات SQLite محلية جديدة باستخدام الفئة التي MobileServiceSQLiteStore توفرها حزمة SDK لعميل Azure Mobile App.

    تقوم DefineTable الطريقة بإنشاء جدول في المتجر المحلي يطابق الحقول في النوع المتوفر، ToDoItem في هذه الحالة. لا يلزم أن يتضمن النوع كافة الأعمدة الموجودة في قاعدة البيانات البعيدة. من الممكن تخزين مجموعة فرعية فقط من الأعمدة.

      // QSTodoService.cs
    
      public async Task InitializeStoreAsync()
      {
          var store = new MobileServiceSQLiteStore(localDbPath);
          store.DefineTable<ToDoItem>();
    
          // Uses the default conflict handler, which fails on conflict
          await client.SyncContext.InitializeAsync(store);
      }
    
  • todoTable عضو من QSTodoService النوع IMobileServiceSyncTable بدلا من IMobileServiceTable. يقوم IMobileServiceSyncTable بتوجيه كافة عمليات إنشاء وقراءة وتحديث وحذف جدول (CRUD) إلى قاعدة بيانات المتجر المحلي.

    يمكنك تحديد متى يتم دفع هذه التغييرات إلى الواجهة الخلفية لتطبيق Azure Mobile عن طريق الاتصال IMobileServiceSyncContext.PushAsync(). يساعد سياق المزامنة في الحفاظ على علاقات الجداول من خلال تعقب التغييرات ودفعها في جميع الجداول التي قام تطبيق العميل بتعديلها عند PushAsync استدعائها.

    يستدعي QSTodoService.SyncAsync() الرمز المقدم المزامنة كلما تم تحديث قائمة todoitem أو تمت إضافة todoitem أو إكماله. تتم مزامنة التطبيق بعد كل تغيير محلي. إذا تم تنفيذ سحب مقابل جدول يحتوي على تحديثات محلية معلقة يتم تعقبها بواسطة السياق، فستقوم عملية السحب هذه تلقائيا بتشغيل دفعة السياق أولا.

    في التعليمة البرمجية المقدمة ، يتم الاستعلام عن جميع السجلات الموجودة في الجدول البعيد TodoItem ، ولكن من الممكن أيضا تصفية السجلات عن طريق تمرير معرف استعلام واستعلام إلى PushAsync. لمزيد من المعلومات، راجع القسم المزامنة التزايدية في مزامنة البيانات دون اتصال في تطبيقات Azure للأجهزة المحمولة.

      // QSTodoService.cs
      public async Task SyncAsync()
      {
          try
          {
              await client.SyncContext.PushAsync();
              await todoTable.PullAsync("allTodoItems", todoTable.CreateQuery()); // query ID is used for incremental sync
          }
    
          catch (MobileServiceInvalidOperationException e)
          {
              Console.Error.WriteLine(@"Sync Failed: {0}", e.Message);
          }
      }
    

الموارد الإضافية