Dapatkan pemberitahuan push saat Aplikasi di iOS foreground


192

Saya menggunakan layanan pemberitahuan push di aplikasi saya. Ketika aplikasi di latar belakang saya dapat melihat notifikasi pada layar notifikasi (layar ditampilkan ketika kami menggesek ke bawah dari atas perangkat iOS). Tetapi jika aplikasi di latar depan metode delegasi

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo

dipanggil tetapi pemberitahuan tidak ditampilkan di layar pemberitahuan.

Saya ingin menampilkan notifikasi di layar notifikasi terlepas dari apakah aplikasi di latar belakang atau di latar depan. Saya lelah dengan mencari solusi. Setiap bantuan sangat dihargai.


35
Apple mengatakan : Jika Anda menerima pemberitahuan lokal atau jarak jauh saat aplikasi Anda berjalan di latar depan, Anda bertanggung jawab untuk meneruskan informasi kepada pengguna Anda dengan cara khusus aplikasi.
Lauri Lehmijoki

2
Beberapa up-to-date (Oktober "16) link apel: di sini , ada dan ada
azmeuk

1
bukankah latar depan dukungan pemberitahuan push untuk iOS 9.3 dan kurang?
Anurag Sharma

@Lauri tautan Lehmijoki? Saya tidak menemukan itu di situs web resmi
Vyachaslav Gerchicov

1
Saya menghadapi masalah yang sama dalam ionik ...
Sayed Mohd Ali

Jawaban:


208

Untuk menampilkan pesan spanduk saat aplikasi di latar depan, gunakan metode berikut.

iOS 10, Swift 3/4 :

// This method will be called when app received push notifications in foreground
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) 
{
    completionHandler([.alert, .badge, .sound])
}

iOS 10, Swift 2.3 :

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void)
{
    //Handle the notification
    completionHandler(
       [UNNotificationPresentationOptions.Alert,
        UNNotificationPresentationOptions.Sound,
        UNNotificationPresentationOptions.Badge])
}

Anda juga harus mendaftarkan delegasi aplikasi Anda sebagai delegasi untuk pusat notifikasi:

import UserNotifications

// snip!

class AppDelegate : UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate

// snip!

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

      // set the delegate in didFinishLaunchingWithOptions
      UNUserNotificationCenter.current().delegate = self
      ...
   }

Kapan metode ini disebut?
Uma Madhavi

Tolong bantu saya, saya terkesan menampilkan pemberitahuan dari atas ketika latar belakang atau latar depan aplikasi saya. Karena 2 minggu saya bekerja dengan pemberitahuan push. Saya dapat menerima pesan dari server.
Uma Madhavi

@UmaMadhavi Bisakah Anda menerima pemberitahuan push?
chengsam

21
Jangan lupa untuk mengatur delegasi Pusat Pemberitahuan sebagai delegasi aplikasi: UNUserNotificationsCenter.current().delegate = selfdalam aplikasi didFinishLaunchingWithOptions
Achintya Ashok

2
Bagi mereka yang masih berjuang, UNUserNotificationCenter bukan UNUserNotificationsCenter dengan 's' before center
Raj

58

Kode di bawah ini akan berfungsi untuk Anda:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo  {
    application.applicationIconBadgeNumber = 0;             
    //self.textView.text = [userInfo description];
    // We can determine whether an application is launched as a result of the user tapping the action
    // button or whether the notification was delivered to the already-running application by examining
    // the application state.

    if (application.applicationState == UIApplicationStateActive) {                
        // Nothing to do if applicationState is Inactive, the iOS already displayed an alert view.                
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Did receive a Remote Notification" message:[NSString stringWithFormat:@"Your App name received this notification while it was running:\n%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]]delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];          
    }    
}

Ini bekerja. Sedikit info tentang apa fungsinya; ketika aplikasi berada di latar depan, kotak tanda UI asli muncul dengan teks notifikasi di dalamnya ( titleteks tebal yang sedikit lebih besar, dan messageteks yang lebih kecil di bawahnya. Tombol 'OK' untuk menghilangkan ada di bagian bawah). Opsi applicationIconBadgeNumber sedang diatur ke 0 adalah untuk menyembunyikan nomor yang muncul di atas ikon aplikasi di Springboard (misalnya menandakan jumlah pesan yang belum dibaca dalam aplikasi email). Dalam contoh ini, saya tidak tahu apakah opsi itu diperlukan.
jwinn

Apakah ini berfungsi untuk UNnotification AND UILocalNotification?
user6631314

38

Bagi siapa pun yang tertarik, saya akhirnya membuat tampilan kustom yang terlihat seperti sistem push banner di bagian atas tetapi menambahkan tombol tutup (biru kecil X) dan opsi untuk mengetuk pesan untuk tindakan kustom. Ini juga mendukung kasus lebih dari satu notifikasi tiba sebelum pengguna punya waktu untuk membaca / mengabaikan yang lama (Tanpa batas berapa banyak yang dapat menumpuk ...)

Tautan ke GitHub: AGPushNote

Penggunaannya pada dasarnya adalah on-liner:

[AGPushNoteView showWithNotificationMessage:@"John Doe sent you a message!"];

Dan sepertinya ini di iOS7 (iOS6 memiliki tampilan dan nuansa iOS6 ...)

masukkan deskripsi gambar di sini


1
Juga sekarang ditata ulang di Swift: github.com/charliewilliams/CWNotificationBanner (oleh saya)
buildsucceeded

Bagus, ini akan berguna.
无 夜 之 星辰

35

Tujuan C

masukkan deskripsi gambar di sini

Untuk itu iOS 10kita perlu mengintegrasikan willPresentNotificationmetode untuk menampilkan spanduk notifikasi di foreground.

Jika aplikasi dalam mode latar depan (aktif)

- (void)userNotificationCenter:(UNUserNotificationCenter* )center willPresentNotification:(UNNotification* )notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
    NSLog( @“Here handle push notification in foreground" ); 
    //For notification Banner - when app in foreground

    completionHandler(UNNotificationPresentationOptionAlert);

    // Print Notification info
    NSLog(@"Userinfo %@",notification.request.content.userInfo);
}

1
Cukup salin kode dan jangan lupa untuk menggunakan protokol UNUserNotificationCenterDelegate.
Nik Kov

jika saya ingin menampilkan lansiran alih-alih pemberitahuan ini?
Mihir Oza

@MihirOza Anda ingin UIAlertController?
Ashwini Chougale

Saya tahu tetapi saya tidak ingin munculan pemberitahuan saat aplikasi aktif. Saya hanya ingin lansiran di aplikasi saya.
Mihir Oza

saya mencoba fungsi Anda tetapi saya masih tidak bisa mendapatkan foreground
Khaled Boussoffara

25

