示例 Demo :
准备工作
你一共需要准备以下内容:
配置 iOS Universal Links
配置 apple-app-site-association 文件
在 Apple Developer 控制台 Membership 页面找到自己的 Team ID:
在 Xcode Targets -> Signing & Capabilities 中找到 Bundle Identifier:
接下来创建 apple-app-site-association 文件:
假设你的 Team ID 为 xxxxxxx, Bundle Identifier 为 com.example.exampleApp, 设置 Universal Link 的 Path 为/native/*
, 则 apple-app-site-association 如下:
假设你的 Team ID 为 xxxxxxx, Bundle Identifier 为 com.example.exampleApp, 设置 Universal Link 的 Path 为/native/*
, 则 apple-app-site-association 如下:
{
"applinks": {
"apps": [],
"details": [
{
"appIDs": [ "xxxxxxx.com.example.exampleApp" ],
"paths": [ "/native/*" ]
}
]
}
}
你需要将此文件部署到你的域名的 .well-known/apple-app-site-association 链接下,如你的域名为 example.com,则需要通过 https://example.com/.well-known/apple-app-site-association 访问到该文件。以下几点需要注意:
apple-app-site-association 需要是一个合法的 JSON 文件,但是没有 .json 后缀。
content-type 需要设置为 application/json
以下是一个 nginx 配置示例:(这里将 apple-app-site-association 文件放与某个 .well-known 文件夹下)
server {
listen 80;
listen 443 ssl;
server_name authing.cn;
ssl_certificate /mnt/cerm/client/1_authing.cn_bundle.crt;
ssl_certificate_key /mnt/cerm/client/2_authing.cn.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location /.well-known {
alias /path/to/your/.well-known/folder;
try_files $uri $uri/ =404;
}
}
在 Xcode 中配置 Associated Domains
加下来在 Xcode 中配置 Associated Domains。 在 Xcode Targets -> Signing & Capabilities 页面点击右上角的 +Capability :
选择 Associated Domains:
假设你的域名是 example.com, 则填入 applinks:example.com
:
验证 Universal Links 是否生效
假设你的域名为 example.com,Path 为 /native/*
在手机上安装了你的 App 之后,使用 Safari 浏览器访问 https://example.com/native/
,网上拉动网页,你应该能看到你的 App:
再访问 https://example.com/native/xxx
,依旧可以看到。
在微信开放平台填写 Universal Links
在 Authing 控制台配置微信移动应用信息
在 Authing 控制台 用户池 -> 第三方登录 -> 社会化登录 页面找到“移动端社会化登录“中的“微信移动应用“:
填入你的移动应用 AppID 和 AppSecret:
AppID 和 AppSecret 可在微信开放平台 管理中心 - 移动应用 - 应用详情 页面看到:
正式接入
接入 WechatOpenSDK
发起登录请求
成功接入 SDK 之后,你应该能成功打开微信获取用户授权并获取到 authorization code:
下面是发起微信登录请求代码示例( Swift):
func loginByWechat() {
let req = SendAuthReq()
req.scope = "snsapi_userinfo" //获取用户信息
req.state = "123" //随机值即可,这里用时间戳
WXApi.send(req)
}
你可以在 AppDelegate 或 SceneDelegate 的 onResp 方法获取到授权码 code, 如下图所示:
接收微信回调数据获取 code
下面是一个示例代码(Swift 语言):
func onResp(_ resp: BaseResp) {
debugPrint(resp)
// 微信登录请求信息
if resp.isKind(of: SendAuthResp.self) {
if resp.errCode == 0 && resp.type == 0{
let response = resp as! SendAuthResp
// 微信 authorication_code
let code = response.code
debugPrint("code: " ,code)
}
}
}
换取用户信息
用户同意收取获取到 code 之后,需要调用 Authing 的接口获取用户信息:
GET
https://oauth.authing.cn/oauth/wechatmobile/auth/:userPoolId
使用 code 换取用户信息。
Path Parameters
Query Parameters
{
emailVerified: false,
username: '廖长江',
nickname: '廖长江',
company: '',
photo: 'https://usercontents.authing.cn/avatar-5e53ee0684197a42d319628b-1582558729878',
loginsCount: 28,
registerMethod: 'oauth:wechatmobile',
blocked: false,
isDeleted: false,
oauth: '{"openid":"osJ4Ys7kderNmGP7qgjIiNSLPm94","nickname":"廖长江","sex":1,"language":"en","city":"海淀","province":"北京","country":"中国","headimgurl":"http://thirdwx.qlogo.cn/mmopen/vi_32/Z6XlHHTohpQQMqUjDsWibCaRH6RZiafrbibBEVzffMp7Co2kGbUmfo9ln80tOPYv9RRGJIvhv7OKrwncssxOod3xQ/132","privilege":[],"unionid":"o0pqE6Fbr5M-exSu_PeL_sjwN44U"}',
metadata: '""',
_id: "5e53ee0684197a42d319628b",
unionid: 'o0pqE6Fbr5M-exSu_PeL_sjwN44U',
openid: 'osJ4Ys7kderNmGP7qgjIiNSLPm94',
lastIP: '::ffff:192.168.0.106',
lastLogin: "2020-02-26T02:53:56.223Z",
signedUp: "2020-02-24T15:38:46.620Z",
token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7InVuaW9uaWQiOiJvMHBxRTZGYnI1TS1leFN1X1BlTF9zandONDRVIiwiaWQiOiI1ZTUzZWUwNjg0MTk3YTQyZDMxOTYyOGIiLCJjbGllbnRJZCI6IjVlNGNkZDA1NWRmM2RmNjVkYzU4Yjk3ZCJ9LCJpYXQiOjE1ODI2ODU2MzYsImV4cCI6MTU4Mzk4MTYzNn0.MHo07ilZl8ovur_B2iSIQ0wSHyMsPP7EOgREVVfPoGM',
tokenExpiredAt: "2020-03-12T02:53:56.000Z",
phone: null
}
示例代码(Swift):
func convertToDictionary(text: String) -> [String: Any]? {
if let data = text.data(using: .utf8) {
do {
return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
} catch {
print(error.localizedDescription)
}
}
return nil
}
let url = "https://oauth.authing.cn/oauth/wechatmobile/auth/\(UserPoolId)?code=\(code!)"
AF.request(url).responseString { response in
let resp = convertToDictionary(text: response.value!)!
// Authing 业务状态码, 200 表示成功
let code = resp["code"]! as! Int
let message = resp["message"]! as! String
if code == 200 {
let dataStr = resp["data"]! as! String
let data = convertToDictionary(text: dataStr)!
debugPrint("Data: \(data)")
updateUserInfoEnvVariable(data: data)
} else {
debugPrint("Message: ", message)
}
}
完成接入