iOS App关联谷歌Home流程,包括AppFlip,oAut

2021-12-01  本文已影响0人  wangyin758

 公司项目最近在做IOT产品,需要接入第三方GooleHome,能够绑定自己平台设备到谷歌,从而能使用Google Home或者Google Assistant控制平台设备。例如开关锁等操作。网上找了一些零零散散的资料,刚开始的确有些摸不着头脑🤣,还好后续通过与后端人员的配合,还是成功的实现了app链接GoogleHome的流程,好了闲话不多说了直接上流程。

一.app Universal link(通用链接配置)

1.按照对应格式配置app通用链接,首先在本地生成一个空文件,直接Xcode新建了一个GeoJsonFile如下图,取名必须为 apple-app-site-association 然后写好相应格式的json后把文件后缀手动去掉

通用链接格式配置网上有很多资料,就不多说了,直接贴出我这边配置的格式(苹果最新要求的格式)

{ "applinks": { "details": [   { "appIDs": ["app_ID"],  "components": ["*"] }  ] },   "webcredentials": { "apps": [ "app_ID" ] }}

这里的appID是指:TeamID+BundleId的组成(例:3KC8DDLAS.com.apple.test)(TeamID可以在开发者账号里面查看,BundleId是项目的Bundle Identifier)。去掉的两行都填写appID就行了,下面的webcredentials那一栏也可以不填.

2.上传apple-app-site-association文件到服务器

(1)需要将apple-app-site-association文件发给服务器端的同事,让他上传到域名的根目录下或者.well-known的子目录下(这里的域名必须要是可访问的域名,由服务器端的同事给到)。最好根目录和.well-known目录下都上传一份,配置的域名就接下来需要在xcode工程中配置的,要求上传成功后能够链接到地址下载空文件.

(2)Web server需要支持https,客户端通过https来访问,并且不支持重定向。

3.工程配置通用链接

定位Signing&Capabilities找到Associated Domains,开启,然后填写applinks: + 域名(存上文提到的空文件的域名)。这里要注意的是此时的APPID要允许使用Associated Domains,没有的话,到开发者中心AppID一栏中去配置,不知道配置的度娘搜索一下吧

二.实现App-Filp(应用翻转)

1.后台人员配置对应通用链接以及app信息后,获取agent_id 链接如下https://console.actions.google.com/u/0/project/revolo-lock/smarthomeaccountlinking/, 点击右上角三个点按钮展开点击Project setting显示如下图,Project ID就是agent-id

2.app跳转谷歌

这是谷歌应用翻转最关键的一步了,app端实现的不难,在需要跳转谷歌Home的地方跳转 "https://madeby.google.com/home-app/?deeplink=setup/ha_linking?agent_id=agent_id" 格式的链接,调用UIApplication open的方法即可,下图截取于谷歌助手开发文档,这里URL要进行转义编码.

三.实现谷歌app翻转后本地app处理

1.本地处理在AppDelegate中实现,具体参数配置可以参考此链接https://developers.google.com/identity/account-linking/app-flip-ios,示例都是swift版本代码,这里贴出我这边OC处理代码

#define kGoogleUniversalStr @"xxxxxxxx.cloudfront.net"

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler{         

if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb])        {            

NSURL *webpageURL = userActivity.webpageURL;            

NSString *host = webpageURL.host;            

if ([host isEqualToString:kGoogleUniversalStr])          {                

//谷歌翻转验证                

NSString *urlStr = webpageURL.absoluteString;                                 

NSArray *strArr = [urlStr componentsSeparatedByString:@"&"];               

NSString *clientID = [(NSString*)strArr[1] stringByReplacingOccurrencesOfString:@"client_id=" withString:@""];              

NSString *redirect_uri = [(NSString*)strArr[2] stringByReplacingOccurrencesOfString:@"redirect_uri=" withString:@""];              NSString *state = [(NSString*)strArr.lastObject stringByReplacingOccurrencesOfString:@"state=" withString:@""];                     

[[KDSHttpManager sharedManager] getGoogleAuthCodeWithClientID:clientID withState:state withRedirectUrl:redirect_uri               success:^(NSString *code) {                                         

                 ReGoogleOAuthController *vc = [[ReGoogleOAuthController alloc]init];                    

                 vc.authCode = code;                    

                  vc.redirect_url = redirect_uri;                    

                   vc.state = state;                   

                     ReTabBarController *tabVc = (ReTabBarController*)[UIApplication   sharedApplication].keyWindow.rootViewController;                       ReNavigationViewController *nav = tabVc.selectedViewController;                    

                     [nav pushViewController:vc animated:YES];                                     

}  failure:^(NSError * _Nonnull error) {       }];             }             else             {                  //[[UIApplication sharedApplication] openURL:webpageURL options:nil completionHandler:nil];             }         }         

return YES; }

(1)具体参数方法解释

      当由 Google 应用程序打开时,您的应用程序的通用链接包含以下查询参数:

        client_id ( String ):谷歌client_id您的应用程序下注册的公司。

        scope ( List of String ):请用空格隔开的范围列表。

         state ( String ):由谷歌中使用的随机数,以验证该授权结果是响应于谷歌的呼出请求。

        redirect_uri ( String ):谷歌的通用连接。用于打开 Google 应用并传递结果的“翻转”URI。

        .宏定义字段kGoogleUniversalStr就是配置的通用链接域名

        .getGoogleAuthCodeWithClientID是服务器同事提供的获取谷歌Home oAuth授权口令的接口,这里提前做请求

(2)请求成功后跳转对应app界面,例如下图:

oauth

此时点击“链接”按钮,调用链接由“redirect_uri”拼接“state”、“code”而成,具体实现代码swift版本:

func returnAuthCode(code: String, state: String, redirectUri: String) {   

var redirectURL = URL(string: redirectUri)   

var components = URLComponents(url: redirectURL, resolvingAgainstBaseURL: false)    // Return the authorization code and original state   

let paramAuthCode = URLQueryItem(name: "code", value: code)   

let paramState = URLQueryItem(name: "state", value: state)    components?.queryItems = [paramAuthCode, paramState]   

if let resultURL = components?.url {       

UIApplication.shared.open(            resultURL,            options: [UIApplicationOpenURLOptionUniversalLinksOnly : true],            completionHandler: nil)   

}

所有参数配置成功后,跳转至谷歌Home会出现链接成功提示,若app有对应设备则会出现具体设备选择界面,自此整个流程就跑完了,成功后界面显示如下

google_home
上一篇下一篇

猜你喜欢

热点阅读