the problem your facing is very common when handling with objects, the props do not change because you're changing an object property but the object itself does not change from the react side.
even when you're giving it a whole new object react doesn't see the property object change because the reference stays the same.
해당 라이브러리의 공식 github에서 제공하는 기본 login process는 다음과 같다.
import appleAuth, {
AppleAuthRequestOperation,
AppleAuthRequestScope,
AppleAuthCredentialState,
AppleAuthError
} from '@invertase/react-native-apple-authentication';
async function onAppleButtonPress() {
// performs login request
const appleAuthRequestResponse = await appleAuth.performRequest({
requestedOperation: AppleAuthRequestOperation.LOGIN,
requestedScopes: [AppleAuthRequestScope.EMAIL, AppleAuthRequestScope.FULL_NAME],
});
// get current authentication state for user
const credentialState = await appleAuth.getCredentialStateForUser(appleAuthRequestResponse.user);
// use credentialState response to ensure the user is authenticated
if (credentialState === AppleAuthCredentialState.AUTHORIZED) {
// user is authenticated
}
}
에러를 catch 하고, 로그인이 확인(Authorized)됬을 때의 동작을 위해 아래와 같이 작성한다.
import appleAuth from '@invertase/react-native-apple-authentication';
// 2021년 01월 30일 수정되었습니다.
const appleLogin = async() => {
try {
// performs login request
const appleAuthRequestResponse = await appleAuth.performRequest({
requestedOperation: appleAuth.Operation.LOGIN,
requestedScopes: [appleAuth.Scope.EMAIL, appleAuth.Scope.FULL_NAME],
});
// get current authentication state for user
const credentialState = await appleAuth.getCredentialStateForUser(appleAuthRequestResponse.user);
// use credentialState response to ensure the user is authenticated
if (credentialState === appleAuth.State.AUTHORIZED) {
// user is authenticated
console.log(appleAuthRequestResponse);
}
} catch (error) {
if (error.code === appleAuth.Error.CANCELED) {
// login canceled
} else {
// login error
}
}
}
appleAuthRequestResponse 객체의 비구조화 할당(destructuring assignment)을 통해 identityToken, email, user을 선언한다. 주의해야할 점은 email값은 최초 한번의 로그인 때만 email을 반환하고, 이후로는 null 값을 반환한다는 것이다. identityToken 내부에 email에 대한 정보가 있으므로 걱정하지 않아도 된다. 또한, unique한 값이 필요하다면 user를 사용하면 된다.
identityToken은 Apple Login Token으로써 JWT(JASON Web Token) 기반이다. 이 identityToken안에 있는 정보는 https://jwt.io/ 에서 Decode하면 확인할 수 있다.
Xcode에서 프로젝트 .xcowrkspace를 열고 Capability를 눌러 Sign In with Apple을 추가한다.
또한 에뮬레이터에서는 정확한 동작이 되지 않는 경우가 있으므로, 실제 device 상에서 동작을 test하는 것을 추천한다.
에러 2. not supported device
Error: AppleAuth is not supported an the device. Currently Apple Authentication works on iOS devices running iOS 13 or later. User 'AppleAuth.isSupported' to check device is supported before calling any of the module methods
기타 + @privaterelay.appleid.com 이메일
Apple ID 로그인 시 "나의 이메일 공유하기" 와 "나의 이메일 가리기" 이렇게 두가지 옵션이 있다. "나의 이메일 가리기"를 선택하여 로그인을 진행한다면 위의 email에 자신의 고유한 이메일이 아닌@privaterelay.appleid.com 형태의 이메일이 반환된다.