Skip to content

hyun99999/loginWithAppleTutorial-iOS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

6 Commits
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

loginWithAppleTutorial-iOS

๐Ÿงƒ Login tutorial using Apple REST API

1. Capability ์ถ”๊ฐ€

  • ํ”„๋กœ์ ํŠธ์—์„œ Signing & Capabilities ์—์„œ Sign in with Apple ์ถ”๊ฐ€ํ•œ๋‹ค.

1

2. Apple Developer ์— App ID, Service ID, Key ๋“ฑ๋ก

  • App ID ๋ฅผ ๋“ฑ๋กํ•ด์ค€๋‹ค.
  • Sign In with Apple ์ฒดํฌํ•ด์ค€๋‹ค.

2

  • ์œ„์™€ ๊ฐ™์ด Service ID ๋„ ๋“ฑ๋กํ•ด์ค€๋‹ค.

  • Key ๋„ ๋“ฑ๋กํ•ด์ค€๋‹ค.

์„œ๋ฒ„์—์„œ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ๋“ค์„ ์„ธํŒ…ํ•ด์ค€๋‹ค. ์•„๋ž˜์˜ ๋งํฌ์—์„œ apple developer ์—์„œ ์„ธํŒ…์š”์†Œ๋“ค์ด ์†Œ๊ฐœ๋œ๋‹ค.

passport-apple ๋กœ ์›น์—์„œ ์• ํ”Œ๋กœ๊ทธ์ธ ์—ฐ๋™

3. ๋ฒ„ํŠผ ์ถ”๊ฐ€ํ•˜๊ธฐ

Buttons - Sign in with Apple - Human Interface Guidelines - Apple Developer

Using the System-Provided Buttons

  • ์‹œ์Šคํ…œ์ด ์ œ๊ณตํ•˜๋Š” ๋ฒ„ํŠผ์„ ํ†ตํ•ด์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  1. ์• ํ”Œ์ด ์Šน์ธํ•˜๋Š” ๋ชจ์–‘์„ ๊ฐ€์ง„ ๋ฒ„ํŠผ
  2. style ์„ ๋ฐ”๊พธ๋”๋ผ๋„ ์ด์ƒ์ ์ธ ๋น„์œจ
  3. ๊ธฐ๊ธฐ์—์„œ ์ง€์ •ํ•œ ์–ธ์–ด๋กœ ํƒ€์ดํ‹€์„ ์ง€์›
  4. UI ์™€ ์ผ์น˜ํ•˜๋„๋ก ๋ฒ„ํŠผ์˜ corner radius ์ง€์›
  5. VoiceOver ๊ฐ€ ๋ฒ„ํŠผ์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋Œ€์ฒด๊ฐ€๋Šฅ ํ…์ŠคํŠธ ๋ ˆ์ด๋ธ”
  • ํ”Œ๋ ›ํผ์— ๋”ฐ๋ผ์„œ ์ตœ๋Œ€ 3๊ฐœ๊นŒ์ง€ ASAuthorizationAppleIDButton ๋ฒ„ํŠผํƒ€์ž…์„ ํ†ตํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„ํŠผ ํƒ€์ดํ‹€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.(์•„๋ž˜๋Š” iOS, macOS, tvOS, and the web์˜ ๊ฒฝ์šฐ. watchOS ๋Š” ํ•œ๊ฐœ๋‹ค.)

ASAuthorizationAppleIDButton.ButtonType

:signin(default), signup, continue

3

ASAuthorizationAppleIDButton.Style

:white, white with an outline, and black

4

5

6

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘ฅ๊ทผ ๋ชจ์„œ๋ฆฌ๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด๋Š” corner radius ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

7

Creating a Custom Sign in with Apple Button

  • ํ•„์š”์— ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปค์Šคํ…€ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

8

Apple Design Resources

Apple Design Resources ์—์„œ ๋‹ค์šด๊ฐ€๋Šฅํ•œ Apple logo artwork ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.(a logo only or a logo and text)

9

logo files ๋Š” PNG, SVG, PDF ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ณ  ๊ฒ€์ •๊ณผ ํ•˜์–‘ ๋ฒ„์ „์„ ํฌํ•จํ•˜๋Š” ๋ฒ„ํŠผ์˜ ํƒ€์ž…์„ ๊ฐ€์ง„๋‹ค.

์˜ˆ์‹œ)

10

logo artwork ๋ฅผ ์œ„์˜ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ์ปค์Šคํ…€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ช‡๊ฐ€์ง€ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผํ•œ๋‹ค.

  • Use the logo file to position the Apple logo in a button; never use the Apple logo as a button.
  • Match the height of the logo file to the height of the button.
  • Donโ€™t crop the logo file.
  • Donโ€™t add vertical padding.

