Nearby Messages API คือ Publish-Subscription API ซึ่งช่วยให้อุปกรณ์ที่อยู่ใกล้เคียง แลกเปลี่ยนข้อมูลปริมาณน้อยได้ เมื่ออุปกรณ์เผยแพร่ข้อความแล้ว อุปกรณ์จะรับข้อความได้ ข้อความควรให้ขนาดกะทัดรัด จะรักษาประสิทธิภาพที่ดีไว้ได้ บริการนี้ไม่ได้มีไว้สำหรับการแลกเปลี่ยน วัตถุ เช่น รูปภาพและวิดีโอ
ชุดอุปกรณ์ใกล้เคียงจะกำหนดโดยการแลกเปลี่ยนโทเค็นขนาดเล็กเกิน บลูทูธและเสียงย่านความถี่ใกล้อัลตราโซนิก (ไม่ได้ยิน) เมื่ออุปกรณ์ตรวจพบโทเค็น จากอุปกรณ์ใกล้เคียง ระบบจะส่งโทเค็นไปยังเซิร์ฟเวอร์ข้อความใกล้เคียงเพื่อ ตรวจสอบความถูกต้องและดูว่ามีข้อความที่จะส่งสำหรับ การสมัครใช้บริการชุดปัจจุบัน
แอปพลิเคชันสามารถควบคุมชุดสื่อที่ใช้สำหรับการค้นหาอุปกรณ์ และ จะใช้สื่อในการออกอากาศโทเค็นและ/หรือสแกนหาโทเค็นหรือไม่ โดยค่าเริ่มต้น การออกอากาศและการสแกนจะทำบนสื่อทุกประเภท สิ่งต้องทำ การค้นพบแบบย่อยหรือสื่อ และเพื่อควบคุมว่าจะเผยแพร่หรือสแกนไหม คุณจะต้องส่งผ่านพารามิเตอร์เพิ่มเติมเมื่อสร้างสื่อเผยแพร่และ การสมัครใช้บริการ
ไลบรารีนี้ทำงานบน iOS 7 ขึ้นไป และบิลด์ที่ใช้ iOS 8 SDK
การสร้างตัวจัดการข้อความ
โค้ดนี้จะสร้างออบเจ็กต์เครื่องมือจัดการข้อความ ซึ่งช่วยให้คุณสามารถเผยแพร่และ สมัครรับข้อมูล การแลกเปลี่ยนข้อความไม่มีการตรวจสอบสิทธิ์ คุณจึงต้องระบุ คีย์ API สาธารณะสำหรับ iOS คุณสามารถสร้างบัญชีโดยใช้รายการ Google Developers Console สำหรับ โปรเจ็กต์ของคุณ
Objective-C
#import <GNSMessages.h>
GNSMessageManager *messageManager =
[[GNSMessageManager alloc] initWithAPIKey:@"API_KEY"];
Swift
let messageManager = GNSMessageManager(APIKey: "API_KEY")
การเผยแพร่ข้อความ
ข้อมูลโค้ดนี้แสดงการเผยแพร่ข้อความที่มีชื่อ สื่อเผยแพร่จะใช้งานได้ตราบใดที่ยังมีออบเจ็กต์สื่อเผยแพร่อยู่ เพื่อหยุด การเผยแพร่ ปล่อยออบเจ็กต์สื่อเผยแพร่
Objective-C
id<GNSPublication> publication =
[messageManager publicationWithMessage:[GNSMessage messageWithContent:[name dataUsingEncoding:NSUTF8StringEncoding]]];
Swift
let publication =
messageManager.publication(with: GNSMessage(content: name.data(using: .utf8)))
การสมัครรับข้อความ
ข้อมูลโค้ดนี้สาธิตการใช้ชื่อทั้งหมดที่แชร์โดย ตัวอย่างข้อมูลสื่อเผยแพร่ก่อนหน้า การสมัครใช้บริการจะมีผลตราบเท่าที่ มีออบเจ็กต์การสมัครใช้บริการอยู่ หากต้องการหยุดการสมัครใช้บริการ ให้ปล่อยการสมัครใช้บริการนั้น ออบเจ็กต์
ระบบจะเรียกตัวแฮนเดิลที่พบข้อความเมื่ออุปกรณ์ใกล้เคียงที่กำลังเผยแพร่ ข้อความที่พบ ระบบจะเรียกเครื่องจัดการข้อความที่หายไปเมื่อข้อความไม่ สังเกตได้นานขึ้น (อุปกรณ์อยู่นอกระยะสัญญาณหรือไม่เผยแพร่ ข้อความ)
Objective-C
id<GNSSubscription> subscription =
[messageManager subscriptionWithMessageFoundHandler:^(GNSMessage *message) {
// Add the name to a list for display
}
messageLostHandler:^(GNSMessage *message) {
// Remove the name from the list
}];
Swift
let subscription =
messageManager.subscription(messageFoundHandler: { (message: GNSMessage?) in
// Add the name to a list for display
},
messageLostHandler: { (message: GNSMessage?) in
// Remove the name from the list
})
สื่อ Discovery
โดยค่าเริ่มต้น ระบบจะใช้สื่อทั้ง 2 รายการนี้ (เสียงและบลูทูธ) เพื่อสำรวจสถานที่ใกล้เคียง
อุปกรณ์และสื่อทั้ง 2 ประเภทจะกระจายสัญญาณและสแกน ในบางกรณี คุณทำสิ่งต่อไปนี้ได้
จำเป็นต้องเพิ่มรายการต่อไปนี้ลงใน Info.plist
ของแอป:
หากแอปสแกนโดยใช้เสียง ให้เพิ่ม
NSMicrophoneUsageDescription
ซึ่งเป็น ข้อความอธิบายเหตุผลที่คุณจะใช้ไมโครโฟน ตัวอย่างเช่น " ไมโครโฟนจะคอยฟังโทเค็นที่ไม่ระบุตัวตนจากอุปกรณ์ใกล้เคียง"หากแอปประกาศโดยใช้ BLE ให้เพิ่ม
NSBluetoothPeripheralUsageDescription
ซึ่งเป็นสตริงที่อธิบายเหตุผลที่คุณ จะลงโฆษณาใน BLE ตัวอย่างเช่น "มีการโฆษณาโทเค็นนิรนาม ผ่านบลูทูธเพื่อค้นหาอุปกรณ์ที่อยู่ใกล้เคียง"
ในบางกรณี แอปอาจต้องใช้สื่อเพียงประเภทเดียว และ อาจไม่จำเป็นต้องทำทั้งเผยแพร่และสแกนในสื่อนั้น
ตัวอย่างเช่น แอปที่ออกแบบมาเพื่อเชื่อมต่อกับ Set-top box การประกาศด้วยเสียงก็ต้องสแกนเสียงเท่านั้น ถึงจะค้นพบได้ ดังต่อไปนี้ ข้อมูลโค้ดแสดงวิธีเผยแพร่ข้อความไปยังกล่องรับสัญญาณโดยใช้เสียงเท่านั้น การสแกนหาการค้นพบ:
Objective-C
id<GNSPublication> publication = [messageManager publicationWithMessage:message
paramsBlock:^(GNSPublicationParams *params) {
params.strategy = [GNSStrategy strategyWithParamsBlock:^(GNSStrategyParams *params) {
params.discoveryMediums = kGNSDiscoveryMediumsAudio;
params.discoveryMode = kGNSDiscoveryModeScan;
}];
}];
Swift
let publication = messageManager.publication(with: message,
paramsBlock: { (params: GNSPublicationParams?) in
guard let params = params else { return }
params.strategy = GNSStrategy(paramsBlock: { (params: GNSStrategyParams?) in
guard let params = params else { return }
params.discoveryMediums = .audio
params.discoveryMode = .scan
})
})
กำลังเปิดใช้การบันทึกการแก้ไขข้อบกพร่อง
การบันทึกการแก้ไขข้อบกพร่องจะพิมพ์เหตุการณ์ภายในที่สำคัญไปยังคอนโซลที่สามารถ มีประโยชน์ในการติดตามปัญหาที่คุณอาจพบเมื่อผสานรวม Nearby ข้อความลงในแอป เราจะขอบันทึกเหล่านี้หากคุณติดต่อเรา การสนับสนุนด้านเทคนิค
คุณควรเปิดใช้งานก่อนที่จะสร้างเครื่องมือจัดการข้อความ ข้อมูลโค้ดนี้จะแสดง วิธีเปิดใช้การบันทึกการแก้ไขข้อบกพร่อง
Objective-C
[GNSMessageManager setDebugLoggingEnabled:YES];
Swift
GNSMessageManager.setDebugLoggingEnabled(true)
การติดตามสถานะสิทธิ์ Nearby
ต้องได้รับความยินยอมจากผู้ใช้เพื่อเปิดใช้การค้นหาอุปกรณ์ ซึ่งระบุโดย
สถานะสิทธิ์ใกล้เคียง ในการโทรครั้งแรกเพื่อสร้างสื่อเผยแพร่ หรือ
การสมัครใช้บริการ ระบบจะแสดงกล่องโต้ตอบความยินยอมแก่ผู้ใช้ หากผู้ใช้ไม่
การค้นหาอุปกรณ์จะไม่ทำงาน ในกรณีนี้ แอปของคุณควรแสดง
เพื่อเตือนผู้ใช้ว่าการค้นหาอุปกรณ์ปิดใช้อยู่ สิทธิ์
สถานะจัดเก็บอยู่ใน NSUserDefaults
ข้อมูลโค้ดต่อไปนี้แสดงการติดตามสถานะสิทธิ์ มีการเรียกตัวแฮนเดิลที่เปลี่ยนสถานะสิทธิ์เมื่อมีการเปลี่ยนแปลงสถานะ และ ไม่ถูกเรียกในครั้งแรกจนกว่าผู้ใช้จะอนุญาตหรือปฏิเสธการอนุญาต ปล่อยออบเจ็กต์สิทธิ์เพื่อหยุดสมัครใช้บริการ
Objective-C
GNSPermission *nearbyPermission = [[GNSPermission alloc] initWithChangedHandler:^(BOOL granted) {
// Update the UI here
}];
Swift
let nearbyPermission = GNSPermission(changedHandler: { (granted: Bool) in
// Update the UI here
})
แอปของคุณมีวิธีให้ผู้ใช้เปลี่ยนสถานะสิทธิ์ได้ สำหรับ เช่น โดยการใช้สวิตช์สลับในหน้าการตั้งค่า
ตัวอย่างวิธีรับและตั้งสถานะสิทธิ์มีดังนี้
Objective-C
BOOL permissionState = [GNSPermission isGranted];
[GNSPermission setGranted:!permissionState]; // toggle the state
Swift
let permissionState = GNSPermission.isGranted()
GNSPermission.setGranted(!permissionState) // toggle the state
การตั้งค่าการติดตามผู้ใช้ที่มีผลกับ Nearby
หากผู้ใช้ปฏิเสธสิทธิ์เข้าถึงไมโครโฟน ปฏิเสธสิทธิ์เข้าถึงบลูทูธ หรือ ปิดบลูทูธแล้ว Nearby จะไม่ทำงานด้วยหรืออาจไม่ทำงานเลย แอปของคุณควรแสดงข้อความในกรณีเหล่านี้ เพื่อแจ้งผู้ใช้ว่า การดำเนินงานจะถูกขัดขวาง ข้อมูลโค้ดต่อไปนี้จะแสดงวิธีติดตาม ของการตั้งค่าผู้ใช้เหล่านี้โดยการส่งตัวแฮนเดิลเมื่อสร้างข้อความ เครื่องมือจัดการ:
Objective-C
GNSMessageManager *messageManager = [[GNSMessageManager alloc]
initWithAPIKey:API_KEY
paramsBlock:^(GNSMessageManagerParams *params) {
params.microphonePermissionErrorHandler = ^(BOOL hasError) {
// Update the UI for microphone permission
};
params.bluetoothPowerErrorHandler = ^(BOOL hasError) {
// Update the UI for Bluetooth power
};
params.bluetoothPermissionErrorHandler = ^(BOOL hasError) {
// Update the UI for Bluetooth permission
};
}];
Swift
let messageManager = GNSMessageManager(
APIKey: API_KEY,
paramsBlock: { (params: GNSMessageManagerParams?) in
guard let params = params else { return }
params.microphonePermissionErrorHandler = { (hasError: Bool) in
// Update the UI for microphone permission
}
params.bluetoothPowerErrorHandler = { (hasError: Bool) in
// Update the UI for Bluetooth power
}
params.bluetoothPermissionErrorHandler = { (hasError: Bool) in
// Update the UI for Bluetooth permission
}
})
การลบล้างกล่องโต้ตอบสิทธิ์ Nearby
ทั้งนี้ขึ้นอยู่กับพารามิเตอร์ที่คุณส่งไปยังสื่อเผยแพร่และการสมัครใช้บริการ iOS อาจขอสิทธิ์หลายอย่างก่อนที่จะอนุญาตให้ Nearby ทำงานได้ สำหรับ เช่น กลยุทธ์เริ่มต้นจะคอยรับข้อมูลที่ส่งผ่านคลื่นความถี่สูง ดังนั้น iOS จะขอสิทธิ์ในการใช้ไมโครโฟน ในกรณีเหล่านี้ ใกล้เคียงจะแสดง "การตรวจสอบล่วงหน้า" กล่องโต้ตอบที่อธิบายสาเหตุที่ระบบถามผู้ใช้ เพื่อให้สิทธิ์
หากคุณต้องการระบุ "การตรวจสอบล่วงหน้า" ที่กำหนดเอง ให้ตั้งค่า
permissionRequestHandler
ไปยังบล็อกที่กำหนดเองในสื่อเผยแพร่ หรือ
พารามิเตอร์การติดตาม บล็อกที่คุณกำหนดเองต้องเรียกใช้ permissionHandler
บล็อกหลังจากผู้ใช้ตอบกลับ ตัวอย่างข้อมูลต่อไปนี้แสดงวิธีดำเนินการ
สำหรับสื่อเผยแพร่
Objective-C
id<GNSPublication> publication =
[messageManager publicationWithMessage:[GNSMessage messageWithContent:[name dataUsingEncoding:NSUTF8StringEncoding]]
paramsBlock:^(GNSPublicationParams *params) {
params.permissionRequestHandler = ^(GNSPermissionHandler permissionHandler) {
// Show your custom dialog here.
// Don't forget to call permissionHandler() with YES or NO when the user dismisses it.
};
}];
Swift
let publication =
messageManager.publication(with: GNSMessage(content: name.data(using: .utf8)),
paramsBlock: { (params: GNSPublicationParams?) in
guard let params = params else { return }
params.permissionRequestHandler = { (permissionHandler: GNSPermissionHandler?) in
// Show your custom dialog here.
// Don't forget to call permissionHandler() with true or false when the user dismisses it.
}
})
การดำเนินการในเบื้องหลัง
สื่อเผยแพร่และการสมัครใช้บริการที่ใช้ BLE สำหรับการค้นพบอุปกรณ์ทำงานได้ใน พื้นหลัง สิ่งที่ควรทราบเมื่อตัดสินใจเลือกใช้มีดังนี้ โหมดพื้นหลัง:
- การดำเนินการในเบื้องหลังต้องใช้สื่อ BLE เท่านั้น ไม่รองรับเสียง
- มีค่าบริการแบตเตอรี่เพิ่มเติมสำหรับ BLE พื้นหลัง แม้ค่าใช้จ่ายจะต่ำ แต่ ควรวัดผลก่อนที่จะตัดสินใจใช้โหมดเบื้องหลัง
- iOS จะขอสิทธิ์จากผู้ใช้ในการโฆษณาผ่าน BLE ในฉากหลัง
วิธีเพิ่มโหมดเบื้องหลังลงในสื่อเผยแพร่หรือการสมัครใช้บริการ ขั้นตอน:
เปิดใช้โหมดเบื้องหลังและ BLE เท่านั้นในสื่อเผยแพร่หรือการสมัครใช้บริการของคุณภายในวันที่ กำลังส่งในออบเจ็กต์
GNSStrategy
ที่กำหนดค่าอย่างถูกต้อง ข้อมูลโค้ดต่อไปนี้ แสดงวิธีดำเนินการต่อไปนี้สำหรับการสมัครใช้บริการObjective-C
id<GNSSubscription> subscription = [messageManager subscriptionWithMessageFoundHandler:^(GNSMessage *message) { // Add the name to a list for display } messageLostHandler:^(GNSMessage *message) { // Remove the name from the list } paramsBlock:^(GNSSubscriptionParams *params) { params.strategy = [GNSStrategy strategyWithParamsBlock:^(GNSStrategyParams *params) { params.allowInBackground = YES; params.discoveryMediums = kGNSDiscoveryMediumsBLE; }]; }];
Swift
let subscription = messageManager.subscription(messageFoundHandler: { (message: GNSMessage?) in // Add the name to a list for display }, messageLostHandler: { (message: GNSMessage?) in // Remove the name from the list }, paramsBlock:{ (params: GNSSubscriptionParams?) in guard let params = params else { return } params.strategy = GNSStrategy(paramsBlock: { (params: GNSStrategyParams?) in guard let params = params else { return } params.allowInBackground = true params.discoveryMediums = .BLE }) })
เพิ่มรายการเหล่านี้ลงใน
Info.plist
ของแอปUIBackgroundModes
รายการ:bluetooth-central
สำหรับการสแกน BLE ในเบื้องหลัง ต้องใช้เท่านั้น เมื่อโหมดการค้นหารวมการสแกน โดยค่าเริ่มต้นbluetooth-peripheral
สำหรับการโฆษณา BLE ในเบื้องหลัง จำเป็น เฉพาะเมื่อโหมดการค้นหามีการออกอากาศ โดยค่าเริ่มต้น
NSBluetoothPeripheralUsageDescription
สตริงที่อธิบายเหตุผล จะลงโฆษณาใน BLE ตัวอย่างเช่น "โทเค็นที่ไม่ระบุตัวตนคือ โฆษณาผ่านบลูทูธเพื่อค้นหาอุปกรณ์ที่อยู่ใกล้เคียง" โปรดดู เอกสารประกอบของ Apple เพื่อดูรายละเอียด
ระบบอาจทำให้แอปของคุณหยุดทำงานได้ทุกเมื่อเมื่อทำงานในเบื้องหลัง ถ้า โหมดพื้นหลังคือการตั้งค่าที่ผู้ใช้สามารถเปิดหรือปิดใช้งาน ควรทำดังนี้
- บันทึกค่าของโหมดพื้นหลังเป็น
NSUserDefaults
เมื่อใดก็ตามที่ผู้ใช้ เปลี่ยนแปลง - เมื่อเริ่มต้นใช้งาน ให้อ่านจาก
NSUserDefaults
และคืนค่า Nearby สื่อเผยแพร่และ/หรือการสมัครใช้บริการหากเปิดใช้โหมดเบื้องหลัง
- บันทึกค่าของโหมดพื้นหลังเป็น
การแจ้งเตือนพื้นหลัง
หากคุณต้องการให้แอปแจ้งเตือนผู้ใช้เมื่อการสมัครใช้บริการได้รับข้อความ ในพื้นหลัง คุณสามารถใช้ การแจ้งเตือนในท้องถิ่น
ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มลงในแอป
ลงทะเบียนรับการแจ้งเตือนในท้องถิ่นเมื่อเริ่มต้นทำงาน:
Objective-C
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) { [[UIApplication sharedApplication] registerUserNotificationSettings: [UIUserNotificationSettings settingsForTypes: UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]]; }
Swift
UIApplication.shared.registerUserNotificationSettings( UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil))
ส่งการแจ้งเตือนในตัวเครื่องในตัวแฮนเดิลที่พบในข้อความของการสมัครใช้บริการของคุณ
Objective-C
GNSMessageHandler myMessageFoundHandler = ^(GNSMessage *message) { // Send a local notification if not in the foreground. if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) { UILocalNotification *localNotification = [[UILocalNotification alloc] init]; localNotification.alertBody = @"Message received"; [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification]; } // Process the new message... };
Swift
let myMessageFoundHandler: GNSMessageHandler = { (message: GNSMessage?) in // Send a local notification if not in the foreground. if UIApplication.shared.applicationState != .active { let localNotification = UILocalNotification() localNotification.alertBody = "Message received" UIApplication.shared.presentLocalNotificationNow(localNotification) } // Process the new message... }