Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
1e369c7
feat: support cloud function
zapcannon87 Jul 4, 2019
fd87220
test: add case for cloud function
zapcannon87 Jul 4, 2019
5c50ae2
feat: add configuration for production mode
zapcannon87 Jul 4, 2019
fd99e40
fix: cloud run return json and rpc return object
zapcannon87 Jul 4, 2019
bb99d4f
test: case update
zapcannon87 Jul 4, 2019
256d394
feat!(engine): delete
zapcannon87 Jul 4, 2019
eed917a
refactor: environment configuration of the application
zapcannon87 Jul 5, 2019
b52c11b
feat: add synchronously function for captcha client
zapcannon87 Jul 8, 2019
7895117
refactor: rollback cloud to engine
zapcannon87 Jul 8, 2019
28bd539
test: update case
zapcannon87 Jul 8, 2019
1cdb2d8
refactor: engine
zapcannon87 Jul 9, 2019
d798bda
test: update engine case
zapcannon87 Jul 9, 2019
07a42ef
feat: support push
zapcannon87 Jul 9, 2019
5af1c21
test: add case for push
zapcannon87 Jul 9, 2019
e1415bf
feat: IMClient init with LCUser
zapcannon87 Jul 9, 2019
7ea31ab
test: add case for IMClient init with LCUser
zapcannon87 Jul 9, 2019
cb8fdfc
feat: IM open signature
zapcannon87 Jul 9, 2019
2f2d246
feat: support signature for conversation creation
zapcannon87 Jul 10, 2019
8ffac83
refactor: move Action from IMClient to IMSignature
zapcannon87 Jul 11, 2019
58a1a11
feat: feat: support signature for conversation member change
zapcannon87 Jul 11, 2019
e4f0a14
fix: create chat room should not ignore signature
zapcannon87 Jul 11, 2019
c4a48c2
test: update
zapcannon87 Jul 11, 2019
a892bda
docs: module separation mark
zapcannon87 Jul 11, 2019
76040c3
release: 16.3.0
zapcannon87 Jul 11, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion LeanCloud.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'LeanCloud'
s.version = '16.2.0'
s.version = '16.3.0'
s.license = { :type => 'Apache License, Version 2.0', :file => 'LICENSE' }
s.summary = 'LeanCloud Swift SDK'
s.homepage = 'https://leancloud.cn/'
Expand Down
24 changes: 16 additions & 8 deletions LeanCloud.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
11D9C101216DFB2D00A620B7 /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11D9C100216DFB2D00A620B7 /* MD5.swift */; };
11FBD1E5215BDDCA00370C61 /* LCCoreTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11FBD1E4215BDDCA00370C61 /* LCCoreTestCase.swift */; };
11FBD1E8215BEEB400370C61 /* test.zip in Resources */ = {isa = PBXBuildFile; fileRef = 11FBD1E7215BEEB400370C61 /* test.zip */; };
8334561C1CE589E500D42725 /* LCEngineTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8334561B1CE589E500D42725 /* LCEngineTestCase.swift */; };
8342FCC61C7B13A700C3CF15 /* LeanCloud.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8342FCBB1C7B13A700C3CF15 /* LeanCloud.framework */; };
8342FCCB1C7B13A700C3CF15 /* BaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8342FCCA1C7B13A700C3CF15 /* BaseTestCase.swift */; };
834EA7151D2A139A00108DDC /* LCUserTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 834EA7141D2A139A00108DDC /* LCUserTestCase.swift */; };
Expand All @@ -48,7 +47,6 @@
835F5D741D7E6808004D1A0E /* Role.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835F5D501D7E6808004D1A0E /* Role.swift */; };
835F5D751D7E6808004D1A0E /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835F5D511D7E6808004D1A0E /* String.swift */; };
835F5D761D7E6808004D1A0E /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835F5D521D7E6808004D1A0E /* User.swift */; };
835F5D771D7E6808004D1A0E /* Engine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835F5D531D7E6808004D1A0E /* Engine.swift */; };
835F5D791D7E6808004D1A0E /* Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835F5D551D7E6808004D1A0E /* Extension.swift */; };
835F5D7A1D7E6808004D1A0E /* LeanCloud.h in Headers */ = {isa = PBXBuildFile; fileRef = 835F5D561D7E6808004D1A0E /* LeanCloud.h */; settings = {ATTRIBUTES = (Public, ); }; };
835F5D7B1D7E6808004D1A0E /* LeanCloud.swift in Sources */ = {isa = PBXBuildFile; fileRef = 835F5D571D7E6808004D1A0E /* LeanCloud.swift */; };
Expand Down Expand Up @@ -88,10 +86,14 @@
D34F1BB92268263000251BC8 /* IMLocalStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34F1BB82268263000251BC8 /* IMLocalStorage.swift */; };
D357B46522632A210002D14C /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D30A2F81224A069100C000D5 /* Starscream.framework */; };
D357B46722632A510002D14C /* Starscream.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D30A2F81224A069100C000D5 /* Starscream.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
D363342022CD9EC300995DC1 /* Engine.swift in Sources */ = {isa = PBXBuildFile; fileRef = D363341F22CD9EC300995DC1 /* Engine.swift */; };
D363343622CDB0D300995DC1 /* LCEngineTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D363343522CDB0D300995DC1 /* LCEngineTestCase.swift */; };
D3662F9222019B590046A390 /* test.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = D3662F9122019B590046A390 /* test.mp3 */; };
D3665C3721FEAAC1005B44B0 /* IMMessageTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3665C3621FEAAC1005B44B0 /* IMMessageTestCase.swift */; };
D3783A1221F453C3006F6635 /* IMConversationTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3783A1121F453C3006F6635 /* IMConversationTestCase.swift */; };
D393EDBE21D38206001CBB2B /* IMMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D393EDBD21D38206001CBB2B /* IMMessage.swift */; };
D39C50A822D4683C00CFCB43 /* Push.swift in Sources */ = {isa = PBXBuildFile; fileRef = D39C50A722D4683C00CFCB43 /* Push.swift */; };
D39C50AA22D47BA700CFCB43 /* LCPushTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D39C50A922D47BA700CFCB43 /* LCPushTestCase.swift */; };
D3AB32D8227D983E00DCE794 /* CaptchaClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3AB32D7227D983E00DCE794 /* CaptchaClient.swift */; };
D3AC7BA821AE9C1A00C6C557 /* IMClientTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3AC7BA721AE9C1A00C6C557 /* IMClientTestCase.swift */; };
D3AF1CB722681F1200A97566 /* FMDB.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3AF1CA422681EF500A97566 /* FMDB.framework */; };
Expand Down Expand Up @@ -352,7 +354,6 @@
11D9C100216DFB2D00A620B7 /* MD5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MD5.swift; sourceTree = "<group>"; };
11FBD1E4215BDDCA00370C61 /* LCCoreTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LCCoreTestCase.swift; sourceTree = "<group>"; };
11FBD1E7215BEEB400370C61 /* test.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = test.zip; sourceTree = "<group>"; };
8334561B1CE589E500D42725 /* LCEngineTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LCEngineTestCase.swift; sourceTree = "<group>"; };
8342FCBB1C7B13A700C3CF15 /* LeanCloud.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LeanCloud.framework; sourceTree = BUILT_PRODUCTS_DIR; };
8342FCC01C7B13A700C3CF15 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
8342FCC51C7B13A700C3CF15 /* LeanCloudTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LeanCloudTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
Expand All @@ -376,7 +377,6 @@
835F5D501D7E6808004D1A0E /* Role.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Role.swift; sourceTree = "<group>"; };
835F5D511D7E6808004D1A0E /* String.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = "<group>"; };
835F5D521D7E6808004D1A0E /* User.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = "<group>"; };
835F5D531D7E6808004D1A0E /* Engine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Engine.swift; sourceTree = "<group>"; };
835F5D551D7E6808004D1A0E /* Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extension.swift; sourceTree = "<group>"; };
835F5D561D7E6808004D1A0E /* LeanCloud.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LeanCloud.h; sourceTree = "<group>"; };
835F5D571D7E6808004D1A0E /* LeanCloud.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LeanCloud.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -414,11 +414,15 @@
D33D36D722017DAC008C9BDA /* test.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = test.png; sourceTree = "<group>"; };
D33D36DA22019197008C9BDA /* test.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = test.mp4; sourceTree = "<group>"; };
D34F1BB82268263000251BC8 /* IMLocalStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IMLocalStorage.swift; sourceTree = "<group>"; };
D363341F22CD9EC300995DC1 /* Engine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Engine.swift; sourceTree = "<group>"; };
D363343522CDB0D300995DC1 /* LCEngineTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LCEngineTestCase.swift; sourceTree = "<group>"; };
D3662F9122019B590046A390 /* test.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = test.mp3; sourceTree = "<group>"; };
D3665C3621FEAAC1005B44B0 /* IMMessageTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IMMessageTestCase.swift; sourceTree = "<group>"; };
D3783A1121F453C3006F6635 /* IMConversationTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IMConversationTestCase.swift; sourceTree = "<group>"; };
D387262A217726B500DD8FBF /* SwiftProtobuf.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SwiftProtobuf.xcodeproj; path = SwiftProtobuf/SwiftProtobuf.xcodeproj; sourceTree = "<group>"; };
D393EDBD21D38206001CBB2B /* IMMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IMMessage.swift; sourceTree = "<group>"; };
D39C50A722D4683C00CFCB43 /* Push.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Push.swift; sourceTree = "<group>"; };
D39C50A922D47BA700CFCB43 /* LCPushTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LCPushTestCase.swift; sourceTree = "<group>"; };
D3AB32D7227D983E00DCE794 /* CaptchaClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptchaClient.swift; sourceTree = "<group>"; };
D3AC7BA721AE9C1A00C6C557 /* IMClientTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IMClientTestCase.swift; sourceTree = "<group>"; };
D3AF1C8A22681EF500A97566 /* fmdb.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = fmdb.xcodeproj; path = fmdb/fmdb.xcodeproj; sourceTree = "<group>"; };
Expand Down Expand Up @@ -547,7 +551,6 @@
1178D10E213F7B9600429131 /* LCAPITestCase.swift */,
116A682521427442004141A5 /* LCRouterTestCase.swift */,
8365CFA71D79849D006B856E /* LCTypeTestCase.swift */,
8334561B1CE589E500D42725 /* LCEngineTestCase.swift */,
83BC11D51CDD76E900D7E7A6 /* LCACLTestCase.swift */,
83FAF0921CC4D1E400A84063 /* LCObjectTestCase.swift */,
83D0DE6E1CC7B3FF00FC204E /* LCQueryTestCase.swift */,
Expand All @@ -556,6 +559,8 @@
114E1E842153A3ED00DA7DB0 /* LCFileTestCase.swift */,
118763AE2176EA3A0078645B /* LCInstallationTestCase.swift */,
D3BBFB40225D944100B75BA1 /* LCLocalStorageContextTestCase.swift */,
D363343522CDB0D300995DC1 /* LCEngineTestCase.swift */,
D39C50A922D47BA700CFCB43 /* LCPushTestCase.swift */,
D33A8DA921F577F2005B84A9 /* RTMBaseTestCase.swift */,
1123922B2191669100ECCBCC /* RTMRouterTestCase.swift */,
D3DAD03B218DA402008BCD37 /* RTMConnectionTestCase.swift */,
Expand Down Expand Up @@ -597,9 +602,10 @@
835F5D611D7E6808004D1A0E /* Result.swift */,
835F5D5D1D7E6808004D1A0E /* Query.swift */,
835F5D431D7E6808004D1A0E /* CQLClient.swift */,
835F5D531D7E6808004D1A0E /* Engine.swift */,
835F5D631D7E6808004D1A0E /* SMSClient.swift */,
D3AB32D7227D983E00DCE794 /* CaptchaClient.swift */,
D363341F22CD9EC300995DC1 /* Engine.swift */,
D39C50A722D4683C00CFCB43 /* Push.swift */,
);
path = Storage;
sourceTree = "<group>";
Expand Down Expand Up @@ -1072,12 +1078,12 @@
835F5D6F1D7E6808004D1A0E /* GeoPoint.swift in Sources */,
835F5D841D7E6808004D1A0E /* Result.swift in Sources */,
D3AB32D8227D983E00DCE794 /* CaptchaClient.swift in Sources */,
835F5D771D7E6808004D1A0E /* Engine.swift in Sources */,
835F5D761D7E6808004D1A0E /* User.swift in Sources */,
D34F1BB92268263000251BC8 /* IMLocalStorage.swift in Sources */,
D393EDBE21D38206001CBB2B /* IMMessage.swift in Sources */,
114E1E772151FFB600DA7DB0 /* File.swift in Sources */,
11D9C0FA216DF63B00A620B7 /* Error.swift in Sources */,
D363342022CD9EC300995DC1 /* Engine.swift in Sources */,
835F5D701D7E6808004D1A0E /* Null.swift in Sources */,
11D9C101216DFB2D00A620B7 /* MD5.swift in Sources */,
835F5D6E1D7E6808004D1A0E /* Dictionary.swift in Sources */,
Expand All @@ -1104,6 +1110,7 @@
113D23D121901A71006B53EC /* RTMRouter.swift in Sources */,
835F5D831D7E6808004D1A0E /* HTTPClient.swift in Sources */,
119D16AF219A7FCE0023BFEF /* IMClient.swift in Sources */,
D39C50A822D4683C00CFCB43 /* Push.swift in Sources */,
835F5D801D7E6808004D1A0E /* Query.swift in Sources */,
D324CD9221774A9B003FA35F /* RTMConnection.swift in Sources */,
11D9C0FB216DF63B00A620B7 /* Application.swift in Sources */,
Expand All @@ -1130,10 +1137,11 @@
8352B5231D2BAAE600531785 /* LCRelationTestCase.swift in Sources */,
D3665C3721FEAAC1005B44B0 /* IMMessageTestCase.swift in Sources */,
83D0DE6F1CC7B3FF00FC204E /* LCQueryTestCase.swift in Sources */,
D363343622CDB0D300995DC1 /* LCEngineTestCase.swift in Sources */,
114E1E852153A3ED00DA7DB0 /* LCFileTestCase.swift in Sources */,
D39C50AA22D47BA700CFCB43 /* LCPushTestCase.swift in Sources */,
83BC11D61CDD76E900D7E7A6 /* LCACLTestCase.swift in Sources */,
1178D10F213F7B9600429131 /* LCAPITestCase.swift in Sources */,
8334561C1CE589E500D42725 /* LCEngineTestCase.swift in Sources */,
D3AC7BA821AE9C1A00C6C557 /* IMClientTestCase.swift in Sources */,
D3FE04522277EA6C0008C88A /* IMLocalStorageTestCase.swift in Sources */,
116A682621427442004141A5 /* LCRouterTestCase.swift in Sources */,
Expand Down
31 changes: 21 additions & 10 deletions LeanCloudTests/BaseTestCase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,14 @@
//