์‹œ์Šคํ…œ์ด ์ œ๊ณตํ•˜๋Š” ๋ฒ„ํŠผ๊ณผ ์‹œ๊ฐ์ ์œผ๋กœ ์ผ์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ์˜ ์†์„ฑ์€ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

  • Titles. Use onlyย Sign in with Apple,ย Sign up with Apple, orย Continue with Apple.
  • General shape. Buttons that combine the logo with text are always rectangular; logo-only buttons can be circular or rectangular.
  • Logo and title colors. Within a button, both items must be either black or white; donโ€™t use custom colors.

์•ฑ ๋””์ž์ธ์— ๋งž๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ€๋ถ„์€ ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

  • Title font. You can also adjust the fontโ€™s weight and size.
  • Title case. You can capitalize every letter in the title.
  • Background appearance. The overall color should remain black or white. If necessary, you can include a subtle texture or gradient to help the button harmonize with your interface.
  • Button corner radius. You can use a corner radius value that matches the other buttons in your UI.
  • Button bezel and shadow. For example, you can use a stroke to emphasize the button bezel or add a drop shadow.

Custom Buttons with a Logo and Text

๋ฒ„ํŠผ์˜ ๋†’์ด์— ๋”ฐ๋ผ logi file ํ˜•์‹์„ ์„ ํƒํ•ด๋ผ. iOS ์—์„œ ๊ถŒ์žฅํ•˜๋Š” ๊ธฐ๋ณธ ๋ฒ„ํŠผ๋†’์ด์ธ 44ํฌ์ธํŠธ์˜ ๊ฒฝ์šฐ์—๋งŒ PNG ํŒŒ์ผ์„ ์‚ฌ์šฉํ•œ๋‹ค. logos ๋Š” ํฌ๊ธฐ๊ฐ€ small, medium, large ์‚ฌ์ด์ฆˆ๊ฐ€ ์žˆ์œผ๋‹ˆ๊นŒ ๋ชจ๋“  sign-up ๋ฒ„ํŠผ์— ๋งค์น˜๊ฐ€๋Šฅํ•˜๋‹ค.

ํƒ€์ดํ‹€์— ์‹œ์Šคํ…œ ํฐํŠธ๋ฅผ ์„ ํ˜ธํ•ด๋ผ. ๋ฌด์Šจ ํฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ title ๊ณผ custom button ์˜ ๋†’์ด๋Š” system ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณ  ๋™์ผํ•œ ๋น„์œจ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ์Šคํ…œ ๊ธ€๊ผด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ œ๋ชฉ์˜ ๊ธ€๊ผด ํฌ๊ธฐ๋Š” ๋ฒ„ํŠผ ๋†’์ด์˜ 43% ์—ฌ์•ผ ํ•œ๋‹ค. ์ฆ‰, ๋ฒ„ํŠผ ๋†’์ด๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •์ˆ˜๋กœ ๋ฐ˜์˜ฌ๋ฆผ๋œ ์ œ๋ชฉ ๊ธ€๊ผด ํฌ๊ธฐ์˜ 233% ์—ฌ์•ผ ํ•œ๋‹ค. ๋‹ค์Œ์€ ์„œ๋กœ ๋‹ค๋ฅธ ํฌ๊ธฐ์˜ ์‹œ์Šคํ…œ ๊ธ€๊ผด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์œจ์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์‹œ์ด๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-07-15 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 1 51 28

์ผ๋ฐ˜์ ์œผ๋กœ, ๋Œ€๋ฌธ์ž ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•ด๋ผ. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ฒ„ํŠผ์˜ Sign ๋˜๋Š” Continue ์™€ ๊ฐ™์€ ์ฒซ๋ฒˆ์งธ ๋‹จ์–ด์™€ Apple ์„ ๋Œ€๋ฌธ์ž˜ ํ‘œ์‹œํ•œ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฌธ์ž๋Š” ์†Œ๋ฌธ์ž์ด๋‹ค.

