logoDokumen
Cari

Ringkasan Pembaruan Fitur Baru iOS

Fitur Baru iOS 14

Fitur baru di iOS 14 terutama mencakup APP Clip, clipboard, perlindungan privasi, dan fitur lainnya, namun tidak ada fitur baru terkait notifikasi.

Fitur Baru iOS 13

Fitur baru di iOS 13 terutama meliputi Dark Mode, Swift UI, dan fitur lainnya, tetapi tidak ada fitur baru terkait notifikasi.

Fitur Baru iOS 12

Pengelompokan Push

Di iOS 12, notifikasi dengan tipe yang sama akan digabungkan ke dalam satu grup notifikasi. Pengguna dapat memperluas semua notifikasi dalam grup tersebut dengan mengklik grup notifikasi.

Terdapat dua metode pengelompokan notifikasi: Pengelompokan Otomatis dan Thread identifier. Pengembang tidak perlu melakukan apa-apa untuk pengelompokan otomatis, sistem akan mengelompokkan push berdasarkan bundleId aplikasi. Jika ingin pengelompokan lebih detail, gunakan thread identifier. Pengguna dapat mengatur grup (otomatis, berdasarkan aplikasi, nonaktif)

Atribut Thread identifier sebenarnya sudah ada sejak iOS10, namun baru di iOS12 benar-benar diterapkan untuk pengelompokan.

// Pengidentifikasi unik untuk thread atau percakapan yang terkait dengan permintaan notifikasi ini. Akan digunakan untuk mengelompokkan notifikasi secara visual. @property (NS_NONATOMIC_IOSONLY, copy) NSString *threadIdentifier __TVOS_PROHIBITED;
              
              // Pengidentifikasi unik untuk thread atau percakapan yang terkait dengan permintaan notifikasi ini. Akan digunakan untuk mengelompokkan notifikasi secara visual.
@property (NS_NONATOMIC_IOSONLY, copy) NSString *threadIdentifier __TVOS_PROHIBITED;

            
Tampilkan blok kode ini di jendela mengambang

Pengaturan Format Ringkasan

Setelah notifikasi dikelompokkan secara otomatis, akan ada ringkasan pesan di bagian bawah. Format defaultnya adalah: n notifikasi lainnya. Format ini dapat disesuaikan. Pertama: Kustomisasi format melalui UNNotificationCategory

+ (instancetype)categoryWithIdentifier:(NSString *)identifier actions:(NSArray<UNNotificationAction *> *)actions intentIdentifiers:(NSArray<NSString *> *)intentIdentifiers hiddenPreviewsBodyPlaceholder:(nullable NSString *)hiddenPreviewsBodyPlaceholder categorySummaryFormat:(nullable NSString *)categorySummaryFormat options:(UNNotificationCategoryOptions)options __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED;
              
              + (instancetype)categoryWithIdentifier:(NSString *)identifier
                               actions:(NSArray<UNNotificationAction *> *)actions
                     intentIdentifiers:(NSArray<NSString *> *)intentIdentifiers
         hiddenPreviewsBodyPlaceholder:(nullable NSString *)hiddenPreviewsBodyPlaceholder
                 categorySummaryFormat:(nullable NSString *)categorySummaryFormat
                               options:(UNNotificationCategoryOptions)options __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED;

            
Tampilkan blok kode ini di jendela mengambang

Kedua adalah kustomisasi melalui UNNotificationContent

/// Argumen yang akan dimasukkan dalam ringkasan untuk notifikasi ini. @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSString *summaryArgument __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED; /// Jumlah item dalam ringkasan yang diwakili. /// Contoh: aplikasi podcast mengirim satu notifikasi untuk 3 episode baru dalam satu acara, /// argumen adalah nama acara dan jumlahnya 3. /// Default 1 dan tidak boleh 0. @property (NS_NONATOMIC_IOSONLY, readonly, assign) NSUInteger summaryArgumentCount __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED;
              
              /// Argumen yang akan dimasukkan dalam ringkasan untuk notifikasi ini.
@property (NS_NONATOMIC_IOSONLY, readonly, copy) NSString *summaryArgument __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED;

/// Jumlah item dalam ringkasan yang diwakili.
/// Contoh: aplikasi podcast mengirim satu notifikasi untuk 3 episode baru dalam satu acara,
/// argumen adalah nama acara dan jumlahnya 3.
/// Default 1 dan tidak boleh 0.
@property (NS_NONATOMIC_IOSONLY, readonly, assign) NSUInteger summaryArgumentCount __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED;

            
Tampilkan blok kode ini di jendela mengambang

Pengelolaan Informasi

Apple menambahkan tombol "Kelola" untuk pesan yang dapat muncul dengan menggeser ke kiri.

Otorisasi Sementara

Bentuk utama otorisasi sementara adalah akan ada dua tombol pada pesan push, yang memungkinkan pengguna memilih secara aktif