Jika aplikasi berjalan di latar depan, iOS tidak akan menampilkan spanduk pemberitahuan / peringatan. Itu dengan desain. Tetapi kita dapat mencapainya dengan menggunakan UILocalNotificationsebagai berikut

  • Periksa apakah aplikasi dalam keadaan aktif saat menerima
    notifikasi jarak jauh . Jika dalam keadaan aktif jalankan UILocalNotification.

    if (application.applicationState == UIApplicationStateActive ) {
    
        UILocalNotification *localNotification = [[UILocalNotification alloc] init];
        localNotification.userInfo = userInfo;
        localNotification.soundName = UILocalNotificationDefaultSoundName;
        localNotification.alertBody = message;
        localNotification.fireDate = [NSDate date];
        [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    }

CEPAT:

if application.applicationState == .active {
    var localNotification = UILocalNotification()
    localNotification.userInfo = userInfo
    localNotification.soundName = UILocalNotificationDefaultSoundName
    localNotification.alertBody = message
    localNotification.fireDate = Date()
    UIApplication.shared.scheduleLocalNotification(localNotification)
}

86
Saya rasa ini tidak akan membantu. Notifikasi lokal dan jarak jauh diperlakukan sama dan akibatnya ketika notifikasi lokal ini padam dan jika aplikasi berjalan maka lencana / spanduk atau suara tidak akan ditampilkan / diputar.
RPM

3
Itu juga akan meninggalkan entri di iOS Notification Center
Ab'initio

3
Namun saya tidak akan meluncurkan pemberitahuan lokal ketika pemberitahuan push datang. Saya akan meluncurkan perilaku serupa, bukan seperti @ Rick77 disebutkan: menunjukkan peringatan atau pemanggang roti. Saya kira saya tidak harus melalui sistem operasi lagi untuk sesuatu yang diminta sistem operasi untuk saya tangani.
Fábio Oliveira

3
Solusi ini berfungsi, karena lokal dan jarak jauh ditangani dengan cara yang sama, di mana ketika aplikasi berada di latar depan, membuat pemberitahuan lokasi ketika pemberitahuan jarak jauh datang tidak akan menunjukkan apa-apa. Menggunakan lansiran atau lansiran khusus adalah solusinya
Hammer

19
Ini sebenarnya tidak berhasil. Dari dokumen UILocalNotification:If the app is foremost and visible when the system delivers the notification, the app delegate’s application:didReceiveLocalNotification: is called to process the notification. Use the information in the provided UILocalNotification object to decide what action to take. The system does not display any alerts, badge the app’s icon, or play any sounds when the app is already frontmost.
Chris Morse

15

Jika aplikasi berjalan di latar depan, iOS tidak akan menampilkan spanduk pemberitahuan / peringatan. Itu dengan desain. Anda harus menulis beberapa kode untuk menangani situasi aplikasi Anda menerima pemberitahuan saat berada di latar depan. Anda harus menunjukkan pemberitahuan dengan cara yang paling tepat (misalnya, menambahkan nomor lencana ke UITabBarikon, mensimulasikan spanduk Pusat Pemberitahuan, dll.).


1
tetapi dalam aplikasi email iOS yang telah mereka lakukan, Anda akan mendapatkan spanduk pemberitahuan / peringatan baru saat aplikasi email di latar depan
Ab'initio

3
@ Ab'initio Saya tidak tahu pasti, tetapi di iOS semua aplikasi tidak dibuat sama. Saya kira aplikasi Mail saham menggunakan semacam API pribadi yang tidak tersedia di SDK publik. Atau mungkin kode notifikasi membuat pengecualian dengan id aplikasi Apple.
Daniel Martín

1
Apa?? Saya akan mengalami serangan kemarahan harpy.
Josh

@ DanielMartín dapatkah Anda memberi tahu saya bagaimana saya akan menerima pemberitahuan di status latar depan di iOS 8.0
Dilip Tiwari

10
Ingatlah bahwa jawaban ini hanya berlaku untuk iOS 9 dan lebih rendah . Sejak iOS 10, Apple memperkenalkan API baru untuk menangani notifikasi ( UNUserNotificationCenter API). Seiring dengan API baru, sekarang dimungkinkan untuk menampilkan notifikasi jika aplikasi berada di latar depan. Jadi jika Anda bingung karena perbedaan jawaban dalam pertanyaan ini, itu karena beberapa jawaban terlalu tua, dan hanya menggambarkan perilaku untuk iOS 9 dan sebelumnya, sedangkan yang lain tidak memperhitungkan bahwa UNUserNotificationCenter hanya tersedia dari iOS 10.
tomacco

13

Xcode 10 Swift 4.2

Untuk menampilkan Pemberitahuan Push saat aplikasi Anda berada di latar depan -

Langkah 1: tambahkan delegasi UNUserNotificationCenterDelegate di kelas AppDelegate.

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

Langkah 2: Tetapkan delegasi UNUserNotificationCenter

let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.delegate = self

Langkah 3: Langkah ini akan memungkinkan aplikasi Anda untuk menampilkan Pemberitahuan Dorong bahkan ketika aplikasi Anda di latar depan

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert, .sound])

    }

Langkah 4: Langkah ini opsional . Periksa apakah aplikasi Anda di latar depan dan jika di latar depan maka tunjukkan Pengesahan Lokal.

func application(_ application: UIApplication,didReceiveRemoteNotification userInfo: [AnyHashable: Any],fetchCompletionHandler completionHandler:@escaping (UIBackgroundFetchResult) -> Void) {

        let state : UIApplicationState = application.applicationState
        if (state == .inactive || state == .background) {
            // go to screen relevant to Notification content
            print("background")
        } else {
            // App is in UIApplicationStateActive (running in foreground)
            print("foreground")
            showLocalNotification()
        }
    }

Fungsi Notifikasi Lokal -