๋ฒ„ํŠผ ๋‚ด์—์„œ tile ๊ณผ logo ๋Š” ์ˆ˜์ง ์ •๋ ฌ. ๋จผ์ € title ์„ ๊ฐ€์šด๋ฐ์— ์ˆ˜์ง์ •๋ ฌํ•˜๊ณ , logo image ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋†’์ด๊ฐ€ ๋ฒ„ํŠผ ๋†’์ด์™€ ์ผ์น˜ํ•˜๋Š” ํ™•์ธํ•œ๋‹ค. logo image ๊ฐ€ ์ƒ๋‹จ, ํ•˜๋‹จ ํŒจ๋”ฉ์ด ํฌํ•จ๋˜์—ˆ์Œ์œผ๋กœ ์ œ๋ชฉ์„ ์„ธ๋กœ๋กœ ์ •๋ ฌํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ ฌ๋˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ logo ๋ฅผ ์‚ฝ์ž…ํ•ด๋ผ. Apple logo ๋ฅผ ๋‹ค๋ฅธ ์ธ์ฆ๋กœ๊ณ ์™€ ์ˆ˜ํ‰์œผ๋กœ ์ •๋ ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ logo ์™€ button ์•ž์ชฝ leading edge ์‚ฌ์ด์˜ ๊ณต๊ฐ„์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

title ๊ณผ button ์˜ right edge ์˜ ์—ฌ๋ฐฑ์„ ์ตœ์†Œํ•œ์œผ๋กœ ์œ ์ง€ํ•ด๋ผ. ์—ฌ๋ฐฑ์€ ๋ฒ„ํŠผ ๋„ˆ๋น„์œผ ์ตœ์†Œ 8% ๋ฅผ ์ธก์ •ํ•ด์•ผ ํ•œ๋‹ค.

์ตœ์†Œ button ์‚ฌ์ด์ฆˆ์™€ button ์ฃผ๋ณ€ ์—ฌ๋ฐฑ์„ ์œ ์ง€ํ•ด๋ผ. button title ์€ locale ์— ๋”ฐ๋ผ์„œ ๊ธธ์ด๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ๊ฐ’์„ ์ง€์นจ์œผ๋กœ ์‚ฌ์šฉํ•ด๋ผ.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-07-15 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 2 17 32

Custom Logo-Only Buttons

๋ฒ„ํŠผ ํฌ๊ธฐ์— ๋”ฐ๋ผ์„œ ๋กœ๊ณ  ํŒŒ์ผ์˜ ํ˜•์‹์„ ์„ ํƒํ•œ๋‹ค. ๋ชจ๋“  ํฌ๊ธฐ์˜ ๋ฒ„ํŠผ์— ๋ฒกํ„ฐ ๊ธฐ๋ฐ˜ SVG ๋ฐ PDF ํ˜•์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. 44x44pt ํฌ๊ธฐ์˜ ๋ฒ„ํŠผ์—์„œ๋งŒ PNG ํ˜•์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

logo-only ์ด๋ฏธ์ง€์— ๊ฐ€๋กœ ์—ฌ๋ฐฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. logo-only ๋ฒ„ํŠผ์€ ํ•ญ์ƒ 1๋Œ€1 ๋น„์œจ์ด์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฏธ ๋ชจ๋“ ๋ฉด์— ์˜ฌ๋ฐ”๋ฅธ ์—ฌ๋ฐฑ์ด ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.

mask ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ๋ณธ ์ •์‚ฌ๊ฐํ˜• ์ด๋ฏธ์ง€๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค. ๋งŒ์•ฝ์— ๋„ˆ๊ฐ€ ๋‘ฅ๊ทผ ๋ฒ„ํŠผ์„ ์›ํ•œ๋‹ค๋ฉด built-in padding ์„ ์ค„์ด๊ฑฐ๋‚˜ ๋กœ๊ณ  ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž๋ฅด๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ํŒจ๋”ฉ์„ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.

11

๋ฒ„ํŠผ ์ฃผ์œ„์— ์ตœ์†Œํ•œ์˜ ์—ฌ๋ฐฑ์„ ์œ ์ง€ํ•œ๋‹ค. ์—ฌ๋ฐฑ์€ ๋ฒ„ํŠผ ๋†’์ด์˜ 1/10 ์ด์ƒ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

4. Apple login ๋ฒ„ํŠผ ์ถ”๊ฐ€ ๋ฐ ์ฐฝ ๋„์šฐ๊ธฐ

  • System-Provided Buttons ์ถ”๊ฐ€
