App Flip สำหรับ iOS

เมื่อติดตั้งใช้งาน OAuth 2.0 แล้ว คุณจะเลือกกำหนดค่า App Flip ที่ใช้ OAuth ได้ ซึ่งจะช่วยให้ผู้ใช้ iOS ลิงก์บัญชีในระบบการตรวจสอบสิทธิ์กับบัญชี Google ได้เร็วขึ้น ส่วนต่อไปนี้จะอธิบายวิธีออกแบบและใช้ App Flip สำหรับการผสานรวม Cloud-to-cloud ใน iOS

หลักเกณฑ์การออกแบบ

ส่วนนี้อธิบายข้อกำหนดและคำแนะนำในการออกแบบหน้าจอขอความยินยอมในการลิงก์บัญชี App Flip หลังจากที่ Google เรียกใช้แอปของคุณแล้ว แอปจะแสดงหน้าจอขอความยินยอมต่อผู้ใช้

ข้อกำหนด

  1. คุณต้องมีข้อความการให้สิทธิ์ของ Google เช่น "เมื่อลิงก์แล้ว Google จะมีสิทธิ์ควบคุมอุปกรณ์ของคุณ"
  2. คุณต้องแจ้งให้ผู้ใช้ทราบว่าบัญชีของผู้ใช้จะลิงก์กับ Google ไม่ใช่ผลิตภัณฑ์ Google ที่เฉพาะเจาะจง เช่น Google Home หรือ Google Assistant
  3. คุณต้องระบุคำกระตุ้นให้ดำเนินการที่ชัดเจนในหน้าจอความยินยอม และใช้คำว่า "ยอมรับและลิงก์" สำหรับการดำเนินการลิงก์ เนื่องจาก ผู้ใช้ต้องเข้าใจว่าตนเองต้องแชร์ข้อมูลใดกับ Google เพื่อ ลิงก์บัญชี
  4. คุณต้องระบุวิธีให้ผู้ใช้ย้อนกลับ ปฏิเสธ หรือยกเลิก หากผู้ใช้เลือกที่จะไม่ลิงก์ ใช้คำว่า "ยกเลิก" สำหรับการดำเนินการยกเลิก
  5. คุณต้องใช้เวิร์กโฟลว์นี้: หลังจากคลิก "ยอมรับและลิงก์" คุณต้องแสดงการลิงก์สำเร็จและเปลี่ยนเส้นทางผู้ใช้กลับไปที่แอป Google Home โดยอัตโนมัติ ตอนนี้ผู้ใช้ควรเห็นอุปกรณ์ที่ลิงก์ในแอป Google Home พร้อมกับการดำเนินการของคุณ หลังจากคลิก "ยกเลิก" คุณควรเปลี่ยนเส้นทางผู้ใช้ กลับไปที่แอป Google Home

คำแนะนำ

เราขอแนะนำให้คุณทำดังนี้

  1. แสดงนโยบายความเป็นส่วนตัวของ Google ระบุลิงก์ไปยังนโยบายความเป็นส่วนตัวของ Google ในหน้าจอขอความยินยอม

  2. ข้อมูลที่จะแชร์ ใช้ภาษาที่ชัดเจนและกระชับเพื่อบอกผู้ใช้ว่า Google ต้องการข้อมูลใดของผู้ใช้และเพราะเหตุใด

  3. ความสามารถในการยกเลิกการลิงก์ มีกลไกให้ผู้ใช้ยกเลิกการลิงก์ เช่น URL ไปยังการตั้งค่าบัญชีในแพลตฟอร์มของคุณ หรือคุณจะใส่ลิงก์ไปยังบัญชี Google ที่ผู้ใช้ สามารถจัดการบัญชีที่ลิงก์ได้ก็ได้

  4. ความสามารถในการเปลี่ยนบัญชีผู้ใช้ แนะนำวิธีให้ผู้ใช้เปลี่ยน บัญชี ซึ่งจะเป็นประโยชน์อย่างยิ่งหากผู้ใช้มีแนวโน้มที่จะมี หลายบัญชี

    • หากผู้ใช้ต้องปิดหน้าจอขอความยินยอมเพื่อเปลี่ยนบัญชี ให้ส่งข้อผิดพลาดที่กู้คืนได้ไปยัง Google เพื่อให้ผู้ใช้ลงชื่อเข้าใช้บัญชีที่ต้องการได้ด้วยการลิงก์ OAuth และโฟลว์โดยนัย
  5. ใส่โลโก้ของคุณ แสดงโลโก้บริษัทในหน้าจอคำยินยอม ใช้หลักเกณฑ์ด้านสไตล์เพื่อวางโลโก้ หากต้องการแสดงโลโก้ของ Google ด้วย โปรดดูโลโก้และเครื่องหมายการค้า

