การเชื่อมโยง App Flip ตาม OAuth (การพลิกแอป) จะเปิดแอป iOS ของคุณจากแอป Google เพื่อช่วยให้ผู้ใช้แอป Google เชื่อมโยงบัญชีของตนได้ง่ายขึ้น คุณต้องทำการเปลี่ยนแปลงโค้ดเล็กน้อยในแอป iOS เพื่อใช้งานคุณลักษณะนี้
ในเอกสารนี้ คุณจะได้เรียนรู้วิธีแก้ไขแอป iOS ของคุณเพื่อรองรับ App Flip
ลองตัวอย่าง
พลิก App แอปตัวอย่าง แสดงให้เห็นถึงการเชื่อมโยงบัญชีบูรณาการบน iOS ที่ App พลิกได้ คุณสามารถใช้แอปนี้เพื่อตรวจสอบวิธีตอบสนองต่อลิงก์สากลของ App Flip ขาเข้าจากแอปมือถือของ Google
แอปพลิเคตัวอย่างจะถูกกำหนดไว้ล่วงหน้าเพื่อบูรณาการกับ App พลิกเครื่องมือทดสอบสำหรับ iOS ซึ่งคุณสามารถใช้เพื่อตรวจสอบการรวมแอป iOS ของคุณกับ App พลิกก่อนที่คุณกำหนดค่าบัญชีเชื่อมโยงกับ Google แอปนี้จำลองลิงก์สากลที่เรียกใช้โดยแอปบนอุปกรณ์เคลื่อนที่ของ Google เมื่อเปิดใช้ App Flip
มันทำงานอย่างไร
ต่อไปนี้คือขั้นตอนโฟลว์ที่แอป Google และแอปของคุณใช้เมื่อ App Flip เกิดขึ้น:
แอป Google พยายามเปิดลิงก์สากลของแอป สามารถเปิดแอปของคุณได้หากติดตั้งไว้ในอุปกรณ์ของผู้ใช้และเชื่อมโยงกับลิงก์สากล ดู สมทบสากลลิงค์ สำหรับรายละเอียด
การตรวจสอบแอปของคุณว่า
client_id
และredirect_uri
พารามิเตอร์การเข้ารหัสใน URL ที่เข้ามาตรงกับการเชื่อมโยงของ Google สากลคาดว่าแอปของคุณขอรหัสการให้สิทธิ์จากเซิร์ฟเวอร์ OAuth2 ของคุณ เมื่อสิ้นสุดขั้นตอนนี้ แอปของคุณจะส่งคืนรหัสการให้สิทธิ์หรือข้อผิดพลาดไปยังแอป Google ในการดำเนินการนี้ จะเปิดลิงก์สากลของ Google พร้อมพารามิเตอร์เสริมสำหรับรหัสการให้สิทธิ์หรือข้อผิดพลาด
แอป Google จัดการลิงก์สากลขาเข้าของ Google และดำเนินการต่อไปในโฟลว์ที่เหลือ หากมีการระบุรหัสการให้สิทธิ์ การเชื่อมโยงจะเสร็จสมบูรณ์ทันที การแลกเปลี่ยนโทเค็นเกิดขึ้นระหว่างเซิร์ฟเวอร์กับเซิร์ฟเวอร์ เช่นเดียวกับที่ทำในโฟลว์การเชื่อมโยง OAuth บนเบราว์เซอร์ หากมีการส่งคืนรหัสข้อผิดพลาด โฟลว์การลิงก์จะดำเนินต่อไปด้วยตัวเลือกอื่น
แก้ไขแอพ iOS ของคุณเพื่อรองรับ App Flip
เพื่อรองรับ App Flip ให้ทำการเปลี่ยนแปลงโค้ดต่อไปนี้ในแอป iOS ของคุณ:
- จับ
NSUserActivityTypeBrowsingWeb
ใน App ของคุณแทน - จับ
redirect_uri
และstate
พารามิเตอร์จาก URL เพื่อใช้ในภายหลัง - ตรวจสอบว่า
redirect_uri
ตรงกับรูปแบบนี้:https://oauth-redirect.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID https://oauth-redirect-sandbox.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
ตรวจสอบว่ารหัสลูกค้าตรงกับค่าที่คาดไว้ ใช้ตัวอย่างโค้ดต่อไปนี้:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let incomingURL = userActivity.webpageURL, let components = URLComponents(url: incomingURL, resolvingAgainstBaseURL: false), let params = components.queryItems else { return false } if let clientId = params.filter({$0.name == "client_id"}).first?.value, let state = params.filter({$0.name == "state"}).first?.value, let redirectUri = params.filter({$0.name == "redirect_uri"}).first?.value { // Save the redirect_uri and state for later... // Verify the client id return (clientId == GOOGLE_CLIENT_ID) } else { // Missing required parameters return false } }
เมื่อให้สิทธิ์สำเร็จแล้ว ให้เรียก URI การเปลี่ยนเส้นทางด้วยรหัสการให้สิทธิ์ ใช้ตัวอย่างโค้ดต่อไปนี้:
func returnAuthCode(code: String, state: String, redirectUri: String) { var redirectURL = URL(string: redirectUri) var components = URLComponents(url: redirectURL, resolvingAgainstBaseURL: false) // Return the authorization code and original state let paramAuthCode = URLQueryItem(name: "code", value: code) let paramState = URLQueryItem(name: "state", value: state) components?.queryItems = [paramAuthCode, paramState] if let resultURL = components?.url { UIApplication.shared.open( resultURL, options: [UIApplicationOpenURLOptionUniversalLinksOnly : true], completionHandler: nil) } }
หากเกิดข้อผิดพลาด ให้แนบผลลัพธ์ข้อผิดพลาดกับ URI การเปลี่ยนเส้นทางแทน ใช้ตัวอย่างโค้ดต่อไปนี้:
func returnError(redirectUri: String) { var redirectURL = URL(string: redirectUri) var components = URLComponents(url: redirectURL, resolvingAgainstBaseURL: false) // Return the authorization code and original state let paramError = URLQueryItem(name: "error", value: "invalid_request") let paramDescription = URLQueryItem(name: "error_description", value: "Invalid Request") components?.queryItems = [paramError, paramDescription] if let resultURL = components?.url { UIApplication.shared.open( resultURL, options: [UIApplicationOpenURLOptionUniversalLinksOnly : true], completionHandler: nil) } }
พารามิเตอร์การค้นหาสำหรับลิงก์สากลของแอปของคุณ
เมื่อเปิดโดยแอป Google ลิงก์สากลของแอปจะมีพารามิเตอร์การค้นหาต่อไปนี้
-
client_id
(String
): Googleclient_id
ว่าจดทะเบียนภายใต้แอปของคุณ -
scope
(List of String
): รายชื่อของขอบเขตพื้นที่แยกร้องขอ -
state
(String
): เป็น nonce Google ใช้เพื่อตรวจสอบว่าผลการอนุมัติในการตอบสนองต่อการร้องขอขาออกของ Google -
redirect_uri
(String
): การเชื่อมโยงแบบสากลของ Google URI "พลิก" เพื่อเปิดแอป Google และผ่านผลลัพธ์
พารามิเตอร์การค้นหาสำหรับลิงก์สากลของ Google
พารามิเตอร์ที่ใช้เมื่อส่งคืนผลการอนุญาตสำเร็จ:
-
code
(String
): ค่าของรหัสการให้สิทธิ์หากมี -
state
(String
): มูลค่าที่แน่นอนที่ได้รับจากการเชื่อมโยงที่เป็นสากลเข้ามา
พารามิเตอร์ที่ใช้เมื่อส่งคืนผลการอนุญาตไม่สำเร็จ:
error
(String
) ที่มีค่าต่อไปนี้:-
cancelled
: ข้อผิดพลาดจะได้รับคืน แอป Google จะพยายามเชื่อมโยงบัญชีโดยใช้ URL การให้สิทธิ์ ตัวอย่างบางส่วน ได้แก่ ผู้ใช้ลงชื่อเข้าใช้ไม่สำเร็จ อุปกรณ์กำลังออฟไลน์ หรือการเชื่อมต่อหมดเวลา -
unrecoverable
: มีข้อผิดพลาด ตัวอย่างเช่น ผู้ใช้พยายามเชื่อมโยงกับบัญชีที่ถูกปิดใช้งาน แอป Google จะยกเลิกการลิงก์บัญชี -
invalid_request
: การร้องขอพารามิเตอร์ไม่ถูกต้องหรือขาดหายไป นี่เป็นข้อผิดพลาดที่สามารถกู้คืนได้ แอป Google จะพยายามเชื่อมโยงบัญชีโดยใช้ URL การให้สิทธิ์ -
access_denied
: ผู้ใช้ปฏิเสธการร้องขอความยินยอม นี่เป็นข้อผิดพลาดที่ไม่สามารถกู้คืนได้ แอป Google ยกเลิกการเชื่อมโยง
-
error_description
(String
, ตัวเลือก): ข้อผิดพลาดที่ใช้งานง่าย
สำหรับทุกประเภทความผิดพลาดคุณจะต้องกลับข้อมูลการตอบสนองในการระบุ REDIRECT_URI
เพื่อให้แน่ใจว่าทางเลือกที่เหมาะสม trigerred
แก้ไขปลายทางการให้สิทธิ์ของคุณเพื่อรองรับ App Flip
กำหนดค่าแพลตฟอร์มของคุณให้ยอมรับคำขอโดยใช้ URL เปลี่ยนเส้นทาง App Flip ของ Google:
- หน้าแรกของ Google แอป
https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast.dev https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast.enterprise https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast.dev https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast.enterprise https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast
- Google ช่วยแอป
https://oauth-redirect.googleusercontent.com/a/com.google.OPA.dev https://oauth-redirect.googleusercontent.com/a/com.google.OPA.enterprise https://oauth-redirect.googleusercontent.com/a/com.google.OPA https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA.dev https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA.enterprise https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA
ตรวจสอบว่า client_id
และ URL ที่ระบุโดย redirect_uri
พารามิเตอร์ตรงกับค่าคาดว่าเมื่อมีการร้องขอจะได้รับ ถ้าการตรวจสอบลูกค้าไม่กลับข้อผิดพลาด invalid_request
ไป redirect_uri