Notifikasi Peringatan

Contoh: faktor keselamatan keluarga, kesehatan, keselamatan publik, dan lainnya. Pesan ini mengharuskan pengguna untuk mengambil tindakan. Skenario sederhana: kamera rumah mengirim pesan jika ada orang di rumah saat Anda pergi bekerja. Jenis notifikasi ini memerlukan sertifikat khusus.

Fitur Baru iOS 10

Petunjuk

iOS 10 menambahkan sejumlah fitur baru seputar notifikasi. Untuk detail lebih lanjut, silakan lihat Blog resmi EngageLab.

iOS 10 Service Extension

Petunjuk

Service Extension ditambahkan pada iOS 10 Ilustrasi resmi ditunjukkan di bawah ini Artinya, sebelum APNs sampai ke perangkat, mereka diproses oleh lapisan Service Extension yang memungkinkan pengguna mengatur pengaturan sendiri dan menambah variasi pada APNs.

Cara Penggunaan

Service Extension mudah digunakan. Pertama, buat Service Extension, seperti gambar berikut

Catatan penting:

  • Bundle Identifier Service Extension tidak boleh sama dengan Bundle Identifier Main Target (Aplikasi utama). Jika sama, akan muncul error duplikasi BundleID.
  • Bundle Identifier Service Extension harus berada dalam namespace Main Target. Misal, BundleID Main Target adalah io.mtpush.xxx, maka BundleID Service Extension sebaiknya io.mtpush.xxx.yyy. Jika tidak, bisa terjadi error.

Setelah Service Extension berhasil dibuat, Anda akan menemukan kelas dengan dua metode:

  • didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent *contentToDeliver))contentHandler
  • serviceExtensionTimeWillExpire

Penjelasan resmi metode pertama: Panggil contentHandler dengan konten notifikasi yang telah dimodifikasi untuk dikirimkan. Jika handler tidak dipanggil sebelum waktu layanan habis, maka notifikasi asli akan dikirimkan. Singkatnya, metode ini dipanggil saat APNs tiba, Anda dapat memproses konten push, lalu gunakan contentHandler untuk menampilkannya. Jika waktu habis, APNs akan tampil apa adanya. Artinya, Anda dapat memproses notifikasi di metode ini dan mempersonalisasikannya untuk pengguna. Metode kedua adalah solusi darurat jika waktu habis; metode ini dipanggil sebelum waktu habis, Anda dapat melakukan pemrosesan darurat pada pesan APNs.

Integrasi iOS 9

Perubahan iOS 9 yang Mempengaruhi SDK:

  • Ditambah format encoding bitCode. Jika SDK tidak mendukung bitCode, pengguna tidak dapat mengaktifkan opsi bitCode saat integrasi.
    • Gejala: Setelah integrasi SDK, gagal kompilasi dan log error berisi informasi error bitCode.
  • Koneksi default adalah https. Jika request menggunakan http, plist perlu dikonfigurasi manual untuk mendukung layanan http. Saat ini, semua request server EngageLab sudah menggunakan https.
    • Gejala: Setelah integrasi SDK, semua layanan http terkait MTPush menampilkan error koneksi atau timeout.

Solusi bitCode

  • MTPush iOS SDK v1.8.7 ke atas sudah mendukung bitCode.

Solusi Https

Langkah ini tidak diperlukan untuk MTPush 2.0.0 ke atas

  • Tambahkan Dictionary NSAppTransportSecurity ke Info.plist proyek.
  • Tambahkan NSAllowsArbitraryLoads tipe Boolean di bawah NSAppTransportSecurity, atur ke YES.

iOS 9 UIUserNotificationActionBehaviorTextInput

Versi Didukung

Tersedia mulai versi v1.8.0.

  1. Perubahan terbesar pada iOS 9 terkait push adalah perubahan pada tipe Category push. Berdasarkan kategori push sebelumnya, ditambahkan tipe Action teks. Parameter ini digunakan untuk mendaftarkan item input teks pada notifikasi.
  2. Kategori terdiri dari serangkaian UIUserNotificationCategory. Setiap UIUserNotificationCategory memungkinkan Anda menambah serangkaian UIMutableUserNotificationAction untuk menambah item pada bar notifikasi. Di iOS9, tipe UIMutableUserNotificationAction ditambah tipe input teks (UIUserNotificationActionBehaviorTextInput), diatur melalui properti behavior (khusus iOS9).
  3. iOS9 menggunakan dua metode callback baru untuk menangani event klik tombol:
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullableNSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0) - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullableNSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0)
              
              - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullableNSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0)

- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullableNSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0)

            
Tampilkan blok kode ini di jendela mengambang