รูปนี้แสดงตัวอย่างหน้าจอคำยินยอมพร้อมคำอธิบายข้อกำหนดและคำแนะนำแต่ละรายการที่ควรปฏิบัติตามเมื่อออกแบบหน้าจอคำยินยอมของผู้ใช้
รูปที่ 1: หลักเกณฑ์การออกแบบหน้าจอขอความยินยอมในการลิงก์บัญชี

ตั้งค่าสำหรับ App Flip ที่ใช้ OAuth

ส่วนต่อไปนี้จะอธิบายข้อกำหนดเบื้องต้นสำหรับ App Flip ที่ใช้ OAuth และวิธีกำหนดค่าโปรเจ็กต์ App Flip ใน Google Home Developer Console

สร้างการผสานรวมแบบ Cloud-to-cloud และตั้งค่าเซิร์ฟเวอร์ OAuth 2.0

ก่อนที่จะกำหนดค่า App Flip คุณต้องทำสิ่งต่อไปนี้

กำหนดค่า App Flip ใน Developer Console

ส่วนต่อไปนี้อธิบายวิธีกำหนดค่า App Flip ใน Developer Console

  1. กรอกข้อมูลในช่องทั้งหมดในส่วนข้อมูลไคลเอ็นต์ OAuth (หากไม่รองรับ App Flip ระบบจะใช้ OAuth ปกติเป็นตัวเลือกสำรอง)
  2. ในส่วนใช้แอปเพื่อลิงก์บัญชี(ไม่บังคับ) ให้เลือกเปิดใช้สําหรับ iOS
  3. กรอกข้อมูลในช่อง Universal Link ดูข้อมูลเพิ่มเติมเกี่ยวกับ Universal Link ได้ที่การอนุญาตให้แอปและเว็บไซต์ลิงก์ไปยังเนื้อหาของคุณ
  4. หากต้องการกำหนดค่าไคลเอ็นต์ (ไม่บังคับ) ให้เพิ่มขอบเขตและคลิกเพิ่มขอบเขตในส่วนกำหนดค่าไคลเอ็นต์ (ไม่บังคับ)
  5. คลิกบันทึก

ตอนนี้คุณสามารถไปยังส่วนถัดไปเพื่อติดตั้งใช้งาน App Flip ในแอป iOS ได้แล้ว

ติดตั้งใช้งาน App Flip ในแอปที่มาพร้อมเครื่อง

หากต้องการใช้ App Flip คุณต้องแก้ไขรหัสการให้สิทธิ์ผู้ใช้ในแอปเพื่อยอมรับ Deep Link จาก Google

การลิงก์ App Flip ที่ใช้ OAuth (App Flip) จะเปิดแอป iOS จากแอป Google เพื่อช่วยให้ผู้ใช้แอป Google ลิงก์บัญชีได้ง่ายขึ้น คุณต้องทำการเปลี่ยนแปลงโค้ดเล็กน้อยในแอป iOS เพื่อใช้ฟีเจอร์นี้

ในเอกสารนี้ คุณจะได้เรียนรู้วิธีแก้ไขแอป iOS เพื่อรองรับ App Flip

ลองใช้ตัวอย่าง

แอปตัวอย่างของ App Flip แสดงการผสานรวมการลิงก์บัญชีใน iOS ที่เข้ากันได้กับ App Flip คุณใช้แอปนี้เพื่อยืนยันวิธีตอบสนองต่อ Universal Link ของ App Flip ที่เข้ามาจากแอปบนอุปกรณ์เคลื่อนที่ของ Google ได้