fileprivate func showLocalNotification() {

        //creating the notification content
        let content = UNMutableNotificationContent()

        //adding title, subtitle, body and badge
        content.title = "App Update"
        //content.subtitle = "local notification"
        content.body = "New version of app update is available."
        //content.badge = 1
        content.sound = UNNotificationSound.default()

        //getting the notification trigger
        //it will be called after 5 seconds
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)

        //getting the notification request
        let request = UNNotificationRequest(identifier: "SimplifiedIOSNotification", content: content, trigger: trigger)

        //adding the notification to notification center
        notificationCenter.add(request, withCompletionHandler: nil)
    }

1
Ini adalah contoh yang bagus tentang perlunya membaca semua balasan ke utas. Utas sebelumnya menyebutkan metode, daripada delegasi dan akhirnya ini semua tiga langkah yang perlu Anda buat. Terima kasih Prashant untuk jawaban yang lengkap!
user3069232

Senang mengetahui bahwa itu membantu Anda. Selamat coding
Prashant Gaikwad

11

Menurut dokumentasi apple , Ya, Anda dapat menampilkan notifikasi saat aplikasi sedang berjalanmasukkan deskripsi gambar di sini


di mana saya bisa menulis fungsi itu di delegasi aplikasi atau di kelas tertentu ??
Pengembang iOS

bagaimana jika saya ingin menulis bahwa methd dalam pandangan itu memuat ??
Pengembang iOS

Anda dapat menulis di mana saja tetapi kondisinya harus sesuai dengan UNUserNotificationCenterDelegateprotokol
SPatel

Anda tidak dapat menulisviewDidLoad
SPatel

1
saya sarankan Anda untuk memperpanjang AppDelegateextension AppDelegate: UNUserNotificationCenterDelegate
SPatel

9

Anda dapat membuat notifikasi sendiri yang meniru peringatan spanduk.

Salah satu caranya adalah dengan membuat tampilan khusus yang terlihat seperti spanduk dan dapat menghidupkan dan merespons sentuhan. Dengan mengingat hal ini, Anda dapat membuat spanduk yang lebih baik dengan fungsionalitas yang lebih banyak.

Atau Anda dapat mencari api yang melakukannya untuk Anda dan menambahkannya sebagai podfiles ke proyek Anda.

Berikut adalah beberapa yang telah saya gunakan:

https://github.com/terryworona/TWMessageBarManager

https://github.com/toursprung/TSMessages


1
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah.
Robert

1
TWMessageBarManagerdapat dengan mudah dipanggil dan digunakan melalui appdelegate sendiri karena menggunakan pola desain tunggal. Terima kasih atas tautannya.
Jay Mayu

8

Berikut adalah kode untuk menerima Pemberitahuan Dorong ketika aplikasi dalam keadaan aktif (latar depan atau terbuka). Dokumentasi UNUserNotificationCenter

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void)
{
     completionHandler([UNNotificationPresentationOptions.Alert,UNNotificationPresentationOptions.Sound,UNNotificationPresentationOptions.Badge])
}

Jika Anda perlu mengakses userInfo dari kode penggunaan notifikasi: notification.request.content.userInfo


di mana harus menulis fungsi ini dalam pandangan apakah memuat? atau di kelas tampilan controller?
Pengembang iOS

bagaimana jika saya bisa memanggilnya dalam fungsi sebagai fungsi bersarang akan disebut> ??
Pengembang iOS

1
letakkan ini di kelas AppDelegate. Anda tidak harus memanggil fungsi ini.
Milan Jayawardane

4

Menambahkan baris completHandler ke metode delegasi memecahkan masalah yang sama bagi saya:

//Called when a notification is delivered to a foreground app.
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

completionHandler([.alert, .badge, .sound])
} 

3

Untuk swift 5 mem-parsing kamus PushNotification

    func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) {
            if application.applicationState == .active {
                if let aps1 = data["aps"] as? NSDictionary {
                    if let dict = aps1["alert"] as? NSDictionary {
                        if let strTitle = dict["title"] as? String , let strBody = dict["body"] as? String {
                            if let topVC = UIApplication.getTopViewController() {
                                //Apply your own logic as per requirement
                                print("strTitle ::\(strTitle) , strBody :: \(strBody)")
                            }
                        }
                    }
                }
            }
        }

Untuk mengambil viewController teratas yang kami tampilkan topBanner

extension UIApplication {

    class func getTopViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {

        if let nav = base as? UINavigationController {
            return getTopViewController(base: nav.visibleViewController)

        } else if let tab = base as? UITabBarController, let selected = tab.selectedViewController {
            return getTopViewController(base: selected)

        } else if let presented = base?.presentedViewController {
            return getTopViewController(base: presented)
        }
        return base
    }
}

