Universal Links使用指南

最近搞微信授权登录,在开放平台创建app时发现需要配置Universal Links,以前没这个玩应儿,就研究研究怎么搞。

Universal Links是什么

这个翻译过来就是通用链接。如果设备里安装了你的app,用户点击一个Universal Links链接时,会直接跳转到你的app,无需通过safari中间中转。如果设备里没有安装你的app,点击Universal Links时,会在safari里打开你的链接。

Universal Links的一些特点

URL scheme相比,Universal Links有以下特点。

  • Uique(独特). 不像url scheme,别人的app不能声明你的Universal Links,因为你自己app的Universal Links都是指向你自己网站的标准http或者https链接。

  • Secure(安全). 当用户安装你的应用程序时,iOS会检查你已上传到Web服务器的apple-app-site-association文件,以确保你的网站允许您的应用程序代表你的网站打开URL。只有你有权利创建和上传此文件到你自己的web服务器,因此你的网站与应用程序的关联是有安全保障的。

  • Flexible(灵活). 即使未安装您的应用程序,Universal Links也可以使用。如果未安装您的应用程序,则按用户期望,点击指向您网站的链接可在Safari中打开内容。

  • Simple(简单). Universal Links链接可以在app和网站都能生效

  • Private(私人的). 其他应用程序可以与您的应用程序通信,而无需知道您的应用程序是否已安装。

注意
通用链接可让用户在点击WKWebViewUIWebView视图和Safari页面中的指向您网站的链接时打开您的应用程序,此外,这些链接还会导致调用openURL:,例如在Mail,Messages和其他应用程序中点击的链接。
当用户在Safari中浏览您的网站时,他们点击指向当前网页所在域中URL的通用链接,iOS会尊重该用户最有可能的意图,并在Safari中打开该链接。如果用户点击指向其他域中URL的通用链接,iOS将在您的应用中打开该链接。
对于运行9.0之前的iOS版本的用户,点击指向您网站的通用链接可在Safari中打开该链接。

app 如何支持Universal Links

  1. 你的web服务器(域名)需要支持https

  2. 你app支持Associated Domains,操作看下图

    在开发者网站里设置app支持Associated Domains

  3. Xcode工程里选择Signing&Capabilities,并且点击+ Capability添加Associated Domians.操作步骤如下

    Xcode里操作步骤

  4. Associated Domians里点击+添加Domains内容格式如下:
    applinks:我的网站域名。 比如百度的:applinks:www.baidu.com

  5. 创建apple-app-site-association文件,无后缀名!文件内容如下:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "9JA89QQLNQ.com.apple.wwdc",
                "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
            },
            {
                "appID": "ABCD1234.com.apple.wwdc",
                "paths": [ "*" ]
            }
        ]
    }
}

注意
apps必须有,并且值为空数组。
details里列出自己网站想支持的app内容,值是数组
appID:的值格式如下:<开发者账号teamID.你app的bundleID>,teamID从步骤2的图片里可以看到。
paths:值是数组,里面的内容,是自己想支持的路径,可以使用通配符*或者单个匹配字符?

  1. apple-app-site-association文件上传到web服务器根目录下。
    比如你的网站是cn.bing.com,就放在这个目录下即可。国内大部分是阿里云服务器,可以参考这个文章怎么把文件放到阿里云web服务器根目录下。

注意,也可以把apple-app-site-association文件上传到根目录的.well-known目录下
上传完成之后:可以通过https链接直接访问不要有重定向。
https://<domain>/apple-app-site-association or https://<domain>/.well-known/apple-app-site-association

苹果也提供了网站验证apple-app-site-association文件是否放置正确有效。

验证时,搜索框里输入的内容注意这个格式:
https://<domain>/paths,paths就是你在apple-app-site-association文件里配置的路径
验证效果如下:

验证结果

  1. app delegate里需要处理UserActivity 对象
func application(_ application: UIApplication,
                 continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([Any]?) -> Void) -> Bool
{
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
        let incomingURL = userActivity.webpageURL,
        let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true),
        let path = components.path,
        let params = components.queryItems else {
            return false
    }
    
    print("path = \(path)")
    
    if let albumName = params.first(where: { $0.name == "albumname" } )?.value,
        let photoIndex = params.first(where: { $0.name == "index" })?.value {
        
        print("album = \(albumName)")
        print("photoIndex = \(photoIndex)")
        return true
        
    } else {
        print("Either album name or photo index missing")
        return false
    }
}

8、配置参数
当你使用微信的sdk直接授权登录时,注册时一般都会加入Universal Links,如下所示

[WXApi registerApp:APP_ID universalLink:UNIVERSAL_LINK];

但是如果你使用友盟中间转接做微信授权登录时,可能就会遇到坑了。我现在对接时,友盟和微信很早就支持了Universal Links,但是友盟文档里没有明确标注出来,我最后在友盟sdk的版本迭代记录里查到了答案。通过友盟做微信第三方登录,需要在友盟里配置微信的Universal Links,如下所示

//配置universal links相关参数//这里参数是[AnyHasable:Any],所以要rawValue代替
        UMSocialGlobal.shareInstance()?.universalLinkDic = [
            UMSocialPlatformType.wechatSession.rawValue:"https://xxxx/"
        ]
        //友盟中,微信登录相关信息初始化
        UMSocialGlobal.shareInstance()?.isUsingHttpsWhenShareContent = false // 当前网络请求是否用https
        UMSocialManager.default()?.setPlaform(.wechatSession, appKey: whWeChatAppId, appSecret: whWeChatAppSerect, redirectURL: "https://www.umeng.com/social")//注册微信

这个值需要跟你在微信开放平台配置的Universal Links保持一致,不然调起微信之后会提示Universal Links不匹配。
敲黑板: 如果没有在友盟里配置微信的Universal Links,就会报下面的错误:

2020-04-20 22:08:49 UMengShare<6.9.8>(Info):[UMSocialWechatHandler:978][SWI10008]微信授权登录提示该链接无法访问。 
https://developer.umeng.com/docs/66632/detail/67043?um_channel=sdk

其实上面这个错误定位的是没有在微信开放平台开通微信登录权限,实际上我们在微信开放平台开通这个权限了。

在友盟里配置好微信的Universal links之后,调用微信登录就可以启动微信APP授权了

9、遇到的坑

  • 手机里没有安装微信,启动网页登录授权时,点击取消APP crash 。这个是因为我的APP里使用了SceneDelegate,网页授权弹窗里有UIAlertView,但是SceneDelegate不支持UIAlertView的回调。解决办法:在info.plist里删除Application Scene Manifest,工程里的SceneDelegate文件是否删除都无所谓了。也要注释掉AppDelegate里的scene有关的方法
/*这里删除设置info.plist里的 Application Scene Manifest,否则会影响微信登录授权取消崩溃,注释掉代码,iOS 13上的多场景功能就会被屏蔽掉。不用删除sceneDelegate.swift文件。后续如果支持多场景可以把注释拿掉就好了
     
    // MARK: UISceneSession Lifecycle
     
    @available(iOS 13.0,*)
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }
     
    @available(iOS 13.0,*)
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }
    */
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容