จะสร้างการแจ้งเตือนในเครื่องได้อย่างไร?


114

ฉันจะตั้งค่าการแจ้งเตือนในเครื่องได้อย่างไรเพื่อให้แอปของฉันสร้างการแจ้งเตือน / การแจ้งเตือนด้วยข้อความที่กำหนดเองในขณะที่ตั้งค่าไว้

คำตอบ:


98

นี่คือโค้ดตัวอย่างสำหรับLocalNotificationที่ใช้ได้กับโครงการของฉัน

Objective-C:

บล็อกรหัสนี้ในAppDelegateไฟล์:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        [launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
        // Override point for customization after application launch.
        return YES;
    }

    // This code block is invoked when application is in foreground (active-mode) 
 -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {

        UIAlertView *notificationAlert = [[UIAlertView alloc] initWithTitle:@"Notification"    message:@"This local notification" 
        delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];

        [notificationAlert show];
       // NSLog(@"didReceiveLocalNotification");
    }

บล็อกรหัสนี้ในไฟล์. m ของViewController:

-(IBAction)startLocalNotification {  // Bind this method to UIButton action
    NSLog(@"startLocalNotification");

    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:7];
    notification.alertBody = @"This is local notification!";
    notification.timeZone = [NSTimeZone defaultTimeZone];
    notification.soundName = UILocalNotificationDefaultSoundName;
    notification.applicationIconBadgeNumber = 10;

    [[UIApplication sharedApplication] scheduleLocalNotification:notification];    
}

รหัสด้านบนจะแสดง AlertView หลังจากช่วงเวลา 7 วินาทีเมื่อกดปุ่มที่ผูกstartLocalNotificationหากแอปพลิเคชันอยู่ในพื้นหลังจะแสดงBadgeNumberเป็น 10 และพร้อมเสียงแจ้งเตือนเริ่มต้น

รหัสนี้ใช้งานได้ดีสำหรับ iOS 7.x และต่ำกว่า แต่สำหรับiOS 8 จะแจ้งข้อผิดพลาดต่อไปนี้บนคอนโซล:

กำลังพยายามกำหนดเวลาการแจ้งเตือนในพื้นที่ด้วยการแจ้งเตือน แต่ไม่ได้รับอนุญาตจากผู้ใช้ให้แสดงการแจ้งเตือน

ซึ่งหมายความว่าคุณต้องลงทะเบียนเพื่อรับการแจ้งเตือนในพื้นที่ สามารถทำได้โดยใช้:

if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){

    [application registerUserNotificationSettings [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
}

คุณยังสามารถอ้างอิงบล็อกสำหรับการแจ้งเตือนในพื้นที่

สวิฟท์:

AppDelegate.swiftไฟล์ของคุณควรมีลักษณะดังนี้:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {    
    // Override point for customization after application launch.
    application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Badge | UIUserNotificationType.Alert, categories: nil))

    return true
}

ไฟล์ที่รวดเร็ว (พูดViewController.swift) ที่คุณต้องการสร้างการแจ้งเตือนในเครื่องควรมีรหัสด้านล่าง:

//MARK: - Button functions
func buttonIsPressed(sender: UIButton) {
    println("buttonIsPressed function called \(UIButton.description())")

    var localNotification = UILocalNotification()
    localNotification.fireDate = NSDate(timeIntervalSinceNow: 3)
    localNotification.alertBody = "This is local notification from Swift 2.0"
    localNotification.timeZone = NSTimeZone.localTimeZone()
    localNotification.repeatInterval = NSCalendarUnit.CalendarUnitMinute
    localNotification.userInfo = ["Important":"Data"];
    localNotification.soundName = UILocalNotificationDefaultSoundName
    localNotification.applicationIconBadgeNumber = 5
    localNotification.category = "Message"

    UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
}


//MARK: - viewDidLoad

class ViewController: UIViewController {

    var objButton : UIButton!
    . . .

    override func viewDidLoad() {
        super.viewDidLoad()

        . . .

        objButton = UIButton.buttonWithType(.Custom) as? UIButton
        objButton.frame = CGRectMake(30, 100, 150, 40)
        objButton.setTitle("Click Me", forState: .Normal)
        objButton.setTitle("Button pressed", forState: .Highlighted)

        objButton.addTarget(self, action: "buttonIsPressed:", forControlEvents: .TouchDown)

        . . .
    }