The guardpernyataan adalah teman Anda :-)
Nicolas Miari

2

Dalam delegasi aplikasi Anda gunakan kode di bawah ini

import UIKit
import UserNotifications
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
 var currentToken: String?
 var window: UIWindow?
 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        application.registerForRemoteNotifications()
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in

            // Enable or disable features based on authorization.
            if granted == true
            {
                print("Allow")
                UIApplication.shared.registerForRemoteNotifications()
            }
            else
            {
                print("Don't Allow")
            }
        }
        UNUserNotificationCenter.current().delegate = self

        return true
    }
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){
        let tokenParts = deviceToken.map { data -> String in
            return String(format: "%02.2hhx", data)
        }
        let token = tokenParts.joined()
        currentToken = token  //get device token to delegate variable

    }
 public class var shared: AppDelegate {
        return UIApplication.shared.delegate as! AppDelegate
    }
 func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
         completionHandler([.alert, .badge, .sound])
    }
}

1

Untuk Swift 5

1) Konfirmasikan delegasi ke AppDelegate dengan UNUserNotificationCenterDelegate

2) UNUserNotificationCenter.current().delegate = selfdididFinishLaunch

3) Menerapkan metode di bawah ini di AppDelegate.

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
     print("Push notification received in foreground.")
     completionHandler([.alert, .sound, .badge])
}

Itu dia!


0

Seperti disebutkan di atas, Anda harus menggunakannya UserNotification.frameworkuntuk mencapai ini. Tetapi untuk tujuan saya, saya harus menunjukkannya di aplikasi dan ingin memiliki iOS 11gaya, jadi saya telah membuat tampilan pembantu kecil, mungkin akan berguna bagi seseorang.

GitHub iOS 11 Push Notification View .


0

Pendekatan terbaik untuk ini adalah dengan menambahkan UNUserNotificationCenterDelegatedi AppDelegatedengan menggunakan extension AppDelegate: UNUserNotificationCenterDelegate ekstensi yang memberitahu aplikasi untuk bisa mendapatkan pemberitahuan bila digunakan

Dan terapkan metode ini

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler(.alert)
    }

Metode ini akan dipanggil pada delegasi hanya jika aplikasi ada di Foreground .

Jadi Implementasi akhir:

extension AppDelegate: UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler(.alert)
    }
}

Dan untuk memanggil ini, Anda harus mengatur delegasi di AppDelegate di didFinishLaunchingWithOptionstambahkan baris ini

UNUserNotificationCenter.current().delegate = self

Anda dapat memodifikasi

completionHandler(.alert) 

dengan

completionHandler([.alert, .badge, .sound]))

-2

Jika aplikasi Anda dalam keadaan foreground, itu berarti Anda saat ini menggunakan aplikasi yang sama. Jadi tidak perlu menampilkan notifikasi di atas secara umum.

Namun tetap saja jika Anda ingin menampilkan notifikasi dalam hal ini Anda harus membuat Tampilan Alert khusus atau Tampilan Kustom seperti Toast atau yang lainnya untuk ditampilkan kepada pengguna bahwa Anda telah mendapatkan notifikasi.

Anda juga dapat menampilkan lencana di bagian atas jika Anda memiliki fitur semacam itu di aplikasi Anda.


-3

Seperti @Danial Martine mengatakan iOS tidak akan menampilkan spanduk pemberitahuan / peringatan. Itu dengan desain. Tetapi jika benar-benar harus melakukannya maka ada satu cara. Saya juga telah mencapai ini dengan cara yang sama.

1. Unduh karya bingkai parse dari Parse FrameWork

2. Impor #import <Parse/Parse.h>

3. Tambahkan kode berikut ke Metode didReceiveRemoteNotification Anda

 - (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    [PFPush handlePush:userInfo];
}

PFPush akan menangani bagaimana menangani notifikasi jarak jauh. Jika Aplikasi di latar depan ini menunjukkan peringatan jika tidak itu menunjukkan pemberitahuan di atas.


waspada? maksud Anda tampilan lansiran?
iphondroid

1
tetapi bagaimana cara mendapatkan panggilan kembali untuk tindakan tombol waspada
Charlie
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.