Catatan:

  • Jika Action adalah UIUserNotificationActionBehaviorTextInput, gunakan responseInfo UIUserNotificationActionResponseTypedTextKey untuk mendapatkan teks yang dimasukkan, UIUserNotificationTextInputActionButtonTitleKey untuk mendapatkan tipe tombol yang diklik.
  • Jika Action adalah UIUserNotificationActionBehaviorDefault, responseInfo bernilai nil, gunakan identifier untuk membedakan tombol mana yang diklik.

Pengaturan di Client

Mengatur notifikasi dengan balasan cepat

# ifdef __IPHONE_9_0 UIMutableUserNotificationAction *replyAction = [[UIMutableUserNotificationAction alloc]init]; replyAction.title = @"Balas"; replyAction.identifier = @"comment-reply"; replyAction.activationMode = UIUserNotificationActivationModeBackground; replyAction.behavior = UIUserNotificationActionBehaviorTextInput; UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc]init]; category.identifier = @"reply"; [category setActions:@[replyAction] forContext:UIUserNotificationActionContextDefault]; # endif
              
              # ifdef __IPHONE_9_0 
 UIMutableUserNotificationAction *replyAction = [[UIMutableUserNotificationAction alloc]init];
 replyAction.title = @"Balas";
 replyAction.identifier = @"comment-reply";
 replyAction.activationMode = UIUserNotificationActivationModeBackground;
 replyAction.behavior = UIUserNotificationActionBehaviorTextInput;
  
 UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc]init];
 category.identifier = @"reply";
 [category setActions:@[replyAction] forContext:UIUserNotificationActionContextDefault];
# endif

            
Tampilkan blok kode ini di jendela mengambang

Menggunakan fungsi callback

- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler { if ([identifier isEqualToString:@"comment-reply"]) { NSString *response = responseInfo[UIUserNotificationActionResponseTypedTextKey]; // Proses teks yang dimasukkan } completionHandler(); }
              
              - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler {
  if ([identifier isEqualToString:@"comment-reply"]) {
    NSString *response = responseInfo[UIUserNotificationActionResponseTypedTextKey];
    // Proses teks yang dimasukkan
  }
  completionHandler();
}

            
Tampilkan blok kode ini di jendela mengambang

Pengaturan Server

Format konten server: aps menambah field category, ketika field ini cocok dengan identifier UIMutableUserNotificationCategory di client, maka action yang diatur akan dipicu dan tombol akan ditampilkan.

contoh payload: {"aps":{"alert":"contoh", "sound":"default", "badge": 1, "category":"reply"}}
              
              contoh payload:
{"aps":{"alert":"contoh", "sound":"default", "badge": 1, "category":"reply"}}

            
Tampilkan blok kode ini di jendela mengambang

iOS 8 UILocalNotification

Tiga parameter baru pada UILocalNotification di iOS 8: region, regionTriggersOnce, dan category.

  • region: mengontrol kapan pengguna memasuki atau meninggalkan lokasi geografis, notifikasi akan dipicu. Untuk fitur ini, pengguna harus mengizinkan "when-in-use" pada CoreLocation.
  • regionTriggersOnce(BOOL): Jika YES, notifikasi hanya dipicu sekali, jika NO, dipicu setiap kali masuk/keluar.
  • category: Jika localNotification didaftarkan melalui + [UIUserNotificationSettings SettingsForUserNotificationTypes: userNotificationActionSettings:], melalui category bisa mendapatkan kategori notifikasi yang didaftarkan.

Pengaturan di Client

Penggunaan UILocalNotification

CLLocationCoordinate2D coordinate2D; coordinate2D.latitude = 100.0; coordinate2D.longitude = 100.0; CLRegion *currentRegion = [[CLCircularRegion alloc] initWithCenter:coordinate2D radius:CLLocationDistanceMax identifier:@"test"]; [APService setLocalNotification:[NSDate dateWithTimeIntervalSinceNow:120] alertBody:@"uji notifikasi ios8" badge:0 alertAction:@"Batal" identifierKey:@"1" userInfo:nil soundName:nil region:currentRegion regionTriggersOnce:YES category:@"test"];
              
              CLLocationCoordinate2D coordinate2D;
coordinate2D.latitude = 100.0;
coordinate2D.longitude = 100.0;
CLRegion *currentRegion =
    [[CLCircularRegion alloc] initWithCenter:coordinate2D
                                      radius:CLLocationDistanceMax
                                  identifier:@"test"];

[APService setLocalNotification:[NSDate dateWithTimeIntervalSinceNow:120]
                      alertBody:@"uji notifikasi ios8"
                          badge:0
                    alertAction:@"Batal"
                  identifierKey:@"1"
                       userInfo:nil
                      soundName:nil
                         region:currentRegion
             regionTriggersOnce:YES
                       category:@"test"];

            
Tampilkan blok kode ini di jendela mengambang

iOS 8 UIUserNotificationSettings

Versi Didukung

Tersedia mulai versi v1.8.0.

Pengaturan di Client

Menggunakan UIUserNotificationCategory

if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { NSMutableSet *categories = [NSMutableSet set]; UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init]; category.identifier = @"identifier"; UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init]; action.identifier = @"test2"; action.title = @"uji"; action.activationMode = UIUserNotificationActivationModeBackground; action.authenticationRequired = YES; //YES tampil merah, NO tampil biru action.destructive = NO; NSArray *actions = @[action]; [category setActions:actions forContext:UIUserNotificationActionContextMinimal]; [categories addObject:category]; }
              
              if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
  NSMutableSet *categories = [NSMutableSet set];

  UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];
  category.identifier = @"identifier";

  UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init];
  action.identifier = @"test2";
  action.title = @"uji";
  action.activationMode = UIUserNotificationActivationModeBackground;
  action.authenticationRequired = YES;
  //YES tampil merah, NO tampil biru
  action.destructive = NO;

  NSArray *actions = @[action];
  [category setActions:actions forContext:UIUserNotificationActionContextMinimal];
  [categories addObject:category];
}

            
Tampilkan blok kode ini di jendela mengambang