    . . .
}

วิธีที่คุณใช้ทำงานกับ Local Notification ใน iOS 9 และต่ำกว่านั้นแตกต่างกันอย่างสิ้นเชิงใน iOS 10

ด้านล่างหน้าจอคว้าจากบันทึกประจำรุ่นของ Apple แสดงให้เห็นถึงสิ่งนี้

ภาพหน้าจอ

คุณสามารถอ้างอิงเอกสารอ้างอิงของ appleสำหรับ UserNotification

ด้านล่างนี้เป็นรหัสสำหรับการแจ้งเตือนในพื้นที่:

Objective-C:

  1. ในการApp-delegate.hใช้ไฟล์@import UserNotifications;

  2. App-delegate ควรเป็นไปตามUNUserNotificationCenterDelegateโปรโตคอล

  3. ในdidFinishLaunchingOptionsการใช้งานด้านล่างรหัส:

    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
           completionHandler:^(BOOL granted, NSError * _Nullable error) {
                  if (!error) {
                      NSLog(@"request authorization succeeded!");
                      [self showAlert];
                  }
    }];
    
    -(void)showAlert {
        UIAlertController *objAlertController = [UIAlertController alertControllerWithTitle:@"Alert" message:@"show an alert!" preferredStyle:UIAlertControllerStyleAlert];
    
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"OK"
          style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
            NSLog(@"Ok clicked!");
        }];
    
        [objAlertController addAction:cancelAction];
    
    
        [[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController] presentViewController:objAlertController animated:YES completion:^{            
        }];
    
    }
    
  4. ตอนนี้สร้างปุ่มในตัวควบคุมมุมมองใด ๆ และใน IBAction ใช้รหัสด้านล่าง:

    UNMutableNotificationContent *objNotificationContent = [[UNMutableNotificationContent alloc] init];
    
    objNotificationContent.title = [NSString localizedUserNotificationStringForKey:@“Notification!” arguments:nil];
    
    objNotificationContent.body = [NSString localizedUserNotificationStringForKey:@“This is local notification message!“arguments:nil];
    
    objNotificationContent.sound = [UNNotificationSound defaultSound];
    
    // 4. update application icon badge number
    objNotificationContent.badge = @([[UIApplication sharedApplication] applicationIconBadgeNumber] + 1);
    
    // Deliver the notification in five seconds.
    UNTimeIntervalNotificationTrigger *trigger =  [UNTimeIntervalNotificationTrigger                                             triggerWithTimeInterval:10.f repeats:NO];       
    
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@“ten                                                                            content:objNotificationContent trigger:trigger];
    
    // 3. schedule localNotification
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    
    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        if (!error) {
            NSLog(@“Local Notification succeeded“);
        } else {
            NSLog(@“Local Notification failed“);
        }
    }];
    

Swift 3:

  1. ในการAppDelegate.swiftใช้ไฟล์import UserNotifications
  2. ผู้ร่วมประชุมควรเป็นไปตามUNUserNotificationCenterDelegateโปรโตคอล
  3. ในdidFinishLaunchingWithOptionsการใช้งานด้านล่างรหัส

    // Override point for customization after application launch.
    let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
        // Enable or disable features based on authorization.
        if error != nil {
            print("Request authorization failed!")
        } else {
            print("Request authorization succeeded!")
            self.showAlert()
        }
    }
    
    
    func showAlert() {
        let objAlert = UIAlertController(title: "Alert", message: "Request authorization succeeded", preferredStyle: UIAlertControllerStyle.alert)
    
        objAlert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
        //self.presentViewController(objAlert, animated: true, completion: nil)
    
        UIApplication.shared().keyWindow?.rootViewController?.present(objAlert, animated: true, completion: nil)
    }
    
  4. ตอนนี้สร้างปุ่มในตัวควบคุมมุมมองใด ๆ และใน IBAction ใช้รหัสด้านล่าง:

    let content = UNMutableNotificationContent()
    content.title = NSString.localizedUserNotificationString(forKey: "Hello!", arguments: nil)
    content.body = NSString.localizedUserNotificationString(forKey: "Hello_message_body", arguments: nil)
    content.sound = UNNotificationSound.default()
    content.categoryIdentifier = "notify-test"
    
    let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false)
    let request = UNNotificationRequest.init(identifier: "notify-test", content: content, trigger: trigger)
    
    let center = UNUserNotificationCenter.current()
    center.add(request)
    

