(1) 기술
(2) 라이브러리
(3) 기타 필요항목
1) 애플 개발자 페이지로 가서 로그인 한 후, 계정 설정(accout)으로 들어간다.
여기서 식별자와 Key, Service id를 등록해야 한다.
1️⃣ 식별자 등록하기
*Certificates, Identifiers & Profiles 메뉴 중, 식별자(Identifiers)를 설정해야 한다.
빨간색으로 표시한 “식별자(영문)”으로 들어가서, 식별자를 추가해준다.
App IDs를 선택하고 Continue
하자
App 유형을 선택하고 Continue
Description, Bundle ID를 기재한다. 번들 아이디는 모르겠다면 xcode의 러너로 들어가서 bundle identifier로 써두자
그리고 아래 기능(capabilities)으로 가서 Sign In with Apple을 체크한다. 그후 Continue
2️⃣ Key 생성하기
Create a Key
를 클릭.Continue
가 가능하다.3️⃣ Service Id 생성하기
identifier는 아까 생성한 identifier의 역순으로 넣어주자.
완료하면 아래 같이 Service IDs로 필터링이 된 목록이 나온다.
방금 만든 서비스 아이디를 눌러서 설정을 해주자.
1) Firebase프로젝트 콘솔에서 빌드/Authentication 기능으로 접근,
Apple Sign-in method를 활성화 시킨다.
윗 단계에서 만든 서비스 ID를 넣어주면 된다.
2) Firebase프로젝트 콘솔에서 iOS앱을 추가하고, 구성 파일(GoogleService-Info.plist)을 우리 프로젝트의 ios폴더에 넣어준다. 번들 ID를 잘 맞춰주자.
1) Targets → Runner → Signing & Capabilities → +Capabilities
→ Sign in with Apple. 이 기능을 활성화 해주면 된다.
위에서 기재한 라이브러리를 모두 프로젝트에 설치한다.
noncer생성 및 해시값 변환 함수를 만든다.
import 'package:firebase_auth/firebase_auth.dart';
import 'package:sign_in_with_apple/sign_in_with_apple.dart';
import 'package:crypto/crypto.dart';
class FirebaseRepository {
String generateNonce([int length = 32]) {
final charset =
'0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._';
final random = Random.secure();
return List.generate(length, (_) =>
charset[random.nextInt(charset.length)]).join();
}
String sha256ofString(String input) {
final bytes = utf8.encode(input);
final digest = sha256.convert(bytes);
return digest.toString();
}
}
3. 애플에 로그인하는 함수를 만든다.
```
class FirebaseRepository {
_fireAuthInstance = FirebaseAuth.instance;
Future<UserCredential> signInWithApple() async {
final rawNonce = generateNonce();
final nonce = sha256ofString(rawNonce);
//앱에서 애플 로그인 창을 호출하고, apple계정의 credential을 가져온다.
final appleCredential = await SignInWithApple.getAppleIDCredential(
scopes: [
AppleIDAuthorizationScopes.email,
AppleIDAuthorizationScopes.fullName,
],
nonce: nonce,
);
//그 credential을 넣어서 OAuth를 생성
final oauthCredential = OAuthProvider("apple.com").credential(
idToken: appleCredential.identityToken,
rawNonce: rawNonce,
);
//OAuth를 넣어서 firebase유저 생성
return await _fireAuthInstance.signInWithCredential(oauthCredential);
}
}
RoundedRectangleButtonWidget(
buttonText: "애플로 시작하기",
buttonColor: Colors.black,
textColor: Colors.white,
onPressed: () {
signInWithApple();
},
),
class FirebaseRepository {
_fireAuthInstance = FirebaseAuth.instance;
_firestoreInstance = FirebaseFirestore.instance;
Stream<UserModel?> getUserStream() {
//userChanges()는 User타입의 객체를 Stream으로 갖고오는 Firebase제공 함수이다.
//Firebase와 연결된 User가 변경될 때 마다 transform()을 실행한다.
//userModel은 제공해주는 타입이 아니라, 직접 만들어야 한다.
//model클래스 생성에 대해서는 freezed에 대해서 설명할때 또 다루겠다.
return _fireAuthInstance.userChanges().transform(
StreamTransformer<User?, UserModel?>.fromHandlers(
handleData: (user, sink) async {
//user타입을 갖고오는데 실패했으면 stream에 아무것도 추가하지 않는다.
if (user == null) {
sink.add(null);
return;
}
var userCollection = _firestoreInstance.collection("user");
Map<String, dynamic> userDoc = {};
try {
//try catch로 유저 있어요?를 물어본다. 유저가 있다면 데이터를 긁어와주고 끝
var snapshot = await userCollection.doc(user.uid).get();
userDoc = snapshot.data() as Map<String, dynamic>;
} catch (e) {
//유저가 없으면 만들어주자
var addedUser = await userCollection.doc(user.uid).set({
//나의 UserModel에 있는 param들을 넣는다.
'uid': user.uid,
'createdAt': DateTime.now(),
'email': user.email,
'nickName': '',
'isTermChecked': false,
'age': 0,
});
var snapshot = await userCollection.doc(user.uid).get();
userDoc = snapshot.data() as Map<String, dynamic>;
}
return sink.add(UserModel.fromJson(userDoc));
}));
}
}
```
StreamSubscription<UserModel?>? sub;
UserModel? _userModel;
void _bindUser(Stream<UserModel?> userStream) {
sub?.cancel();
sub = userStream.listen((user){
_userModel = user;
})
}
잘읽었습니다 감사합니다!