场景: 安卓客户端请求苹果登陆认证会跳转浏览器进行认证,完成认证后会重定向至服务端(eggjs),然后服务端完成逻辑(生成token)后需要能够跳回安卓客户端。 问题: 我在一个第三方库提供的例子中,它使用的是express进行服务端的逻辑处理,最后使用
const url = `intent://callback?#Intent;package=PACKAGE;scheme=signinwithapple;end`;
response.redirect(307, url);
进行重定向回来客户端成功了。 但是在eggjs中我使用类似的重定向方法:
const url = 'intent://callback?#Intent;package=PACKAGE;scheme=signinwithapple;end';
ctx.status = 307;
ctx.redirect(url);
却是报404;
然后我调断点进入egg的redirect方法,发现它会因为我url变量中协议(protocal)写的是intent不是http/https而把url重置为"/",最后跑进了unsafeRedirect()。但我不知道是不是因为这个原因而导致的重定向失败。
所以我想知道,egg中有能够重定向回安卓客户端的方法吗?
这个问题实际上应该可以拆成两部部分 1 如何通过浏览器唤醒app并跳转到指定界面。 2 如何重定向到唤醒url。 第一个问题按照特定规则构造url 就可以实现唤醒app。你动手把这个url 填到浏览器地址栏,应该要确保可以唤醒。 第二个问题 ctx.redirect(url); 行为应该设置http状体码,并在headers 填写了对应的重定向地址。https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/302 而egg实现时应该对redirect传入参数做了检测,限制了协议。可以试试这个API: ctx.unsafeRedirect(url) 不判断域名,直接跳转,一般不建议使用,明确了解可能带来的风险后使用。 如何实在不行可以返回一个新的界面,在界面里调用浏览器api进行跳转。
@CollapsarLi 我使用unsafeRedirect()后可以跳转了!十分感谢!