1
ฉันจำเป็นต้องให้ funcButtonIsPressed ทำงานเมื่อกดปุ่มหรือไม่? จะเกิดอะไรขึ้นหากฉันต้องการให้แอปแจ้งเตือนนั้นทุกสัปดาห์โดยค่าเริ่มต้นฉันควรเพิ่มลงใน viewDidLoad ของ VC เริ่มต้นหรือไม่
Dave G

1
นอกจากนี้ทำไมไฟล์ AppDelegate.swift ของคุณถึงทำ FinishLaunchingWithOptions สองครั้ง
Dave G

"import UserNotifications" นำเข้าสิ่งนี้ใน ViewController
iOS

52

ในไฟล์ appdelegate.m เขียนโค้ด follwing ใน applicationDidEnterBackground เพื่อรับการแจ้งเตือนในเครื่อง

- (void)applicationDidEnterBackground:(UIApplication *)application
{
   UILocalNotification *notification = [[UILocalNotification alloc]init];
   notification.repeatInterval = NSDayCalendarUnit;
   [notification setAlertBody:@"Hello world"];
   [notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]];
   [notification setTimeZone:[NSTimeZone  defaultTimeZone]];
   [application setScheduledLocalNotifications:[NSArray arrayWithObject:notification]];
}

11
เมื่อคุณกำหนดเวลาการแจ้งเตือนเพียงรายการเดียวโดยใช้ setScheduledLocalNotifications: ไม่จำเป็น มีวิธีการ ScheduleLocalNotification ที่ใช้อาร์กิวเมนต์เดียว - การแจ้งเตือนจะถูกจัดกำหนดการ developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/… :
Paul Brewczynski

16

การสร้างการแจ้งเตือนในเครื่องนั้นค่อนข้างง่าย เพียงทำตามขั้นตอนเหล่านี้

  1. ในฟังก์ชัน viewDidLoad () ขออนุญาตผู้ใช้ว่าแอปของคุณต้องการแสดงการแจ้งเตือน สำหรับสิ่งนี้เราสามารถใช้รหัสต่อไปนี้

    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: {didAllow, error in
    })
    
  2. จากนั้นคุณสามารถสร้างปุ่มจากนั้นในฟังก์ชันการทำงานคุณสามารถเขียนโค้ดต่อไปนี้เพื่อแสดงการแจ้งเตือน

    //creating the notification content
    let content = UNMutableNotificationContent()
    
    //adding title, subtitle, body and badge
    content.title = "Hey this is Simplified iOS"
    content.subtitle = "iOS Development is fun"
    content.body = "We are learning about iOS Local Notification"
    content.badge = 1
    
    //getting the notification trigger
    //it will be called after 5 seconds
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
    
    //getting the notification request
    let request = UNNotificationRequest(identifier: "SimplifiedIOSNotification", content: content, trigger: trigger)
    
    //adding the notification to notification center
    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
    
  3. การแจ้งเตือนจะปรากฏขึ้นเพียงคลิกที่ปุ่มโฮมหลังจากแตะปุ่มการแจ้งเตือน เมื่อแอปพลิเคชันอยู่เบื้องหน้าการแจ้งเตือนจะไม่ปรากฏขึ้น แต่ถ้าคุณใช้ iPhone X คุณสามารถแสดงการแจ้งเตือนได้แม้ว่าแอปจะอยู่เบื้องหน้า สำหรับสิ่งนี้คุณต้องเพิ่มผู้รับมอบสิทธิ์ที่เรียกว่าUNUserNotificationCenterDelegate

สำหรับรายละเอียดเพิ่มเติมโปรดไปที่บล็อกโพสต์นี้: บทแนะนำการแจ้งเตือนในเครื่อง iOS