แอปตัวอย่างได้รับการกำหนดค่าล่วงหน้าให้ผสานรวมกับเครื่องมือทดสอบ App Flip สำหรับ iOS ซึ่งคุณสามารถใช้เพื่อยืนยันการผสานรวมแอป iOS กับ App Flip ก่อนกำหนดค่าการลิงก์บัญชีกับ Google แอปนี้จำลอง Universal Link ที่แอปบนอุปกรณ์เคลื่อนที่ของ Google เรียกใช้เมื่อเปิดใช้ App Flip

วิธีการทำงาน

ขั้นตอนต่อไปนี้คือขั้นตอนที่แอป Google และแอปของคุณดำเนินการเมื่อเกิด App Flip

  1. แอป Google จะพยายามเปิด Universal Link ของแอป ซึ่งจะเปิดแอปได้หากติดตั้งอยู่ในอุปกรณ์ของผู้ใช้และเชื่อมโยงกับ Universal Link ดูรายละเอียดได้ที่การรองรับ Universal Link

  2. แอปของคุณจะตรวจสอบว่าพารามิเตอร์ client_id และ redirect_uri ที่เข้ารหัสใน URL ขาเข้าตรงกับ Universal Link ของ Google ที่คาดไว้

  3. แอปของคุณจะขอรหัสการให้สิทธิ์จากเซิร์ฟเวอร์ OAuth2 เมื่อสิ้นสุดขั้นตอนนี้ แอปของคุณจะแสดงรหัสการให้สิทธิ์หรือข้อผิดพลาดต่อแอป Google โดยจะเปิด Universal Link ของ Google พร้อมพารามิเตอร์ที่เพิ่มต่อท้ายสำหรับรหัสการให้สิทธิ์หรือข้อผิดพลาด

  4. แอป Google จะจัดการ Universal Link ของ Google ที่เข้ามาและดำเนินการตามขั้นตอนที่เหลือต่อไป หากมีการระบุรหัสการให้สิทธิ์ การลิงก์จะเสร็จสมบูรณ์ทันที การแลกเปลี่ยนโทเค็นจะเกิดขึ้นระหว่างเซิร์ฟเวอร์ต่อเซิร์ฟเวอร์ เช่นเดียวกับที่เกิดขึ้นในขั้นตอนการลิงก์ OAuth ในเบราว์เซอร์ หากระบบแสดงรหัสข้อผิดพลาด ขั้นตอนการลิงก์จะดำเนินต่อไปด้วยตัวเลือกอื่น

แก้ไขแอป iOS เพื่อรองรับ App Flip

หากต้องการรองรับ App Flip ให้ทำการเปลี่ยนแปลงโค้ดต่อไปนี้ในแอป iOS

  1. จัดการ NSUserActivityTypeBrowsingWeb ใน App Delegate
  2. บันทึกพารามิเตอร์ redirect_uri และ state จาก URL เพื่อใช้ในภายหลัง
  3. ตรวจสอบว่า redirect_uri ตรงกับรูปแบบนี้
    https://oauth-redirect.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
    https://oauth-redirect-sandbox.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
  4. ตรวจสอบว่ารหัสไคลเอ็นต์ตรงกับค่าที่คาดไว้ ใช้ตัวอย่างโค้ดต่อไปนี้

    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
        }
    }
    
  5. เมื่อให้สิทธิ์สำเร็จแล้ว ให้เรียกใช้ 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)
        }
    }
    
  6. หากเกิดข้อผิดพลาด ให้แนบผลลัพธ์ข้อผิดพลาดกับ 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 แล้ว Universal Link ของแอปจะมีพารามิเตอร์การค้นหาต่อไปนี้

  • client_id (String): client_id ของ Google ที่ลงทะเบียนไว้ภายใต้แอปของคุณ
  • scope (List of String): รายการขอบเขตที่ขอซึ่งคั่นด้วยเว้นวรรค
  • state (String): Nonce ที่ Google ใช้เพื่อยืนยันว่าผลลัพธ์การให้สิทธิ์เป็นการตอบสนองต่อคำขอขาออกของ Google
  • redirect_uri (String): Universal Link ของ Google URI "พลิก" เพื่อเปิดแอป Google และส่งผลลัพธ์

พารามิเตอร์ที่ใช้เมื่อแสดงผลการให้สิทธิ์สำเร็จมีดังนี้

  • code (String): ค่าของรหัสการให้สิทธิ์ (หากมี)
  • state (String): ค่าที่แน่นอนที่ได้รับจาก Universal Link ขาเข้า