import XCTest
import LeanCloud
@testable import LeanCloud

class BaseTestCase: XCTestCase {

static let timeout: TimeInterval = 60.0

let timeout: TimeInterval = 60.0

static var masterKey: String {
if LCApplication.default.id == "S5vDI3IeCk1NLLiM1aFg3262-gzGzoHsz" {
return "Q26gTodbyi1Ki7lM9vtncF6U,master"
} else {
XCTFail("default Application ID changed")
return ""
}
}

override func setUp() {
super.setUp()

Expand Down Expand Up @@ -91,3 +82,23 @@ class BaseTestCase: XCTestCase {
}

}

extension LCApplication {

var masterKey: String {
switch self.id {
case "S5vDI3IeCk1NLLiM1aFg3262-gzGzoHsz":
return "Q26gTodbyi1Ki7lM9vtncF6U,master"
default:
fatalError()
}
}

var v2router: HTTPRouter {
return HTTPRouter(
application: self,
configuration: HTTPRouter.Configuration(apiVersion: "1.2")
)
}

}
77 changes: 77 additions & 0 deletions LeanCloudTests/IMClientTestCase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,22 @@ import XCTest

class IMClientTestCase: RTMBaseTestCase {

func testInitWithUser() {
let user = LCUser()
user.username = UUID().uuidString.lcString
user.password = UUID().uuidString.lcString

XCTAssertTrue(user.signUp().isSuccess)

do {
let client = try IMClient(user: user)
XCTAssertNotNil(client.user)
XCTAssertEqual(client.ID, user.objectId?.stringValue)
} catch {
XCTFail("\(error)")
}
}

func testDeinit() {
do {
let invalidID: String = Array<String>.init(repeating: "a", count: 65).joined()
Expand Down Expand Up @@ -484,6 +500,30 @@ class IMClientTestCase: RTMBaseTestCase {

XCTAssertEqual(client.convCollection.count, 2)
}

func testInitWithUserAndOpenWithSignature() {
let user = LCUser()
user.username = UUID().uuidString.lcString
user.password = UUID().uuidString.lcString

XCTAssertTrue(user.signUp().isSuccess)

if let sessionToken = user.sessionToken?.stringValue {

let signatureDelegator = SignatureDelegator()
signatureDelegator.sessionToken = sessionToken

let client = try! IMClient(user: user, signatureDelegate: signatureDelegator)

expecting { (exp) in
client.open(completion: { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
exp.fulfill()
})
}
}
}

}

Expand Down Expand Up @@ -519,4 +559,41 @@ extension IMClientTestCase {
}
}

class SignatureDelegator: IMSignatureDelegate {

var sessionToken: String?

func client(_ client: IMClient, action: IMSignature.Action, signatureHandler: @escaping (IMClient, IMSignature?) -> Void) {
XCTAssertTrue(Thread.isMainThread)
switch action {
case .open:
guard let sessionToken = self.sessionToken else {
break
}

let application = client.application
let httpClient: HTTPClient = application.httpClient
let url = application.v2router.route(path: "rtm/clients/sign", module: .api)!
let parameters: [String: Any] = ["session_token": sessionToken]

let _ = httpClient.request(url: url, method: .get, parameters: parameters) { (response) in
guard
let value = response.value as? [String: Any],
let client_id = value["client_id"] as? String,
client_id == client.ID,
let signature = value["signature"] as? String,
let timestamp = value["timestamp"] as? Int64,
let nonce = value["nonce"] as? String else
{
return
}
signatureHandler(client, IMSignature(signature: signature, timestamp: timestamp, nonce: nonce))
}
default:
break
}
}

}

}
Loading