เป็นไปได้ไหมที่จะแจ้งเตือนซ้ำทุกวันตามเวลาแปซิฟิกและทำซ้ำจนกว่าแอปจะเปิด?
Mitul Marsoniya

@KashfaKhan คุณช่วยบอกฉันหน่อยได้ไหมว่าวิธีใดที่จะดำเนินการเมื่อแอปอยู่ในพื้นหลังและแอปได้รับการแจ้งเตือน
ArgaPK

10

อัปเดตด้วยSwift 5โดยทั่วไปเราใช้การแจ้งเตือนในเครื่องสามประเภท

  1. การแจ้งเตือนในท้องถิ่นอย่างง่าย
  2. การแจ้งเตือนในพื้นที่พร้อมการดำเนินการ
  3. การแจ้งเตือนในพื้นที่พร้อมเนื้อหา

ซึ่งคุณสามารถส่งการแจ้งเตือนข้อความธรรมดาหรือด้วยปุ่มการดำเนินการและไฟล์แนบ

การใช้แพ็คเกจ UserNotifications ในแอปของคุณตัวอย่างต่อไปนี้ขออนุญาตการแจ้งเตือนจัดเตรียมและส่งการแจ้งเตือนตามการดำเนินการของผู้ใช้ AppDelegate เองและใช้ตัวควบคุมมุมมองที่แสดงรายการการทดสอบการแจ้งเตือนในเครื่องประเภทต่างๆ

AppDelegate

import UIKit
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    let notificationCenter = UNUserNotificationCenter.current()
    var window: UIWindow?


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

        //Confirm Delegete and request for permission
        notificationCenter.delegate = self
        let options: UNAuthorizationOptions = [.alert, .sound, .badge]
        notificationCenter.requestAuthorization(options: options) {
            (didAllow, error) in
            if !didAllow {
                print("User has declined notifications")
            }
        }

        return true
    }

    func applicationWillResignActive(_ application: UIApplication) {
    }
    func applicationDidEnterBackground(_ application: UIApplication) {
    }
    func applicationWillEnterForeground(_ application: UIApplication) {
    }
    func applicationWillTerminate(_ application: UIApplication) {
    }
    func applicationDidBecomeActive(_ application: UIApplication) {
        UIApplication.shared.applicationIconBadgeNumber = 0
    }


    //MARK: Local Notification Methods Starts here

    //Prepare New Notificaion with deatils and trigger
    func scheduleNotification(notificationType: String) {

        //Compose New Notificaion
        let content = UNMutableNotificationContent()
        let categoryIdentifire = "Delete Notification Type"
        content.sound = UNNotificationSound.default
        content.body = "This is example how to send " + notificationType
        content.badge = 1
        content.categoryIdentifier = categoryIdentifire

        //Add attachment for Notification with more content
        if (notificationType == "Local Notification with Content")
        {
            let imageName = "Apple"
            guard let imageURL = Bundle.main.url(forResource: imageName, withExtension: "png") else { return }
            let attachment = try! UNNotificationAttachment(identifier: imageName, url: imageURL, options: .none)
            content.attachments = [attachment]
        }

        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
        let identifier = "Local Notification"
        let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)

        notificationCenter.add(request) { (error) in
            if let error = error {
                print("Error \(error.localizedDescription)")
            }
        }

        //Add Action button the Notification
        if (notificationType == "Local Notification with Action")
        {
            let snoozeAction = UNNotificationAction(identifier: "Snooze", title: "Snooze", options: [])
            let deleteAction = UNNotificationAction(identifier: "DeleteAction", title: "Delete", options: [.destructive])
            let category = UNNotificationCategory(identifier: categoryIdentifire,
                                                  actions: [snoozeAction, deleteAction],
                                                  intentIdentifiers: [],
                                                  options: [])
            notificationCenter.setNotificationCategories([category])
        }
    }

    //Handle Notification Center Delegate methods
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert, .sound])
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        if response.notification.request.identifier == "Local Notification" {
            print("Handling notifications with the Local Notification Identifier")
        }
        completionHandler()
    }
}

