Flutter集成Fitbit OAuth2.0授权后触发PlatformException(CANCELED)异常排查
看起来你已经走完了Fitbit授权的大半流程,明明在Fitbit账户里能看到App已经获得授权,但回调回到App时却触发了CANCELED异常,拿不到授权码,这种情况确实挺闹心的。我帮你梳理几个最可能的问题点,按顺序排查试试:
1. 先确认Fitbit开发者后台的回调地址是否完全匹配
这是最常见的坑!Fitbit后台配置的Redirect URI必须和你代码里的redirectUri完全一致,包括大小写、符号、scheme和host,一点都不能错。你代码里的redirectUri是com.joola.onefiftyplushealth://device-callback,去Fitbit开发者后台检查一下,是不是一模一样?如果后台填的是http开头或者少了device-callback,肯定会导致回调失败。
2. 验证授权URL的有效性
你已经打印了authUrl,把这个URL复制到手机浏览器里打开,手动完成Fitbit登录和授权,看看浏览器地址栏跳转后的URL里有没有code参数:
- 如果能看到
code,说明Fitbit的授权流程没问题,问题出在App接收回调的环节; - 如果看不到
code,那说明你的授权URL参数有问题,比如scope编码错误、client_id填错了,再仔细核对一下这些参数。
3. 检查Android深层链接的Intent Filter配置
你的Manifest里的Intent Filter看起来基本正确,但有几个细节可以再确认:
- 确保没有其他Activity也注册了
com.joola.onefiftyplushealth这个scheme,否则回调请求可能被其他Activity拦截; - 可以尝试把Intent Filter的
android:label改成和你的App相关的名称(比如android:label="OneFiftyPlusHealth"),虽然这个不是核心问题,但有时候会影响系统对链接的识别; - 确认你的MainActivity的
launchMode是singleTop(你已经设置了),这个模式适合接收回调,不会创建新的Activity实例,避免回调丢失。
4. 调整FlutterWebAuth2的调用参数
试试在authenticate方法里添加popup: false参数,有些Android设备上默认的popup模式可能会导致回调无法正确传递到App:
final result = await FlutterWebAuth2.authenticate( url: authUrl, callbackUrlScheme: "com.joola.onefiftyplushealth", popup: false, // 添加这个参数 );
5. 排查版本兼容性问题
你用的是flutter_web_auth_2: ^4.1.0,可以尝试升级到最新版本,看看是不是版本里的已知bug导致的回调失败。另外,也可以检查一下Flutter SDK的版本,确保和插件版本兼容。
如果以上步骤都试过还是不行,可以试试清空App的缓存、重新安装App,或者换个测试设备试试,有时候系统缓存也会导致深层链接异常。
内容来源于stack exchange

