Commit b234e5a9 ilCode

对接苹果登录

1 个父辈 b84af6ea
......@@ -85,6 +85,7 @@
5EA9FDCB2C25690100654E93 /* MatchInfoDetailCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA9FDCA2C25690100654E93 /* MatchInfoDetailCell.swift */; };
5EA9FDCD2C256C4A00654E93 /* JcInfoDetailModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA9FDCC2C256C4A00654E93 /* JcInfoDetailModel.swift */; };
5EAA223F2C17F87800404739 /* UIView+Ext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAA223E2C17F87800404739 /* UIView+Ext.swift */; };
5EAFFDD92C3391160091671D /* AppleSignInManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAFFDD82C3391160091671D /* AppleSignInManager.swift */; };
5EB268732C2915AE0044BA0C /* JcInfoDetailHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB268722C2915AE0044BA0C /* JcInfoDetailHeaderView.swift */; };
5EB268762C2957550044BA0C /* DiscoverController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB268752C2957550044BA0C /* DiscoverController.swift */; };
5EB268782C295DA80044BA0C /* HadoopController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB268772C295DA80044BA0C /* HadoopController.swift */; };
......@@ -185,6 +186,8 @@
5EA9FDCA2C25690100654E93 /* MatchInfoDetailCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatchInfoDetailCell.swift; sourceTree = "<group>"; };
5EA9FDCC2C256C4A00654E93 /* JcInfoDetailModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JcInfoDetailModel.swift; sourceTree = "<group>"; };
5EAA223E2C17F87800404739 /* UIView+Ext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Ext.swift"; sourceTree = "<group>"; };
5EAFFDD72C3388140091671D /* AoleiSports.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AoleiSports.entitlements; sourceTree = "<group>"; };
5EAFFDD82C3391160091671D /* AppleSignInManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleSignInManager.swift; sourceTree = "<group>"; };
5EB268722C2915AE0044BA0C /* JcInfoDetailHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JcInfoDetailHeaderView.swift; sourceTree = "<group>"; };
5EB268752C2957550044BA0C /* DiscoverController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoverController.swift; sourceTree = "<group>"; };
5EB268772C295DA80044BA0C /* HadoopController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HadoopController.swift; sourceTree = "<group>"; };
......@@ -232,6 +235,7 @@
5E1E66B32C19AAC7009339F0 /* UpdateProfileController.swift */,
5E93B4892C1A935F00CD6536 /* PrivacyController.swift */,
5E93B48B2C1A985F00CD6536 /* LoginController.swift */,
5EAFFDD82C3391160091671D /* AppleSignInManager.swift */,
5E93B48D2C1A98BE00CD6536 /* RegisterController.swift */,
5E93B48F2C1A9BDC00CD6536 /* LoginTools.swift */,
5E9165D72C1D3F45004A3C5E /* UserProvider.swift */,
......@@ -350,6 +354,7 @@
children = (
5E9A19F92C0EAC0300321AC5 /* Info.plist */,
5E65F88D2C2279160082D374 /* Localizable.strings */,
5EAFFDD72C3388140091671D /* AoleiSports.entitlements */,
5E6CF0202C1305DD00BF3CF5 /* AoleiSports.xcdatamodeld */,
);
path = Config;
......@@ -630,6 +635,7 @@
5E5A69D72C2AB0560063B726 /* HadoopDetailController.swift in Sources */,
5E93B4902C1A9BDC00CD6536 /* LoginTools.swift in Sources */,
5EC03E532C118FA00068A5CB /* ScoreProvider.swift in Sources */,
5EAFFDD92C3391160091671D /* AppleSignInManager.swift in Sources */,
5E9A1A522C0F205A00321AC5 /* LeagueController.swift in Sources */,
5E9827BE2C2F95E6006D74D4 /* HadoopDetailRadarView.swift in Sources */,
5E9165D82C1D3F45004A3C5E /* UserProvider.swift in Sources */,
......@@ -862,6 +868,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = AoleiSports/Config/AoleiSports.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = L275Z886SW;
......@@ -896,6 +903,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = AoleiSports/Config/AoleiSports.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = L275Z886SW;
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.applesignin</key>
<array>
<string>Default</string>
</array>
</dict>
</plist>
//
// AppleSignInManager.swift
// AoleiSports
//
// Created by ilCode on 2024/7/2.
//
import Foundation
import AuthenticationServices
class AppleSignInManager: NSObject {
var onSignInSuccess: ((String, String) -> Void)?
var onSignInFailure: ((Error) -> Void)?
private lazy var authorizationController: ASAuthorizationController = {
let appleIDProvider = ASAuthorizationAppleIDProvider()
let request = appleIDProvider.createRequest()
request.requestedScopes = [.fullName, .email]
let controller = ASAuthorizationController(authorizationRequests: [request])
controller.delegate = self
controller.presentationContextProvider = self
return controller
}()
func performSignIn() {
authorizationController.performRequests()
}
}
extension AppleSignInManager: ASAuthorizationControllerDelegate {
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
guard let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential else {
return
}
guard let appleIDToken = appleIDCredential.identityToken else {
return
}
guard let idTokenString = String(data: appleIDToken, encoding: .utf8) else {
return
}
onSignInSuccess?(appleIDCredential.user, idTokenString)
}
func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
onSignInFailure?(error)
}
}
extension AppleSignInManager: ASAuthorizationControllerPresentationContextProviding {
func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
return UIApplication.shared.windows.first!
}
}
......@@ -202,6 +202,31 @@ class LoginController: BaseController {
return stackView
}()
private lazy var appleSignInManager: AppleSignInManager = {
let manager = AppleSignInManager()
manager.onSignInSuccess = { appleId, token in
print("登录成功: \(appleId), token: \(token)")
self.view.makeToastActivity(.center)
UserProvider<LoginOrRegisterTarget>.appleLoginRequest(appleId: appleId, token: token) { logicResult in
self.view.hideToastActivity()
if case .failure(let failure) = logicResult {
self.view.makeToast(failure.localizedDescription, position: .center)
return
}
self.view.makeToast("登录成功", position: .center)
self.dismiss(animated: true)
}
}
manager.onSignInFailure = { error in
self.view.makeToast(error.localizedDescription, position: .center)
}
return manager
}()
override func viewDidLoad() {
super.viewDidLoad()
......@@ -463,8 +488,12 @@ class LoginController: BaseController {
}
@objc private func appleLoginTapped() {
dealReadPrivacy()
if !agreementCheckBox.isSelected {
agreementCheckBox.shakeAnimation()
return
}
AppleSignInManager().performSignIn()
}
@objc private func guestLoginTapped() {
......
......@@ -16,6 +16,8 @@ enum LoginOrRegisterTarget: TargetType {
case mobileCodeLogin(mobile: String, code: String)
// 密码登录
case pwdLogin(name: String, pwd: String)
// 苹果登录
case appleLogin(appleId: String, token: String)
// 游客登录
case guestLogin
// 退出登录
......@@ -54,7 +56,15 @@ enum LoginOrRegisterTarget: TargetType {
}
"""]
return .requestParameters(parameters: parameters, encoding: JSONEncoding.default)
case .appleLogin(let appleId, let token):
let parameters = ["query": """
mutation {
\(APIs.kAppleLogin)(open_id: "\(appleId)", token: "\(token)")
}
"""]
return .requestParameters(parameters: parameters, encoding: JSONEncoding.default)
case .guestLogin:
let guestId = AppInfo.getUKey()
let parameters = ["query": """
......@@ -63,7 +73,7 @@ enum LoginOrRegisterTarget: TargetType {
}
"""]
return .requestParameters(parameters: parameters, encoding: JSONEncoding.default)
case .logout:
let parameters = ["query": """
mutation {
......@@ -180,6 +190,28 @@ class UserProvider<Target: TargetType>: BaseMoyaProvider<Target> {
}
}
// 苹果登录请求
static func appleLoginRequest(appleId: String, token: String, completion: @escaping (Result<Bool, AsError>) -> Void) {
let target: LoginOrRegisterTarget = .appleLogin(appleId: appleId, token: token)
moyaPost(api: APIs.kAppleLogin, target: target) { midResult in
DDLogInfo("苹果登录请求接口数据:\(midResult)")
switch midResult {
case let .success(midSuccessResult):
let appToken = midSuccessResult["AppToken"] as? String
var resultDic = midSuccessResult["Result"] as? [String: Any] ?? [:]
resultDic["AppToken"] = appToken
let userModel = UserModel(JSON: resultDic)
UserManager.shared.saveUserData(userModel: userModel)
completion(.success(true))
case .failure(let err):
completion(.failure(err))
}
}
}
// 退出登录请求
static func logoutRequest(completion: @escaping (Result<Bool, AsError>) -> Void) {
moyaPost(api: APIs.kLogout, target: LoginOrRegisterTarget.logout) { midResult in
......
......@@ -20,6 +20,8 @@ struct APIs {
static let kSmsLogin = "ydn_sms_login"
// 密码登录
static let kPwdLogin = "ydn_login"
// 苹果登录
static let kAppleLogin = "ydn_apple_login"
// 游客登录
static let kGuestLogin = "ydn_apple_login"
// 退出登录
......
......@@ -12,6 +12,9 @@ let R = _R(bundle: Bundle(for: BundleFinder.self))
struct _R {
let bundle: Foundation.Bundle
let entitlements = entitlements()
var string: string { .init(bundle: bundle, preferredLanguages: nil, locale: nil) }
var color: color { .init(bundle: bundle) }
var image: image { .init(bundle: bundle) }
......@@ -201,6 +204,14 @@ struct _R {
var ssqb_selected: RswiftResources.ImageResource { .init(name: "ssqb_selected", path: [], bundle: bundle, locale: nil, onDemandResourceTags: nil) }
}
/// This `_R.entitlements` struct is generated, and contains static references to 1 properties.
struct entitlements {
let comAppleDeveloperApplesignin = comAppleDeveloperApplesignin()
struct comAppleDeveloperApplesignin {
let `default`: String = "Default"
}
}
/// This `_R.file` struct is generated, and contains static references to 6 resource files.
struct file {
let bundle: Foundation.Bundle
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!