diff --git a/AVOS/AVOSCloud/User/AVUser.h b/AVOS/AVOSCloud/User/AVUser.h index 775641a15..03627dfd3 100644 --- a/AVOS/AVOSCloud/User/AVUser.h +++ b/AVOS/AVOSCloud/User/AVUser.h @@ -248,6 +248,15 @@ A LeanCloud Framework User Object that is a local representation of a user persi password:(NSString *)password block:(AVUserResultBlock)block; +/** + Login by email and password. + + @param email The email string. + @param password The password string. + @param block callback. + */ ++ (void)loginWithEmail:(NSString *)email password:(NSString *)password block:(AVUserResultBlock)block; + //phoneNumber + password /*! * 使用手机号码和密码登录 diff --git a/AVOS/AVOSCloud/User/AVUser.m b/AVOS/AVOSCloud/User/AVUser.m index 650728942..d01f75abe 100644 --- a/AVOS/AVOSCloud/User/AVUser.m +++ b/AVOS/AVOSCloud/User/AVUser.m @@ -375,13 +375,6 @@ - (void)refreshSessionTokenWithBlock:(AVBooleanResultBlock)block { }]; } -+(NSDictionary *)userParameter:(NSString *)username - password:(NSString *)password -{ - NSDictionary * parameters = @{usernameTag: username, passwordTag:password}; - return parameters; -} - // MARK: - login with username & password + (instancetype)logInWithUsername:(NSString *)username @@ -395,7 +388,7 @@ + (instancetype)logInWithUsername:(NSString *)username error:(NSError **)error { __block AVUser * resultUser = nil; - [[self class] logInWithUsername:username password:password block:^(AVUser *user, NSError *error) { + [[self class] logInWithUsername:username email:nil password:password block:^(AVUser *user, NSError *error) { resultUser = user; } waitUntilDone:YES error:error]; return resultUser; @@ -404,7 +397,7 @@ + (instancetype)logInWithUsername:(NSString *)username + (void)logInWithUsernameInBackground:(NSString *)username password:(NSString *)password { - [[self class] logInWithUsername:username password:password block:nil waitUntilDone:YES error:nil]; + [[self class] logInWithUsername:username email:nil password:password block:nil waitUntilDone:YES error:nil]; } + (void)logInWithUsernameInBackground:(NSString *)username @@ -423,14 +416,21 @@ + (void)logInWithUsernameInBackground:(NSString *)username password:(NSString *)password block:(AVUserResultBlock)block { - [[self class] logInWithUsername:username password:password block:^(AVUser *user, NSError * error) { + [[self class] logInWithUsername:username email:nil password:password block:^(AVUser *user, NSError * error) { [AVUtils callUserResultBlock:block user:user error:error]; } waitUntilDone:NO error:nil]; } + ++ (void)loginWithEmail:(NSString *)email password:(NSString *)password block:(AVUserResultBlock)block { + [[self class] logInWithUsername:nil email:email password:password block:^(AVUser * _Nullable user, NSError * _Nullable error) { + [AVUtils callUserResultBlock:block user:user error:error]; + } waitUntilDone:false error:nil]; +} + (BOOL)logInWithUsername:(NSString *)username + email:(NSString *)email password:(NSString *)password block:(AVUserResultBlock)block waitUntilDone:(BOOL)wait @@ -440,7 +440,10 @@ + (BOOL)logInWithUsername:(NSString *)username BOOL __block hasCalledBack = NO; NSError __block *blockError = nil; - NSDictionary * parameters = [[self class] userParameter:username password:password]; + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + if (username) { parameters[usernameTag] = username; } + if (email) { parameters[emailTag] = email; } + if (password) { parameters[passwordTag] = password; } [[AVPaasClient sharedInstance] postObject:@"login" withParameters:parameters block:^(id object, NSError *error) { AVUser * user = nil; if (error == nil) diff --git a/AVOS/AVOSCloud/UserAgent.h b/AVOS/AVOSCloud/UserAgent.h index 169ec4524..c57d0f7ed 100644 --- a/AVOS/AVOSCloud/UserAgent.h +++ b/AVOS/AVOSCloud/UserAgent.h @@ -1 +1 @@ -#define SDK_VERSION @"v11.5.2" +#define SDK_VERSION @"v11.6.0" diff --git a/AVOS/AVOSCloudTests/Swift/AVUserTestCase.swift b/AVOS/AVOSCloudTests/Swift/AVUserTestCase.swift index 4b0645f3f..e4bf9aa6b 100644 --- a/AVOS/AVOSCloudTests/Swift/AVUserTestCase.swift +++ b/AVOS/AVOSCloudTests/Swift/AVUserTestCase.swift @@ -471,4 +471,44 @@ class AVUser_TestCase: LCTestBase { }) } + func testLoginByEmail() { + let user = AVUser() + let username = UUID().uuidString.replacingOccurrences(of: "-", with: "") + user.username = username + let password = UUID().uuidString.replacingOccurrences(of: "-", with: "") + user.password = password + let email = "\(UUID().uuidString.replacingOccurrences(of: "-", with: ""))@email.com" + user.email = email + + do { + try user.signUpAndThrows() + } catch { + XCTFail("\(error)") + } + + let exp1 = expectation(description: "login by email") + AVUser.login(withEmail: email, password: password) { (sameUser, error) in + XCTAssertNotNil(sameUser) + XCTAssertFalse(user === sameUser) + XCTAssertEqual(user.objectId, sameUser?.objectId) + XCTAssertEqual(username, sameUser?.username) + XCTAssertEqual(email, sameUser?.email) + XCTAssertNil(error) + exp1.fulfill() + } + wait(for: [exp1], timeout: 30) + + let exp2 = expectation(description: "login by username") + AVUser.logInWithUsername(inBackground: username, password: password) { (sameUser, error) in + XCTAssertNotNil(sameUser) + XCTAssertFalse(user === sameUser) + XCTAssertEqual(user.objectId, sameUser?.objectId) + XCTAssertEqual(username, sameUser?.username) + XCTAssertEqual(email, sameUser?.email) + XCTAssertNil(error) + exp2.fulfill() + } + wait(for: [exp2], timeout: 30) + } + } diff --git a/AVOSCloud.podspec b/AVOSCloud.podspec index ea68b125e..a9302d83c 100644 --- a/AVOSCloud.podspec +++ b/AVOSCloud.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'AVOSCloud' - s.version = '11.5.2' + s.version = '11.6.0' s.homepage = 'https://leancloud.cn/' s.summary = 'LeanCloud Objective-C SDK' s.authors = 'LeanCloud' diff --git a/AVOSCloudIM.podspec b/AVOSCloudIM.podspec index ace9f2277..0c439e453 100644 --- a/AVOSCloudIM.podspec +++ b/AVOSCloudIM.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'AVOSCloudIM' - s.version = '11.5.2' + s.version = '11.6.0' s.homepage = 'https://leancloud.cn/' s.summary = 'LeanCloud IM Objective-C SDK' s.authors = 'LeanCloud' diff --git a/AVOSCloudLiveQuery.podspec b/AVOSCloudLiveQuery.podspec index 7d3333099..9b7f16a6b 100644 --- a/AVOSCloudLiveQuery.podspec +++ b/AVOSCloudLiveQuery.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'AVOSCloudLiveQuery' - s.version = '11.5.2' + s.version = '11.6.0' s.homepage = 'https://leancloud.cn/' s.summary = 'LeanCloud LiveQuery Objective-C SDK' s.authors = 'LeanCloud' diff --git a/command.swift b/command.swift index 9a1c2110a..4cb101865 100755 --- a/command.swift +++ b/command.swift @@ -90,8 +90,8 @@ func build() -> Result { let lines: [String] = (info as! String).components(separatedBy: .newlines) .map { $0.trimmingCharacters(in: .whitespaces) } schemes = { - guard var startIndex: Int = lines.index(of: "Schemes:") else { return [] } - guard let endIndex: Int = lines[startIndex...].index(of: "") else { return [] } + guard var startIndex: Int = lines.firstIndex(of: "Schemes:") else { return [] } + guard let endIndex: Int = lines[startIndex...].firstIndex(of: "") else { return [] } startIndex += 1 guard startIndex < endIndex else { return [] } let arraySlice: ArraySlice = lines[startIndex.. Result { return Array(arraySlice) }() buildConfigurations = { - guard var startIndex: Int = lines.index(of: "Build Configurations:") else { return [] } - guard let endIndex: Int = lines[startIndex...].index(of: "") else { return [] } + guard var startIndex: Int = lines.firstIndex(of: "Build Configurations:") else { return [] } + guard let endIndex: Int = lines[startIndex...].firstIndex(of: "") else { return [] } startIndex += 1 guard startIndex < endIndex else { return [] } let arraySlice: ArraySlice = lines[startIndex..