إضافة الإعلامات المنبثقة إلى تطبيق iOS

نظرة عامة

في هذا البرنامج التعليمي، يمكنك إضافة إعلامات الدفع إلى مشروع التشغيل السريع لنظام التشغيل iOS بحيث يتم إرسال إشعار دفع إلى الجهاز في كل مرة يتم فيها إدراج سجل.

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

لا يدعم جهاز محاكاة iOS الإعلامات المنبثقة. تحتاج إلى جهاز iOS فعلي وعضوية برنامج مطوري Apple.

تكوين مركز الإعلامات

تستخدم ميزة تطبيقات الأجهزة المحمولة في Azure App Service Azure Notification Hubs لإرسال الدفعات، لذلك ستقوم بتكوين مركز إعلام لتطبيق الأجهزة المحمولة.

  1. في مدخل Microsoft Azure، انتقل إلى App Services، ثم حدد النهاية الخلفية للتطبيق. ضمن الإعدادات، حدد دفع.

  2. لإضافة مورد مركز إعلام إلى التطبيق، حدد اتصال. يمكنك إما إنشاء مركز أو الاتصال بمركز موجود.

    تكوين مركز

لقد قمت الآن بتوصيل مركز إعلام بمشروع الخلفية لتطبيقات الأجهزة المحمولة. يمكنك لاحقا تكوين مركز الإعلامات هذا للاتصال بنظام إعلام النظام الأساسي (PNS) للدفع إلى الأجهزة.

تسجيل التطبيق للإعلامات المؤقتة

تكوين Azure لإرسال إعلامات الدفع

  1. على جهاز Mac، قم بتشغيل Keychain Access. على شريط التنقل الأيسر، ضمن Category، افتح My Certificates. ابحث عن شهادة SSL التي قمت بتنزيلها في القسم السابق، ثم قم بالكشف عن محتوياتها. حدد الشهادة فقط (لا تحدد المفتاح الخاص). ثم قم بتصديره.
  2. في مدخل Microsoft Azure، حدد Browse All>App Services. ثم حدد النهاية الخلفية لتطبيقات الأجهزة المحمولة.
  3. ضمن Settings، حدد App Service Push. ثم حدد اسم مركز الإعلامات.
  4. انتقل إلى Apple Push Notification Services>Upload Certificate. قم بتحميل ملف .p12، مع تحديد الوضع الصحيح (اعتمادا على ما إذا كانت شهادة SSL للعميل من السابق هي الإنتاج أو بيئة الاختبار المعزولة). احفظ أي تغييرات.

تم تكوين خدمتك الآن للعمل مع الإعلامات المؤقتة على iOS.

تحديث الخلفية لإرسال إعلامات الدفع

