微信Api暂时未开放 Mac catalyst 登陆,所以只能走网页版微信登陆那一套。微信官方传送门.
虽然看文档简单的1p,但是狗哥还是掉了一丢丢秀发。
来说下心路历程:
2. 微信登陆我们主要的任务是拿到code交给后台我们的任务就完成了。那么扫码登陆我们只要搞到code就 可以了。
5. so 根据文档找到一个链接 不管三七二十一 先用webview加载康康是什么 莫? 正是我们要的扫码登陆界面 扫他
18. 扫码之后你会惊奇的发现你跳转了一个你异常熟悉的页面(redirect_uri就是它)。。。。。。一顿查找和打印之后发现在跳转新页面之前webview还走了一个URL 在这个URL中可以拿到我们要的code 泪目啊
[狗头] 是不是有人会问redirect_uri怎么填呀?
答:对于mac catalyst来说用处不大 为什么呢 请看下面分析。
let redirect_uri = "微信回调域名"
let urlStr = "https://open.weixin.qq.com/connect/qrconnect?appid=\("web端app ID web端app ID web端app ID 不是移动端")&redirect_uri=\(redirect_uri.urlEncode() ?? redirect_uri as NSString)&response_type=code&scope=snsapi_login&state=STATE#wechat_redirect"
let config = WKWebViewConfiguration()
config.allowsInlineMediaPlayback = true
webView = WKWebView.init(frame: .zero, configuration: config)
webView.navigationDelegate = self
webView.uiDelegate = self
view.addSubview(webView)
webView.snp.makeConstraints { (make) in
make.top.equalTo(88)
make.bottom.left.right.equalTo(view)
}
if let url = URL(string: urlStr) {
webView.load(URLRequest.init(url: url))
}
extension WebLoginViewController : WKNavigationDelegate,WKUIDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
// 拿到将要跳转页面url
guard let codeUrl = navigationAction.request.url?.absoluteURL else { return decisionHandler(WKNavigationActionPolicy.allow) }
// 截取链接中的code
guard let code = getParamByName(name: "code", urlString: codeUrl) else { return decisionHandler(WKNavigationActionPolicy.allow)
}
// 取消跳转 (即将跳转到redirect_uri页面)
decisionHandler(WKNavigationActionPolicy.cancel)
// 将code传给服务器完成登陆操作 成功之后 pop出去
back()
}
// 将URL中参数提取出来
func getParamByName(name: String,urlString: URL) -> String? {
guard let components = URLComponents(url: urlString, resolvingAgainstBaseURL: true),
let queryItems = components.queryItems else { return nil }
var params = [String: String]()
_ = queryItems.reduce(into: params) { (result, item) in
params[item.name] = item.value
}
return params[name]
}
}