반응형
'내부'보호 수준으로 인해 이니셜 라이저에 액세스 할 수 없습니다.
몇 가지 프로토콜이 있습니다
로그인 전략
public protocol LoginStrategy {
func login(_ viewController: UIViewController)
func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ())
func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping (_ loginButton: UIView) -> ())
func getUserId() -> String
}
두 개의 클래스 :
LoginProvider
public class LoginProvider {
public let strategy: LoginStrategy
public func login(_ viewController: UIViewController) {
return self.strategy.login(viewController)
}
public func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ()) {
return self.strategy.getUserInfo(withCompletionHandler: completionHandler)
}
public func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping (_ loginButton: UIView) -> ()) {
return self.strategy.createLoginButton(frame, withCompletionHandler: completionHandler)
}
public func getUserId() -> String {
return self.strategy.getUserId()
}
public init(strategy: LoginStrategy) {
self.strategy = strategy
}
}
Facebook 로그인 전략
import Foundation
import FacebookCore
import FacebookLogin
public class FacebookLoginStrategy: LoginStrategy {
public var grantedPermissions: Set<Permission>? = nil
public var declinedPermissions: Set<Permission>? = nil
public var userId: String = ""
public func login(_ viewController: UIViewController) {
let loginManager = LoginManager()
let permissions: [ReadPermission] = [.publicProfile, .userFriends, .email]
loginManager.logIn(permissions, viewController: viewController) { loginResult in
switch loginResult {
case .failed(let error):
print(error)
case .cancelled:
print("User cancelled login.")
case .success(let grantedPermissions, let declinedPermissions, let accessToken):
self.userId = accessToken.userId ?? ""
self.grantedPermissions = grantedPermissions
self.declinedPermissions = declinedPermissions
print("Logged in!")
}
}
}
public func getUserId() -> String {
return userId
}
public func getUserInfo(withCompletionHandler completionHandler: @escaping (_ userInfo: [String: Any]?) -> ()) {
let request = GraphRequest(graphPath: "me", parameters: ["fields":"email, name"], accessToken: AccessToken.current, httpMethod: .GET, apiVersion: FacebookCore.GraphAPIVersion.defaultVersion)
request.start { (response, result) in
switch result {
case .success(let value):
print(value.dictionaryValue)
completionHandler(value.dictionaryValue)
case .failed(let error):
print(error)
}
}
}
public func createLoginButton(_ frame: CGRect, withCompletionHandler completionHandler: @escaping (_ loginButton: UIView) -> ()) {
let permissions: [ReadPermission] = [.publicProfile, .userFriends, .email]
let loginButton = LoginButton(readPermissions: permissions)
loginButton.frame = frame
completionHandler(loginButton)
}
}
내 ViewController에서 :
내가 사용할 때 :
let facebookLoginProvider = LoginProvider(strategy: FacebookLoginStrategy())
그것은 말한다 :
'내부'보호 수준으로 인해 'FacebookLoginStrategy'에 액세스 할 수 없습니다.
FacebookLoginStrategy에 추가하기 만하면됩니다.
public init() {}
init ()를 명시 적으로 구현하지 않는 한 기본적으로 내부로 표시됩니다. 프레임 워크 외부에서 인스턴스화 할 수 있으려면 해당 권한 수준을 덮어 써야합니다.
반응형
'development' 카테고리의 다른 글
RecyclerView의 ItemAnimator를 구현하여 notifyItemChanged 애니메이션을 비활성화하는 방법 (0) | 2020.12.06 |
---|---|
오류 : com.google.gms : google-services : 1.0을 찾을 수 없습니다. (0) | 2020.12.06 |
Windows에서 Charles Web Proxy 및 최신 Android 에뮬레이터를 사용하여 SSL 인증서를 구성하는 방법은 무엇입니까? (0) | 2020.12.06 |
Django 모델의 필드를 업데이트하기 위해 사전을 어떻게 사용합니까? (0) | 2020.12.06 |
선택한 명명 된 인수를 Jinja2의 include 컨텍스트에 전달하는 방법은 무엇입니까? (0) | 2020.12.06 |