ss="lines-num lines-num-new"> 54
+ Toast.show(message: "网络出现未知错误")
+ }
}
+
public func post<A: Resource>(resource: A) -> Single<A.Model> {
return Single<A.Model>.create(subscribe: { observer in
let request = self.session.request(resource.host + resource.path.rawValue,
@@ -91,6 +79,7 @@ class NetworkApi {
}
case .failure(let error):
+ self.handlingError(error: error)
observer(.error(error))
}
}
@@ -106,6 +95,7 @@ class NetworkApi {
.responseJSON { (res) in
switch res.result {
case .success(let json):
+ print(json)
guard let json = json as? [String: AnyObject],
let data = resource.parse(json) else {
observer(.error(ParseError()))
@@ -113,6 +103,7 @@ class NetworkApi {
}
observer(.success(data))
case .failure(let error):
+ self.handlingError(error: error)
observer(.error(error))
}
}
@@ -156,6 +147,7 @@ class NetworkApi {
observer(.error(BusinessError(id: status)))
}
case .failure(let error):
+ self.handlingError(error: error)
observer(.error(error))
}
})
@@ -12,64 +12,28 @@ import RxSwift |
||
12 | 12 |
fileprivate let WXAppid = "wx4e22a0c8ae6d766d" |
13 | 13 |
fileprivate let WXSecret = "636ac848016c593575d11143c55c8333" |
14 | 14 |
|
15 |
-//fileprivate protocol WXUserInfoParse: Parsable where Model == JSON {} |
|
16 |
-// |
|
17 |
-//extension DefaultResource: WXUserInfoParse { |
|
18 |
-// func parse(_ json: JSON) -> JSON? { return json } |
|
19 |
-//} |
|
20 |
-// |
|
21 |
-//fileprivate struct WXResource: Resource, Parsable { |
|
22 |
-// typealias Model = UserInfo |
|
23 |
-// |
|
24 |
-// var path: Interfaces { return .authorize } |
|
25 |
-// var parameter: Parameter = [:] |
|
26 |
-// |
|
27 |
-// func parse(_ json: JSON) -> UserInfo? { |
|
28 |
-// guard let result = json["data"] as? JSON else { return nil } |
|
29 |
-// return UserInfo(json: result) |
|
30 |
-// } |
|
31 |
-//} |
|
32 |
- |
|
33 |
-class WXUserInfoRemoteAPI: UserInfoRemoteAPI { |
|
34 |
- |
|
35 |
- typealias Model = UserInfo |
|
36 |
-// fileprivate var wxResource: WXResource |
|
37 |
-// fileprivate var wxTokenResource: DefaultResource |
|
38 |
-// fileprivate var wxUserInfoResource: DefaultResource |
|
15 |
+struct WXUserInfoRemoteAPI: UserInfoRemoteAPI { |
|
39 | 16 |
|
40 |
- init() { |
|
41 |
- let wxUrl = "https://api.weixin.qq.com" |
|
42 |
-// self.wxResource = WXResource() |
|
43 |
-// self.wxTokenResource = DefaultResource(host: wxUrl, path: .wxAccessToken, parameter: [:]) |
|
44 |
-// self.wxUserInfoResource = DefaultResource(host: wxUrl, path: .wxUserInfo, parameter: [:]) |
|
45 |
- } |
|
17 |
+ init() {} |
|
46 | 18 |
|
47 | 19 |
func login() -> Single<UserInfo> { |
20 |
+ #if (arch(i386) || arch(x86_64)) |
|
48 | 21 |
return Single.create(subscribe: { (observer) in |
49 | 22 |
observer(.success(UserInfo(json: ["user_id": "fiDz2Ms" as AnyObject, "userName": "郑剑飞" as AnyObject, "photoPath": "https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJibSYLgvXpMakvD9FaCqfiaWqcMiaiaz905YxWPuO4hy8F2lGheV7kVr9vKKXFgmL1S5s4QJgxwuwtVw/132" as AnyObject]))) |
50 | 23 |
return Disposables.create() |
51 | 24 |
}) |
52 |
- return Single.create(subscribe: { (observer) -> Disposable in |
|
53 |
- |
|
54 |
-// let wxLoginObserver = self.addWXLoginDidFinish() |
|
55 |
-// let wxTokenObserver = self.getWXToken() |
|
56 |
-// let wxUserInfoObserver = self.getWXUserInfo() |
|
57 |
-// let loginObserver = self.wxLogin() |
|
58 |
-// |
|
59 |
-// Single.of(wxLoginObserver, |
|
60 |
-// wxTokenObserver, |
|
61 |
-// wxUserInfoObserver) |
|
62 |
-// .concat().asSingle() |
|
63 |
-// .subscribe({_ in |
|
64 |
-// loginObserver.asSingle() |
|
65 |
-// .subscribe(onNext: { (userInfo) in |
|
66 |
-// observer.onNext(userInfo) |
|
67 |
-// self.removeWXLoginDidFinish() |
|
68 |
-// }).dispose() |
|
69 |
-// }).dispose() |
|
70 |
- |
|
71 |
- return Disposables.create() |
|
25 |
+ #else |
|
26 |
+ loginWithWeChat() |
|
27 |
+ return addWXLoginDidFinish().flatMap({ |
|
28 |
+ return self.getWXToken(param: $0) |
|
29 |
+ }).flatMap({ |
|
30 |
+ return self.getWXUserInfo(param: $0) |
|
31 |
+ }).flatMap({ |
|
32 |
+ return self.wxLogin(param: $0) |
|
33 |
+ }).do(onSuccess: { res in |
|
34 |
+ print(res) |
|
72 | 35 |
}) |
36 |
+ #endif |
|
73 | 37 |
} |
74 | 38 |
|
75 | 39 |
fileprivate func loginWithWeChat() { |
@@ -80,68 +44,65 @@ class WXUserInfoRemoteAPI: UserInfoRemoteAPI { |
||
80 | 44 |
WXApi.send(request) |
81 | 45 |
} |
82 | 46 |
|
83 |
-// fileprivate func addWXLoginDidFinish() -> Completable { |
|
84 |
-// return Single.create { (observer) in |
|
85 |
-//// NotificationCenter.default.addObserver(forName: Notification.WXLoginNotification, object: nil, queue: nil) { (notification) in |
|
86 |
-//// guard let userInfo = notification.userInfo, |
|
87 |
-//// let code = userInfo["code"] as? String else { return } |
|
88 |
-//// self.wxTokenResource.parameter = ["appid": WXAppid, "secret": WXSecret, |
|
89 |
-//// "code": code, "grant_type": "authorization_code"] |
|
90 |
-//// observer.onCompleted() |
|
91 |
-//// } |
|
92 |
-//// |
|
93 |
-// return Disposables.create() |
|
94 |
-// } |
|
95 |
-// } |
|
96 |
-// |
|
97 |
-// fileprivate func getWXToken() -> Completable { |
|
98 |
-// return Single.create({ (observer) in |
|
99 |
-//// let resource = ContentResource.init(host:"https://api.weixin.qq.com", |
|
100 |
-//// path: .wxAccessToken, |
|
101 |
-//// parameter: <#T##Parameter#>, parseJSON: <#T##(JSON) -> _?#>) |
|
102 |
-//// NetworkApi.share.get(resource: self.wxTokenResource) { (result) in |
|
103 |
-//// guard case let .success(data) = result, |
|
104 |
-//// let token = data["access_token"] as? String, |
|
105 |
-//// let openId = data["openid"] as? String else { return } |
|
106 |
-//// self.wxUserInfoResource.parameter = ["access_token": token, "openid": openId] |
|
107 |
-//// observer.onCompleted() |
|
108 |
-//// } |
|
109 |
-// |
|
110 |
-// return Disposables.create() |
|
111 |
-// }) |
|
112 |
-// } |
|
113 |
-// |
|
114 |
-// fileprivate func getWXUserInfo() -> Completable { |
|
115 |
-// return Single.create({ (observer) in |
|
116 |
-//// NetworkApi.share.get(resource: self.wxUserInfoResource) { (result) in |
|
117 |
-//// guard case let .success(data) = result else { return } |
|
118 |
-//// if let errcode = data["errcode"] as? Int, |
|
119 |
-//// errcode == 40003 { return } |
|
120 |
-//// self.wxResource.parameter = data |
|
121 |
-//// observer.onCompleted() |
|
122 |
-//// } |
|
123 |
-// |
|
124 |
-// return Disposables.create() |
|
125 |
-// }) |
|
126 |
-// } |
|
127 |
-// |
|
128 |
-// fileprivate func wxLogin() -> Single<UserInfo> { |
|
129 |
-// return Single.create({ (observer) in |
|
130 |
-//// NetworkApi.share.post(resource: self.wxResource) { (result) in |
|
131 |
-//// guard case let .success(data) = result else { return } |
|
132 |
-//// observer.onNext(data) |
|
133 |
-//// observer.onCompleted() |
|
134 |
-//// } |
|
135 |
-//// |
|
136 |
-// return Disposables.create() |
|
137 |
-// }) |
|
138 |
-// } |
|
47 |
+ fileprivate func addWXLoginDidFinish() -> Single<[String: String]> { |
|
48 |
+ return Single.create(subscribe: { observer -> Disposable in |
|
49 |
+ NotificationCenter.default.addObserver(forName: Notification.wxNotification.login, object: nil, queue: nil, using: { notification in |
|
50 |
+ guard let userInfo = notification.userInfo, |
|
51 |
+ let errcode = userInfo["errCode"] as? Int, |
|
52 |
+ let code = userInfo["code"] as? String else { |
|
53 |
+ Toast.show(message: "获取code失败") |
|
54 |
+ return observer(.error(ParseError())) |
|
55 |
+ } |
|
56 |
+ switch errcode { |
|
57 |
+ case 0: |
|
58 |
+ observer(.success(["appid": WXAppid, "secret": WXSecret, |
|
59 |
+ "code": code, "grant_type": "authorization_code"])) |
|
60 |
+ case -4: |
|
61 |
+ Toast.show(message: "您拒绝授权,登录失败") |
|
62 |
+ break |
|
63 |
+ case -2: |
|
64 |
+ Toast.show(message: "您取消了登录,登录失败") |
|
65 |
+ break |
|
66 |
+ default: |
|
67 |
+ Toast.show(message: "发生未知错误,登录失败") |
|
68 |
+ break |
|
69 |
+ } |
|
70 |
+ return observer(.error(BusinessError(id: errcode))) |
|
71 |
+ }) |
|
72 |
+ return Disposables.create() |
|
73 |
+ }) |
|
74 |
+ } |
|
75 |
+ |
|
76 |
+ fileprivate func parseWxToken(json: JSON) -> [String: String]? { |
|
77 |
+ guard let token = json["access_token"] as? String, |
|
78 |
+ let openId = json["openid"] as? String else { return nil } |
|
79 |
+ return ["access_token": token, "openid": openId] |
|
80 |
+ } |
|
81 |
+ |
|
82 |
+ fileprivate func getWXToken(param: [String: String]) -> Single<[String: String]> { |
|
83 |
+ let resource = ContentResource<[String: String]>(host: "https://api.weixin.qq.com", |
|
84 |
+ path: .wxAccessToken, |
|
85 |
+ parameter: param, |
|
86 |
+ parseJSON: parseWxToken) |
|
87 |
+ |
|
88 |
+ return NetworkApi.share.get(resource: resource) |
|
89 |
+ } |
|
90 |
+ |
|
91 |
+ fileprivate func getWXUserInfo(param: [String: String]) -> Single<[String: Any]> { |
|
92 |
+ let resource = ContentResource<[String: Any]>(host: "https://api.weixin.qq.com", |
|
93 |
+ path: .wxUserInfo, |
|
94 |
+ parameter: param, |
|
95 |
+ parseJSON: { $0 }) |
|
96 |
+ return NetworkApi.share.get(resource: resource) |
|
97 |
+ } |
|
139 | 98 |
|
140 |
- fileprivate func removeWXLoginDidFinish() { |
|
141 |
- NotificationCenter.default.removeObserver(self, name: Notification.WXLoginNotification, object: nil) |
|
99 |
+ fileprivate func parseAuthorize(json: JSON) -> UserInfo? { |
|
100 |
+ guard let data = json["data"] as? [String: AnyObject] else { return nil } |
|
101 |
+ return UserInfo(json: data) |
|
142 | 102 |
} |
143 |
-} |
|
144 | 103 |
|
145 |
-extension Notification { |
|
146 |
- static let WXLoginNotification = Notification.Name("WXLoginDidFinishNotification") |
|
104 |
+ fileprivate func wxLogin(param: [String: Any]) -> Single<UserInfo> { |
|
105 |
+ let resource = ContentResource<UserInfo>(path: .authorize, parameter: param, parseJSON: parseAuthorize) |
|
106 |
+ return resource.loadContent() |
|
107 |
+ } |
|
147 | 108 |
} |
@@ -77,11 +77,17 @@ public class UserInfoViewModel { |
||
77 | 77 |
} |
78 | 78 |
|
79 | 79 |
public func wxLogin() { |
80 |
+ Toast.showActivity(message: "正在登陆") |
|
80 | 81 |
repository.wxLogin().subscribe(onSuccess: { (userInfo) in |
81 | 82 |
self.shareUserInfo.accept(userInfo) |
82 | 83 |
self._loginCompleted.onNext(()) |
83 | 84 |
}) { (error) in |
85 |
+ print(error) |
|
84 | 86 |
#warning("错误处理") |
85 | 87 |
}.disposed(by: disposeBag) |
86 | 88 |
} |
89 |
+ |
|
90 |
+ deinit { |
|
91 |
+ print("销毁") |
|
92 |
+ } |
|
87 | 93 |
} |
@@ -11,5 +11,6 @@ import Foundation |
||
11 | 11 |
public extension Notification { |
12 | 12 |
struct wxNotification { |
13 | 13 |
public static let payDidFinish = Notification.Name("WXPayDidFinishNotification") |
14 |
+ public static let login = Notification.Name("WXLoginDidFinishNotification") |
|
14 | 15 |
} |
15 | 16 |
} |
@@ -83,6 +83,5 @@ extension LoginViewController { |
||
83 | 83 |
self.guestLoginBtn.isHidden = false |
84 | 84 |
} |
85 | 85 |
}).disposed(by: disposeBag) |
86 |
- |
|
87 | 86 |
} |
88 | 87 |
} |