พารามิเตอร์ที่ใช้เมื่อผลการให้สิทธิ์แสดงผลไม่สำเร็จ

  • error (String) โดยมีค่าต่อไปนี้

    • cancelled: ข้อผิดพลาดที่กู้คืนได้ แอป Google จะพยายามลิงก์บัญชีโดยใช้ URL การให้สิทธิ์ ตัวอย่างเช่น ผู้ใช้ลงชื่อเข้าใช้ไม่สำเร็จ อุปกรณ์ออฟไลน์ หรือการเชื่อมต่อหมดเวลา
    • unrecoverable: ข้อผิดพลาดที่กู้คืนไม่ได้ ตัวอย่างเช่น ผู้ใช้พยายามลิงก์กับบัญชีที่ปิดใช้ แอป Google จะยกเลิกการลิงก์บัญชี
    • invalid_request: พารามิเตอร์คำขอไม่ถูกต้องหรือขาดหายไป ข้อผิดพลาดนี้สามารถกู้คืนได้ แอป Google จะพยายามลิงก์บัญชีโดยใช้ URL การให้สิทธิ์
    • access_denied: ผู้ใช้ปฏิเสธคำขอความยินยอม ข้อผิดพลาดนี้ไม่สามารถกู้คืนได้ แอป Google จะยกเลิกการลิงก์
  • error_description (String, ไม่บังคับ): ข้อความแสดงข้อผิดพลาดที่เข้าใจง่าย

สำหรับข้อผิดพลาดทุกประเภท คุณต้องส่งคืนข้อมูลการตอบกลับไปยัง REDIRECT_URI ที่ระบุเพื่อให้แน่ใจว่ามีการเรียกใช้โฆษณาสำรองที่เหมาะสม

แก้ไขปลายทางการให้สิทธิ์เพื่อรองรับ App Flip

กำหนดค่าแพลตฟอร์มให้ยอมรับคำขอโดยใช้ URL เปลี่ยนเส้นทาง App Flip ของ Google ดังนี้

  • แอป Google Home
    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 Assistant
    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
    

สำหรับการลิงก์บัญชีสมาร์ทโฮมของ Google Home app (GHA) จะใช้ URL การเปลี่ยนเส้นทาง com.google.Chromecast โปรดตรวจสอบว่าเซิร์ฟเวอร์การให้สิทธิ์ของคุณอนุญาต URL การเปลี่ยนเส้นทางเหล่านี้

ตรวจสอบว่า client_id และ URL ที่ระบุโดยพารามิเตอร์ redirect_uri ตรงกับค่าที่คาดไว้เมื่อได้รับคำขอ หากการยืนยันไคลเอ็นต์ไม่สำเร็จ ให้แสดงข้อผิดพลาด invalid_request ต่อ redirect_uri

ทดสอบ App Flip ในอุปกรณ์

เมื่อสร้างการผสานรวมระบบคลาวด์กับระบบคลาวด์และกำหนดค่า App Flip ในคอนโซลและในแอปแล้ว คุณจะทดสอบ App Flip ในอุปกรณ์เคลื่อนที่ได้ คุณใช้แอป Google Home เพื่อทดสอบ App Flip ได้

หากต้องการทดสอบ App Flip จากแอป Google Home ให้ทำตามขั้นตอนต่อไปนี้

  1. ไปที่ Developer Console แล้วเลือกโปรเจ็กต์
  2. ไปที่ระบบที่เชื่อมต่อระหว่างระบบคลาวด์ > ทดสอบ
  3. เรียกใช้ขั้นตอนการลิงก์บัญชีจากแอป Home โดยทำดังนี้
    1. เปิด Google Home app (GHA)
    2. คลิกปุ่ม +
    3. คลิกตั้งค่าอุปกรณ์
    4. คลิกหากมีรายการที่ตั้งค่าไว้แล้ว
    5. เลือกการผสานรวมระบบคลาวด์กับระบบคลาวด์จากรายชื่อผู้ให้บริการ โดยจะมีคำนำหน้าว่า "[test]" ในรายการ เมื่อเลือกการผสานรวม [ทดสอบ] จากรายการ ระบบควรเปิดแอปของคุณ
    6. ยืนยันว่าแอปเปิดขึ้นแล้วและเริ่มทดสอบขั้นตอนการให้สิทธิ์