Menggunakan UIUserNotificationType

if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:categories]; } else { [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil]; }
              
              if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
  [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:categories];
} else {
  [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
}

            
Tampilkan blok kode ini di jendela mengambang

Menggunakan Fungsi Callback

// Dipanggil saat aplikasi diaktifkan oleh pengguna yang memilih action dari notifikasi remote. // Nilai action identifier nil adalah action default. // Harus memanggil completion handler setelah selesai menangani action. - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler {}
              
              // Dipanggil saat aplikasi diaktifkan oleh pengguna yang memilih action dari notifikasi remote.
// Nilai action identifier nil adalah action default.
// Harus memanggil completion handler setelah selesai menangani action.
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo
  completionHandler:(void (^)())completionHandler {}

            
Tampilkan blok kode ini di jendela mengambang

Pengaturan di Server

Format konten server: aps menambah field category, ketika field ini cocok dengan identifier UIMutableUserNotificationCategory di client, maka action yang diatur akan dipicu dan tombol akan ditampilkan.

contoh payload: {"aps":{"alert":"contoh", "sound":"default", "badge": 1, "category":"identifier"}}
              
              contoh payload:
{"aps":{"alert":"contoh", "sound":"default", "badge": 1, "category":"identifier"}}

            
Tampilkan blok kode ini di jendela mengambang

iOS 7 Background Remote Notification

Perubahan terbesar pada push di iOS 7 adalah kemampuan menjalankan kode di background setelah aplikasi menerima notifikasi, misal untuk update dari server. Contoh penggunaan: chat multimedia, update email, sinkronisasi konten berbasis notifikasi, meningkatkan pengalaman pengguna.

Perbandingan Remote Notifications dengan rilis sebelumnya bisa dilihat pada dua gambar resmi Apple di bawah ini.

Jika hanya membawa content-available: 1 tanpa parameter badge, sound, dan isi pesan, maka operasi seperti pembaruan konten dapat dilakukan tanpa mengganggu pengguna, disebut "Silent Remote Notifications".

Pengaturan di Client

Aktifkan Remote notifications

Ubah Capabilities aplikasi di Xcode untuk mengaktifkan Remote notifications. Lihat gambar di bawah:

Ubah handler notifikasi

Setelah didaftarkan di Background Modes -> Remote notifications, handler notifikasi akan beralih ke fungsi berikut, di mana kode push background juga dipanggil.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;
              
              - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;

            
Tampilkan blok kode ini di jendela mengambang

Pengaturan Push di Server

Pesan push membawa content-available: 1 sebagai parameter wajib untuk menjalankan di Background. Jika field ini tidak dibawa, maka sama seperti push biasa sebelum iOS7.

Push melalui Web Portal

Pada Pengaturan Opsional, pilih parameter terkait.

Push Menggunakan API

Cukup tambahkan field content-available":true pada Push API ios (didukung versi berikutnya)

Batasan dan Perhatian

  • "Silent Remote Notifications" memiliki kontrol frekuensi yang tidak ditentukan oleh Apple. Jadi tidak semua "Silent Remote Notifications" akan memicu fungsi di sisi klien sesuai harapan.
  • Waktu eksekusi aplikasi dalam mode "Background" terbatas. Jika perlu mengunduh file besar, lihat pengenalan NSURLSession dari Apple.
  • Background Remote Notification membutuhkan aplikasi dalam keadaan Background atau Suspended. Jika pengguna menutup aplikasi dari background melalui App Switcher, aplikasi tidak akan bangun untuk memproses kode background.

Untuk detail lebih lanjut, silakan merujuk ke dokumentasi resmi pengembangan iOS dari Apple.

icon
Hubungi Sales