iOS APP接入fitbit并且实现传输数据

654 阅读3分钟

最近公司需求,需要把APP从手表收集的健康数据传输到fitbit,然后网上查资料发现没有什么文章关于怎么操作,看官方全英文又不太懂,自己慢慢摸索加上查到一个外国老哥4年前写的demo,算是折腾出来了,写个文章纪录一下

首先,因为fitbit没有专门的APP用SDK,它使用的是web api

那我们第一步首先要先注册一个fitbit账号 (地址:accounts.fitbit.com/login

注册完登录后,可以到(dev.fitbit.com/build/refer… ) 官方文档查看

image.png

通过官方介绍,我们一步一步开始,第一步是让你了解,可以跳过,第二步正式开始,你要接入fitbit首先要创建一个APP

image.png

基本都是必填项,也不难理解,主要注意的是OAuth2 application type和redirect url

OAuth2 application type:根据官方建议是选server,这里我选用的是client,具体区别不太清楚

redirect url:这个是iOS APP用的url schemes,这里注意别用大写字母,至少://前面必须小写,如果你大写会发现,它返回的时候变小写了

access type:根据自己需要,要读写还是只读

image.png

保存后生成client id和client secret等,如果有什么改动可以点击edit application settings

回到iOS APP来,首先创建一个APP(废话),其次配置一下info.plist

image.png 这里根据你在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 参数可以查看

image.png

image.png

通过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…

比如我要设定一个体重

image.png

其他的接口就由自己摸索了,到此基本完成,token失效可以再调整授权,取消授权去调用api.fitbit.com/oauth2/revo… 带上token参数即可

文章写得乱,工作忙有空再重新排版了,有问题可以问,有空我知道了就回复一下

外国老哥的demo地址:github.com/insanelydee…

我是菜鸡,写得不好,有问题,勿喷