الواجهة الخلفية ل .NET (C#):

  1. في Visual Studio، انقر بزر الماوس الأيمن فوق مشروع الخادم وانقر فوق إدارة حزم NuGet، وابحث عن Microsoft.Azure.NotificationHubs، ثم انقر فوق تثبيت. يؤدي ذلك إلى تثبيت مكتبة مراكز الإعلامات لإرسال الإعلامات من الواجهة الخلفية.

  2. في مشروع Visual Studio للواجهة الخلفية، افتح Controllers>TodoItemController.cs. في أعلى الملف، أضف العبارة التالية using :

    using Microsoft.Azure.Mobile.Server.Config;
    using Microsoft.Azure.NotificationHubs;
    
  3. استبدل الأسلوب PostTodoItem بالتعليمات البرمجية التالية:

    public async Task<IHttpActionResult> PostTodoItem(TodoItem item)
    {
        TodoItem current = await InsertAsync(item);
        // Get the settings for the server project.
        HttpConfiguration config = this.Configuration;
    
        MobileAppSettingsDictionary settings = 
            this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();
    
        // Get the Notification Hubs credentials for the Mobile App.
        string notificationHubName = settings.NotificationHubName;
        string notificationHubConnection = settings
            .Connections[MobileAppSettingsKeys.NotificationHubConnectionString].ConnectionString;
    
        // Create a new Notification Hub client.
        NotificationHubClient hub = NotificationHubClient
        .CreateClientFromConnectionString(notificationHubConnection, notificationHubName);
    
        // iOS payload
        var appleNotificationPayload = "{\"aps\":{\"alert\":\"" + item.Text + "\"}}";
    
        try
        {
            // Send the push notification and log the results.
            var result = await hub.SendAppleNativeNotificationAsync(appleNotificationPayload);
    
            // Write the success result to the logs.
            config.Services.GetTraceWriter().Info(result.State.ToString());
        }
        catch (System.Exception ex)
        {
            // Write the failure result to the logs.
            config.Services.GetTraceWriter()
                .Error(ex.Message, null, "Push.SendAsync Error");
        }
        return CreatedAtRoute("Tables", new { id = current.Id }, current);
    }
    
  4. إعادة نشر مشروع الخادم.

Node.js الخلفية:

  1. إعداد مشروع الواجهة الخلفية.

  2. استبدل البرنامج النصي لجدول todoitem.js بالتعليمات البرمجية التالية:

    var azureMobileApps = require('azure-mobile-apps'),
        promises = require('azure-mobile-apps/src/utilities/promises'),
        logger = require('azure-mobile-apps/src/logger');
    
    var table = azureMobileApps.table();
    
    // When adding record, send a push notification via APNS
    table.insert(function (context) {
        // For details of the Notification Hubs JavaScript SDK, 
        // see https://aka.ms/nodejshubs
        logger.info('Running TodoItem.insert');
    
        // Create a payload that contains the new item Text.
        var payload = "{\"aps\":{\"alert\":\"" + context.item.text + "\"}}";
    
        // Execute the insert; Push as a post-execute action when results are returned as a Promise.
        return context.execute()
            .then(function (results) {
                // Only do the push if configured
                if (context.push) {
                    context.push.apns.send(null, payload, function (error) {
                        if (error) {
                            logger.error('Error while sending push notification: ', error);
                        } else {
                            logger.info('Push notification sent successfully!');
                        }
                    });
                }
                return results;
            })
            .catch(function (error) {
                logger.error('Error while running context.execute: ', error);
            });
    });
    
    module.exports = table;
    
  3. عند تحرير الملف على الكمبيوتر المحلي، أعد نشر مشروع الخادم.

إضافة الإعلامات المنبثقة إلى التطبيق

Objective-C:

  1. في QSAppDelegate.m، قم باستيراد iOS SDK وQSTodoService.h:

    #import <MicrosoftAzureMobile/MicrosoftAzureMobile.h>
    #import "QSTodoService.h"
    
  2. في didFinishLaunchingWithOptionsQSAppDelegate.m، قم بإدراج الأسطر التالية مباشرة قبل return YES;:

    UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
    
  3. في QSAppDelegate.m، أضف أساليب المعالج التالية. تم الآن تحديث تطبيقك لدعم الإعلامات المنبثقة.

    // Registration with APNs is successful
    - (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    
        QSTodoService *todoService = [QSTodoService defaultService];
        MSClient *client = todoService.client;
    
        [client.push registerDeviceToken:deviceToken completion:^(NSError *error) {
            if (error != nil) {
                NSLog(@"Error registering for notifications: %@", error);
            }
        }];
    }
    
    // Handle any failure to register
    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:
    (NSError *)error {
        NSLog(@"Failed to register for remote notifications: %@", error);
    }
    
    // Use userInfo in the payload to display an alert.
    - (void)application:(UIApplication *)application
            didReceiveRemoteNotification:(NSDictionary *)userInfo {
        NSLog(@"%@", userInfo);
    
        NSDictionary *apsPayload = userInfo[@"aps"];
        NSString *alertString = apsPayload[@"alert"];
    
        // Create alert with notification content.
        UIAlertController *alertController = [UIAlertController
                                        alertControllerWithTitle:@"Notification"
                                        message:alertString
                                        preferredStyle:UIAlertControllerStyleAlert];
    
        UIAlertAction *cancelAction = [UIAlertAction
                                        actionWithTitle:NSLocalizedString(@"Cancel", @"Cancel")
                                        style:UIAlertActionStyleCancel
                                        handler:^(UIAlertAction *action)
                                        {
                                            NSLog(@"Cancel");
                                        }];
    
        UIAlertAction *okAction = [UIAlertAction
                                    actionWithTitle:NSLocalizedString(@"OK", @"OK")
                                    style:UIAlertActionStyleDefault
                                    handler:^(UIAlertAction *action)
                                    {
                                        NSLog(@"OK");
                                    }];
    
        [alertController addAction:cancelAction];
        [alertController addAction:okAction];
    
        // Get current view controller.
        UIViewController *currentViewController = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
        while (currentViewController.presentedViewController)
        {
            currentViewController = currentViewController.presentedViewController;
        }
    
        // Display alert.
        [currentViewController presentViewController:alertController animated:YES completion:nil];
    
    }
    

Swift:

  1. أضف ملف ClientManager.swift بالمحتويات التالية. استبدل ٪AppUrl٪ بعنوان URL الخاص بالواجهة الخلفية لتطبيق Azure Mobile.

    class ClientManager {
        static let sharedClient = MSClient(applicationURLString: "%AppUrl%")
    }
    
  2. في ToDoTableViewController.swift، استبدل let client السطر الذي يقوم بتهيئة MSClient مع هذا السطر:

    let client = ClientManager.sharedClient
    
  3. في AppDelegate.swift، استبدل نص func application كما يلي:

    func application(application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        application.registerUserNotificationSettings(
            UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound],
                categories: nil))
        application.registerForRemoteNotifications()
        return true
    }
    
  4. في AppDelegate.swift، أضف أساليب المعالج التالية. تم الآن تحديث تطبيقك لدعم الإعلامات المنبثقة.

    func application(application: UIApplication,
        didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
        ClientManager.sharedClient.push?.registerDeviceToken(deviceToken) { error in
            print("Error registering for notifications: ", error?.description)
        }
    }
    
    func application(application: UIApplication,
        didFailToRegisterForRemoteNotificationsWithError error: NSError) {
        print("Failed to register for remote notifications: ", error.description)
    }
    
    func application(application: UIApplication,
        didReceiveRemoteNotification userInfo: [NSObject: AnyObject]) {
    
        print(userInfo)
    
        let apsNotification = userInfo["aps"] as? NSDictionary
        let apsString       = apsNotification?["alert"] as? String
    
        let alert = UIAlertController(title: "Alert", message: apsString, preferredStyle: .Alert)
        let okAction = UIAlertAction(title: "OK", style: .Default) { _ in
            print("OK")
        }
        let cancelAction = UIAlertAction(title: "Cancel", style: .Default) { _ in
            print("Cancel")
        }
    
        alert.addAction(okAction)
        alert.addAction(cancelAction)
    
        var currentViewController = self.window?.rootViewController
        while currentViewController?.presentedViewController != nil {
            currentViewController = currentViewController?.presentedViewController
        }
    
        currentViewController?.presentViewController(alert, animated: true) {}
    
    }
    

اختبار الإعلامات المنبثقة

  • في Xcode، اضغط على تشغيل وبدء تشغيل التطبيق على جهاز iOS (لاحظ أن الدفع لن يعمل على المحاكيات). انقر فوق موافق لقبول الإعلامات المنبثقة؛ يحدث هذا الطلب في المرة الأولى التي يتم فيها تشغيل التطبيق.
  • في التطبيق، أضف عنصرا جديدا وانقر فوق +.
  • تحقق من تلقي إعلام، ثم انقر فوق موافق لتجاهل الإعلام. لقد أكملت الآن هذا البرنامج التعليمي بنجاح.

المزيد