公司项目最近在做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
网友评论