最近公司需求,需要把APP从手表收集的健康数据传输到fitbit,然后网上查资料发现没有什么文章关于怎么操作,看官方全英文又不太懂,自己慢慢摸索加上查到一个外国老哥4年前写的demo,算是折腾出来了,写个文章纪录一下
首先,因为fitbit没有专门的APP用SDK,它使用的是web api
那我们第一步首先要先注册一个fitbit账号 (地址:accounts.fitbit.com/login )
注册完登录后,可以到(dev.fitbit.com/build/refer… ) 官方文档查看
通过官方介绍,我们一步一步开始,第一步是让你了解,可以跳过,第二步正式开始,你要接入fitbit首先要创建一个APP
基本都是必填项,也不难理解,主要注意的是OAuth2 application type和redirect url
OAuth2 application type:根据官方建议是选server,这里我选用的是client,具体区别不太清楚
redirect url:这个是iOS APP用的url schemes,这里注意别用大写字母,至少://前面必须小写,如果你大写会发现,它返回的时候变小写了
access type:根据自己需要,要读写还是只读
保存后生成client id和client secret等,如果有什么改动可以点击edit application settings
回到iOS APP来,首先创建一个APP(废话),其次配置一下info.plist
这里根据你在fitbit配置的redirect url配置,不知道哪个在前哪个在后可以跟我一样,写一样的就是了
然后在APPDelegate.m里添加协议方法,作为接收fitbit重定向回调的准备
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
NSNotification *notification = [NSNotification notificationWithName:@"SampleBitLaunchNotification" object:nil userInfo:@{@"URL":url}];
[[NSNotificationCenter defaultCenter] postNotification:notification];
return YES;
}
这时准备工作已经完成,进入正题,首先要让用户授权fitbit给我们,让我们拿到token,作为用于读取和写入的重要参数
1.先拿到authorization code
-(void)login:(UIViewController*)viewController{
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@?response_type=code&client_id=%@&redirect_uri=%@&scope=%@&expires_in=%@",_authUrl,_clientID,_redirectURI,_defaultScope,_expiresIn]];
SFSafariViewController *authorizationViewController = [[SFSafariViewController alloc] initWithURL:url];
authorizationViewController.delegate = **self**;
_authorizationVC = authorizationViewController;
[viewController presentViewController:authorizationViewController animated:**YES** completion:**nil**];
}
注意:这里必须用 SFSafariViewController不能用wkwebview 参数可以查看
通过APPDelegate的那个代理方法,我们可以从useinfo中拿到一个网址
Example: supertest://supertest?code=7b64c4b088b9c841d15bcac15d4aa7433d35af3e#= 这时我们可以提取出我们要的code,即为7b64c4b088b9c841d15bcac15d4aa7433d35af3e(自己做方法提取)
2.拿到code后,我们就可以通过post 请求去获取到token(省略fitbit登录授权页面,自己看看就知道了) 我用AFNetworking进行post 请求,需要配置请求头如下
NSString *base64 = [**self** base64String:[NSString stringWithFormat:@"%@:%@",_clientID,_clientSecret]];
[manager.requestSerializer setValue:[NSString stringWithFormat:@"Basic %@",base64] forHTTPHeaderField:@"Authorization"];
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"application/x-www-form-urlencoded"];
Authorization的值是用 clientID:clientSecret 然后转base64,拼上“Basic空格”
请求内容如下
{
clientId = 你的client id;
code = 你刚获取到的code;
grant_type = authorization_code;
redirect_uri = 你的redirect url;
}
请求成功你即可拿到token了,保存下来使用,token失效时间可以自己对应api文档设定,要多久随意了
3.拿到了token就可以请求fitbit数据,具体文档官方提供了一个可视化可测试的页面(dev.fitbit.com/build/refer… )
比如我要设定一个体重
其他的接口就由自己摸索了,到此基本完成,token失效可以再调整授权,取消授权去调用api.fitbit.com/oauth2/revo… 带上token参数即可
文章写得乱,工作忙有空再重新排版了,有问题可以问,有空我知道了就回复一下
外国老哥的demo地址:github.com/insanelydee…
我是菜鸡,写得不好,有问题,勿喷