func setUI() {
        let appleBtn = ASAuthorizationAppleIDButton(type: .signIn, style: .black)
        appleBtn.addTarget(self, action: #selector(handleAuthorizationAppleIDButtonPress), for: .touchUpInside)
        view.addSubview(appleBtn)
        
        appleBtn.translatesAutoresizingMaskIntoConstraints = false
        appleBtn.topAnchor.constraint(equalTo: loginLabel.bottomAnchor, constant: 40).isActive = true
        appleBtn.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    }
  • handleAuthorizationAppleIDButtonPress() ๊ตฌํ˜„
@objc
    func handleAuthorizationAppleIDButtonPress() {
        print("try login with apple")
        
        let appleIDProvider = ASAuthorizationAppleIDProvider()
        let reqeust = appleIDProvider.createRequest()
        reqeust.requestedScopes = [.fullName, .email]
        
        let authorizationController = ASAuthorizationController(authorizationRequests: [reqeust])
        authorizationController.delegate = self
        authorizationController.presentationContextProvider = self
        authorizationController.performRequests()
        
    }
  • delegate
extension ViewController: ASAuthorizationControllerDelegate {
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        switch authorization.credential {
        case let appleIDCredential as ASAuthorizationAppleIDCredential:
            
            // Create an account in your system.
            let userIdentifier = appleIDCredential.user
            let fullName = appleIDCredential.fullName
            let email = appleIDCredential.email
            
            if let authorizationCode = appleIDCredential.authorizationCode,
               let identityToken = appleIDCredential.identityToken,
               let authString = String(data: authorizationCode, encoding: .utf8),
               let tokenString = String(data: identityToken, encoding: .utf8) {
                print("authorizationCode: \(authorizationCode)")
                print("identityToken: \(identityToken)")
                print("authString: \(authString)")
                print("tokenString: \(tokenString)")
                
            }
            print("useridentifier: \(userIdentifier)")
            print("fullName: \(fullName)")
            print("email: \(email)")
        
        case let passwordCredential as ASPasswordCredential:
        
            // Sign in using an existing iCloud Keychain credential.
            let username = passwordCredential.user
            let password = passwordCredential.password
            
            print("username: \(username)")
            print("password: \(password)")
            
        default:
            break
        }
    }
    
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        // Handle error.
        print("login error")
    }
}
  • ์ถœ๋ ฅํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ ์ถœ๋ ฅ!

  • ๋‘๋ฒˆ์งธ๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๊ฒŒ๋˜๋ฉด ์ด๋ฏธ ํšŒ์›๊ฐ€์ž…์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— fullname ๊ณผ email ์€ ๋นˆ๊ฐ’์ด ๋„˜์–ด์˜จ๋‹ค.

  • ๋‚˜๋Š” userIdentifier ๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ž์ฒด accessToken์„ ๋ฐ›๋„๋ก ํ•˜์˜€๋‹ค.

5. AppDelegate ์—์„œ ๋กœ๊ทธ์ธ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ

  • ์•ฑ์„ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ์ค‘๋‹จ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ
    // ์•ฑ์„ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ์ค‘๋‹จ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        let appleIDProvider = ASAuthorizationAppleIDProvider()
        appleIDProvider.getCredentialState(forUserID: "001628.1f39bf3727b44f1f8a6615166ae3b718.0924") { (credentialState, error) in
            switch credentialState {
            
            case .revoked:
                // Apple ID ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ์šฐ.
                // ๋กœ๊ทธ์•„์›ƒ
                print("revoked")
                print("go to login")
            case .authorized:
                print("authorized")
                print("go to home")
            case .notFound:
                // ์ž˜๋ชป๋œ useridentifier ๋กœ credentialState ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์• ํ”Œ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๋•Œ
                print("notFound")
                print("go to login")
            @unknown default:
                print("default")
                print("go to login")
            }
        }
        
        return true
    }
  • background ์— ์•ฑ์ด ๋‚ด๋ ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ค‘๋‹จ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ
// background ์— ์•ฑ์ด ๋‚ด๋ ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ค‘๋‹จ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ
    func applicationDidBecomeActive(_ application: UIApplication) {
        let appleIDProvider = ASAuthorizationAppleIDProvider()
        appleIDProvider.getCredentialState(forUserID: "001628.1f39bf3727b44f1f8a6615166ae3b718.0924") { (credentialState, error) in
            switch credentialState {
            
            case .revoked:
                // Apple ID ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ์šฐ.
                // ๋กœ๊ทธ์•„์›ƒ
                print("revoked")
                print("go to login")
            case .authorized:
                print("authorized")
                print("go to home")
            case .notFound:
                // ์ž˜๋ชป๋œ useridentifier ๋กœ credentialState ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์• ํ”Œ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๋•Œ
                print("notFound")
                print("go to login")
            @unknown default:
                print("default")
                print("go to login")
            }
        }
    }

aplle login manager ๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ†ตํ•ฉ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

iOS Sign In with Apple ์ ์šฉํ•˜๊ธฐ


์ถœ์ฒ˜

iOS Sign In with Apple ์ ์šฉํ•˜๊ธฐ

Buttons - Sign in with Apple - Human Interface Guidelines - Apple Developer

[Swift] - Apple Login (2/2)

About

๐Ÿงƒ Login tutorial using Apple REST API

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages