nixzhu / MonkeyKing

MonkeyKing helps you to post messages to Chinese Social Networks.
MIT License
2.76k stars 240 forks source link

支持微信 Universal Link #171

Closed lexrus closed 4 years ago

lexrus commented 4 years ago

为了解决『未验证应用』的问题,需要支持 Universal Link。 通过逆向分析 libWeChatSDK.a,找到 wechat_auth_tokenwechat_auth_context_id 的生成方式,生成有效的微信 Universal Link。

为保证兼容官方 SDK,也使用相同的 KeyChain 存储了 wechat_auth_token

由于 SHA1 不可逆,且 hash 的字符串有部分是用 timeIntervalSince1970 生成,所以并没有按照微信的方法来生成 wechat_auth_context_id,理论上微信端是无法检测出来的。

目前只实现了以下功能:

还有以下 universal link 功能没有处理:

不依赖这些功能的话可以暂时直接使用我的分支

nixzhu commented 4 years ago

LGTM 😍

nuomi1 commented 4 years ago

LGTM,hopper 默认字体真能看瞎眼。 (demo version 看个半小时就强制关闭了)

raymond-liao commented 4 years ago

public class func handleOpenUserActivity(_ userActivity: NSUserActivity) 方法需要返回 Bool 值,func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool 会用到的

lexrus commented 4 years ago

@gaoshanyu 那是应该返回 true 还是 false 呢?

Returns true to indicate that your app handled the activity or false to let iOS know that your app did not handle the activity.

还是把 deliver 方法的 DeliverCompletionHandler 有没有 error 作为 bool 返回?

nuomi1 commented 4 years ago

handleOpenURLhandleOpenUserActivity 一般是多个 handler 使用 || 顺序处理。 目前 handleOpenUserActivity 只有 WeChat,所以判断 webpageURL 是不是 help.wechat.com 即可。

lexrus commented 4 years ago

@gaoshanyu @nuomi1 谢谢,改了。

SuperY commented 4 years ago

QQ 也改。。 果然是一路的 QQ互联将于2020年7月6日进行universal link的校验工作

nuomi1 commented 4 years ago

QQ SDK:

微博 SDK:

lexrus commented 4 years ago

不更新 QQ SDK 好像不会造成什么伤害吧? 微信 SDK 不更新出『未验证应用』产品和 QA 都跳起来了。

SuperY commented 4 years ago

@lexrus 有问题啊,“未识别应用”。 qq

lexrus commented 4 years ago

🤦 晚上抽空看一下是不是一样的改法

lexrus commented 4 years ago

各位好, oauth 和 pay 也加上了,目前我这边没有开了这两个功能的 app,能不能麻烦你们测试一下。其它几个 universal link 不准备支持了,一是因为本来 MonkeyKing scheme 的实现也没支持,二是因为用到这些功能的应用更有可能会用官方 SDK。

SuperY commented 4 years ago

oauth的回调还是调用application(_: UIApplication, open url:那就是还没成功走universal link的样子。。

lexrus commented 4 years ago

@SuperY 只改了接收的部分,忘改发起的部分了,明天继续。

SuperY commented 4 years ago

🐞 分享会提示universal link校验不通过

lexrus commented 4 years ago

🐞 分享会提示universal link校验不通过

你这是没设置好吧,分享这块应该是通的,apple-app-site-association 写了吗。

lexrus commented 4 years ago

OAuth 的 universal link 流程我也测通了。

let account = MonkeyKing.Account.weChat(
    appID: kWXAppId,
    appKey: kAppKey,
    miniAppID: nil,
    universalLink: kUniversalLink
)
MonkeyKing.registerAccount(account)

// 下面会开始访问 https://api.weixin.qq.com/sns/oauth2/access_token?grant_type=authorization_code&appid=...
// 微信会通过访问当前 app 的 universal link,从而把 OAuth 的结果 code 传递回来,MonkeyKing 把它存在 keychain 中。
MonkeyKing.oauth(for: .weChat) { result in
    switch result {
    case .success(let dictionary):
        print(dictionary)
    case .failure(let error):
        print("error \(error.localizedDescription)")
    }
}

没其它问题的话,这个 PR 就不再改了,请各位 review。

SuperY commented 4 years ago

分享后的回调只跟了appID的path,按照我们产品的逻辑如果monkeyking不处理,会打开一个app内web页。还是说设计上需要自己处理这种回调结果?

lexrus commented 4 years ago

分享后的回调只跟了appID的path,按照我们产品的逻辑如果monkeyking不处理,会打开一个app内web页。还是说设计上需要自己处理这种回调结果?

是的,目前没处理回调。分享成功后访问的 universal link 貌似没有带任何命令或参数。 刚用 SwiftTrace 跟了一下,貌似是从粘贴板里看 result 是不是等于 0 来判断成功的?然后触发回调? 如果是的话我可以加一下这个成功失败的判断。

Screen Shot 2020-08-15 at 11 36 58 PM
lexrus commented 4 years ago

@SuperY 已处理回调,试了一下是和原来 scheme 的姿势一样的,复用了用来的代码。

nixzhu commented 4 years ago

感谢汤哥 @lexrus 的贡献!🎉

DavidWu109 commented 3 years ago

为什么要第二天才能消除未验证的应用

lexrus commented 3 years ago

为什么要第二天才能消除未验证的应用

测试下来第二天才能生效,我猜他们定时从日志里判断了『昨天』是不是有有效的 Universal Link 的分享,来决定要不要显示『未验证应用』。