Bagikan melalui


Mendaftarkan pengguna saat ini untuk pemberitahuan push dengan ASP.NET

Gambaran Umum

Topik ini menunjukkan cara meminta pendaftaran pemberitahuan push dengan Azure Notification Hubs saat pendaftaran dilakukan oleh ASP.NET Web API. Topik ini melengkapi tutorial Memberi tahu pengguna dengan Notification Hubs. Selesaikan terlebih dahulu langkah-langkah yang diperlukan dalam tutorial tersebut untuk membuat layanan seluler terautentikasi. Untuk informasi selengkapnya tentang skenario beri tahu pengguna, lihat Memberi tahu pengguna dengan Notification Hubs.

Memperbarui aplikasi

  1. Di papan MainStoryboard_iPhone.storyboard, tambahkan komponen berikut dari pustaka objek:

    • Label: "Dorong ke Pengguna dengan Notification Hubs"

    • Label: "InstallationId"

    • Label: "Pengguna"

    • Bidang Teks: "Pengguna"

    • Label: "Kata Sandi"

    • Bidang Teks: "Kata Sandi"

    • Tombol: "Login"

      Pada titik ini, papan cerita Anda terlihat seperti berikut ini:

      Cuplikan layar aplikasi MainStoryboard_iPhone.storyboard dengan komponen yang ditambahkan.

  2. Di editor bantuan, buat outlet untuk semua kontrol yang dialihkan dan panggil outlet tersebut, sambungkan bidang teks dengan Pengontrol Tampilan (delegasi), dan buat Tindakan untuk tombol masuk.

    Cuplikan layar asisten penyunting di aplikasi MainStoryboard_iPhone.storyboard

    File BreakingNewsViewController.h sekarang berisi kode berikut:

    @property (weak, nonatomic) IBOutlet UILabel *installationId;
    @property (weak, nonatomic) IBOutlet UITextField *User;
    @property (weak, nonatomic) IBOutlet UITextField *Password;
    
    - (IBAction)login:(id)sender;
    
  3. Buat nama kelas DeviceInfo, dan salin kode berikut ke bagian antarmuka file DeviceInfo.h:

    @property (readonly, nonatomic) NSString* installationId;
    @property (nonatomic) NSData* deviceToken;
    
  4. Salin kode berikut di bagian implementasi file DeviceInfo.m:

    @synthesize installationId = _installationId;
    
    - (id)init {
        if (!(self = [super init]))
            return nil;
    
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        _installationId = [defaults stringForKey:@"PushToUserInstallationId"];
        if(!_installationId) {
            CFUUIDRef newUUID = CFUUIDCreate(kCFAllocatorDefault);
            _installationId = (__bridge_transfer NSString *)CFUUIDCreateString(kCFAllocatorDefault, newUUID);
            CFRelease(newUUID);
    
            //store the install ID so we don't generate a new one next time
            [defaults setObject:_installationId forKey:@"PushToUserInstallationId"];
            [defaults synchronize];
        }
    
        return self;
    }
    
    - (NSString*)getDeviceTokenInHex {
        const unsigned *tokenBytes = [[self deviceToken] bytes];
        NSString *hexToken = [NSString stringWithFormat:@"%08X%08X%08X%08X%08X%08X%08X%08X",
                                ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                                ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                                ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
        return hexToken;
    }
    
  5. Di PushToUserAppDelegate.h, tambahkan database tunggal properti berikut:

    @property (strong, nonatomic) DeviceInfo* deviceInfo;
    
  6. Dalam metode didFinishLaunchingWithOptions di PushToUserAppDelegate.m, tambahkan kode berikut:

    self.deviceInfo = [[DeviceInfo alloc] init];
    
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    

    Baris pertama akan menginisialisasi database tunggal DeviceInfo. Baris kedua memulai pendaftaran untuk pemberitahuan push, yang sudah ada jika Anda telah menyelesaikan tutorial Mulai menggunakan Notification Hubs.

  7. Di PushToUserAppDelegate.m, terapkan metode didRegisterForRemoteNotificationsWithDeviceToken di AppDelegate Anda dan tambahkan kode berikut:

    self.deviceInfo.deviceToken = deviceToken;
    

    Kode ini akan mengatur token perangkat untuk permintaan.

    Catatan

    Pada titik ini, seharusnya tidak ada kode lain dalam metode ini. Jika sudah memiliki panggilan ke metode registerNativeWithDeviceToken yang ditambahkan saat menyelesaikan tutorial Mengirimkan pemberitahuan push ke aplikasi iOS menggunakan tutorial Azure Notification Hubs, Anda harus mengomentari atau menghapus panggilan tersebut.

  8. Dalam file PushToUserAppDelegate.m, tambahkan metode handler berikut:

    * (void) application:(UIApplication *) application didReceiveRemoteNotification:(NSDictionary *)userInfo {
       NSLog(@"%@", userInfo);
       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Notification" message:
                             [userInfo objectForKey:@"inAppMessage"] delegate:nil cancelButtonTitle:
                             @"OK" otherButtonTitles:nil, nil];
       [alert show];
    }
    

    Metode ini menampilkan pemberitahuan di UI saat aplikasi Anda menerima pemberitahuan ketika sedang berjalan.

  9. Buka file PushToUserViewController.m, dan kembalikan keyboard dalam implementasi berikut:

    - (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
        if (theTextField == self.User || theTextField == self.Password) {
            [theTextField resignFirstResponder];
        }
        return YES;
    }
    
  10. Dalam metode viewDidLoad di file PushToUserViewController.m, inisialisasi label installationId sebagai berikut:

    DeviceInfo* deviceInfo = [(PushToUserAppDelegate*)[[UIApplication sharedApplication]delegate] deviceInfo];
    Self.installationId.text = deviceInfo.installationId;
    
  11. Tambahkan properti berikut dalam antarmuka di PushToUserViewController.m:

    @property (readonly) NSOperationQueue* downloadQueue;
    - (NSString*)base64forData:(NSData*)theData;
    
  12. Kemudian, tambahkan implementasi berikut:

    - (NSOperationQueue *)downloadQueue {
        if (!_downloadQueue) {
            _downloadQueue = [[NSOperationQueue alloc] init];
            _downloadQueue.name = @"Download Queue";
            _downloadQueue.maxConcurrentOperationCount = 1;
        }
        return _downloadQueue;
    }
    
    // base64 encoding
    - (NSString*)base64forData:(NSData*)theData
    {
        const uint8_t* input = (const uint8_t*)[theData bytes];
        NSInteger length = [theData length];
    
        static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    
        NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
        uint8_t* output = (uint8_t*)data.mutableBytes;
    
        NSInteger i;
        for (i=0; i < length; i += 3) {
            NSInteger value = 0;
            NSInteger j;
            for (j = i; j < (i + 3); j++) {
                value <<= 8;
    
                if (j < length) {
                    value |= (0xFF & input[j]);
                }
            }
    
            NSInteger theIndex = (i / 3) * 4;
            output[theIndex + 0] =                    table[(value >> 18) & 0x3F];
            output[theIndex + 1] =                    table[(value >> 12) & 0x3F];
            output[theIndex + 2] = (i + 1) < length ? table[(value >> 6)  & 0x3F] : '=';
            output[theIndex + 3] = (i + 2) < length ? table[(value >> 0)  & 0x3F] : '=';
        }
    
        return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    }
    
  13. Salin kode berikut ke dalam metode handler login yang dibuat oleh XCode:

    DeviceInfo* deviceInfo = [(PushToUserAppDelegate*)[[UIApplication sharedApplication]delegate] deviceInfo];
    
    // build JSON
    NSString* json = [NSString stringWithFormat:@"{\"platform\":\"ios\", \"instId\":\"%@\", \"deviceToken\":\"%@\"}", deviceInfo.installationId, [deviceInfo getDeviceTokenInHex]];
    
    // build auth string
    NSString* authString = [NSString stringWithFormat:@"%@:%@", self.User.text, self.Password.text];
    
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://nhnotifyuser.azurewebsites.net/api/register"]];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[json dataUsingEncoding:NSUTF8StringEncoding]];
    [request addValue:[@([json lengthOfBytesUsingEncoding:NSUTF8StringEncoding]) description] forHTTPHeaderField:@"Content-Length"];
    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request addValue:[NSString stringWithFormat:@"Basic %@",[self base64forData:[authString dataUsingEncoding:NSUTF8StringEncoding]]] forHTTPHeaderField:@"Authorization"];
    
    // connect with POST
    [NSURLConnection sendAsynchronousRequest:request queue:[self downloadQueue] completionHandler:^(NSURLResponse* response, NSData* data, NSError* error) {
        // add UIAlert depending on response.
        if (error != nil) {
            NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
            if ([httpResponse statusCode] == 200) {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Back-end registration" message:@"Registration successful" delegate:nil cancelButtonTitle: @"OK" otherButtonTitles:nil, nil];
                [alert show];
            } else {
                NSLog(@"status: %ld", (long)[httpResponse statusCode]);
            }
        } else {
            NSLog(@"error: %@", error);
        }
    }];
    

    Metode ini mendapatkan ID penginstalan dan saluran untuk pemberitahuan push dan mengirimkannya, beserta jenis perangkat, ke metode Web API terautentikasi yang membuat pendaftaran di Notification Hubs. Web API ini didefinisikan dalam Memberi tahu pengguna dengan Notification Hubs.

Setelah aplikasi klien diperbarui, kembali ke Memberi tahu pengguna dengan Notification Hubs dan perbarui layanan seluler untuk mengirim pemberitahuan dengan menggunakan Notification Hubs.