App Flip สําหรับ iOS

การเชื่อมโยง 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 เกิดขึ้น:

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

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

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

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

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

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

  1. จับ NSUserActivityTypeBrowsingWeb ใน App ของคุณแทน
  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 ลิงก์สากลของแอปจะมีพารามิเตอร์การค้นหาต่อไปนี้

  • client_id ( String ): Google client_id ว่าจดทะเบียนภายใต้แอปของคุณ
  • scope ( List of String ): รายชื่อของขอบเขตพื้นที่แยกร้องขอ
  • state ( String ): เป็น nonce Google ใช้เพื่อตรวจสอบว่าผลการอนุมัติในการตอบสนองต่อการร้องขอขาออกของ Google
  • redirect_uri ( String ): การเชื่อมโยงแบบสากลของ Google URI "พลิก" เพื่อเปิดแอป 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