swift Mac catalyst 微信扫码登陆

前言

微信Api暂时未开放 Mac catalyst 登陆,所以只能走网页版微信登陆那一套。微信官方传送门.

思路

 虽然看文档简单的1p,但是狗哥还是掉了一丢丢秀发。‍
 来说下心路历程:
 2. 微信登陆我们主要的任务是拿到code交给后台我们的任务就完成了。那么扫码登陆我们只要搞到code就 可以了。
 5. so 根据文档找到一个链接 不管三七二十一  先用webview加载康康是什么  莫? 正是我们要的扫码登陆界面  扫他
 18. 扫码之后你会惊奇的发现你跳转了一个你异常熟悉的页面(redirect_uri就是它)。。。。。。一顿查找和打印之后发现在跳转新页面之前webview还走了一个URL  在这个URL中可以拿到我们要的code   泪目啊 

代码

1、准备url参数

swift Mac catalyst 微信扫码登陆_第1张图片
[狗头] 是不是有人会问redirect_uri怎么填呀?
答:对于mac catalyst来说用处不大 为什么呢 请看下面分析。

2、具体操作
        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]
        
    }
    
}

你可能感兴趣的:(swift,ios,swift,微信,开发语言)