และViewController

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    var appDelegate = UIApplication.shared.delegate as? AppDelegate
    let notifications = ["Simple Local Notification",
                         "Local Notification with Action",
                         "Local Notification with Content",]

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    // MARK: - Table view data source

     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return notifications.count
    }

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = notifications[indexPath.row]
        return cell
    }

     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let notificationType = notifications[indexPath.row]
        let alert = UIAlertController(title: "",
                                      message: "After 5 seconds " + notificationType + " will appear",
                                      preferredStyle: .alert)
        let okAction = UIAlertAction(title: "Okay, I will wait", style: .default) { (action) in
            self.appDelegate?.scheduleNotification(notificationType: notificationType)
        }
        alert.addAction(okAction)
        present(alert, animated: true, completion: nil)
    }
}

1
- (void)applicationDidEnterBackground:(UIApplication *)application
{
   UILocalNotification *notification = [[UILocalNotification alloc]init];
   notification.repeatInterval = NSDayCalendarUnit;
   [notification setAlertBody:@"Hello world"];
   [notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]];
   [notification setTimeZone:[NSTimeZone  defaultTimeZone]];
   [application setScheduledLocalNotifications:[NSArray arrayWithObject:notification]];
}

วิธีนี้ใช้งานได้แต่ใน iOS 8.0ขึ้นไปแอปพลิเคชันของคุณต้องลงทะเบียนเพื่อรับการแจ้งเตือนของผู้ใช้โดยใช้-[UIApplication registerUserNotificationSettings:]ก่อนจึงจะสามารถกำหนดเวลาและนำเสนอการแจ้งเตือนUILocalNotifications ได้อย่าลืมสิ่งนี้


- [UIApplication registerUserNotificationSettings:] จะลบล้างการตั้งค่าการแจ้งเตือนแบบพุช ดังนั้นโปรดใช้ความระมัดระวังหากใช้การแจ้งเตือนแบบพุชที่ดำเนินการได้
Avijit Nagare

0

ผู้ใช้ iOS 8 ขึ้นไปโปรดรวมสิ่งนี้ไว้ใน App delegate เพื่อให้ใช้งานได้

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)])
    {
        [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
    }

    return YES;
}

จากนั้นการเพิ่มบรรทัดของโค้ดนี้จะช่วยได้

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UILocalNotification *notification = [[UILocalNotification alloc]init];
    notification.repeatInterval = NSDayCalendarUnit;
    [notification setAlertBody:@"Hello world"];
    [notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]];
    [notification setTimeZone:[NSTimeZone  defaultTimeZone]];
    [application setScheduledLocalNotifications:[NSArray arrayWithObject:notification]];

}

0
-(void)kundanselect
{
    NSMutableArray *allControllers = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];
    NSArray *allControllersCopy = [allControllers copy];
    if ([[allControllersCopy lastObject] isKindOfClass: [kundanViewController class]]) 
    {
        [[NSNotificationCenter defaultCenter]postNotificationName:@"kundanViewControllerHide"object:nil userInfo:nil];
    }
    else
    {
        [[NSUserDefaults standardUserDefaults] setInteger:4 forKey:@"selected"];
        [self performSegueWithIdentifier:@"kundansegue" sender:self];
    }
}

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(ApparelsViewControllerHide) name:@"ApparelsViewControllerHide" object:nil];


0

ฉันสมมติว่าคุณได้ขออนุญาตและลงทะเบียนแอปของคุณเพื่อรับการแจ้งเตือน

นี่คือรหัสสำหรับสร้างการแจ้งเตือนในเครื่อง

@available(iOS 10.0, *)
    func send_Noti()
    {
        //Create content for your notification 
        let content = UNMutableNotificationContent()
        content.title = "Test"
        content.body = "This is to test triggering of notification"

        //Use it to define trigger condition
        var date = DateComponents()
        date.calendar = Calendar.current
        date.weekday = 5 //5 means Friday
        date.hour = 14 //Hour of the day
        date.minute = 10 //Minute at which it should be sent


        let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
        let uuid = UUID().uuidString
        let req = UNNotificationRequest(identifier: uuid, content: content, trigger: trigger)

        let notificationCenter = UNUserNotificationCenter.current()
        notificationCenter.add(req) { (error) in
            print(error)
        }
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.