2020 iOS 微信分享/Universal Links

很惭愧,这个东西都出来好几年了,还没了解过。因为几年没有做过iOS微信分享了。
而现在一看,微信官方文档,是openSDK1.8.6,必须使用Universal Links,不支持之前的scheme模式了!所以要硬着头皮上啊!看文档看得我头都大!我最不理解的是里面关于配置json文件中paths所表示的意义,因为没有任何地方解释它到底是什么!!只是说是路径,我曰,我也知道是路径啊!而且还是拿它来打开我的app的路径!!但我们做app的都知道不可能直接通过路径打开某个具体页面的嘛!后来搞清楚了,这个path是个[LU俺],跟app页面没有任何直接关系!它啥也不是!后面再解释。

关于URL Schemes的理解(没兴趣可忽略这段)

曾经,iOS app之间的跳转是靠scheme就能轻松搞定,虽然到现在我也不是很明白这个,但大致还是了解的。


scheme.png

       如图,identifier我到现在也搞不明白是干什么用的,在我看来填什么都可以,最好不重复,跟别人的不一样就行。甚至可以不填,也不影响app跳转。
      关键是后面的URL Schemes字段,这个‘必须’是全网独一无二,系统就是根据这个来打开你的app的!比如这里,我写了一个anyNameofMyApp,其他app就可以通过这个URL来打开我的app,还能加参数。如果app A和B的这个URL Schemes一样,其实也没什么大不了的,如果只安装了二者之一,那么系统自然就只会打开一个;如果2个都安装了,可能就是系统‘随便’选一个来打开。
     既然一个URL Schemes就能打开我们的app了,为什么还要添加这么多URL Schemes呢(如上图)??设想一下,我不用weixin那个scheme,我只有myidmyid,当我app跳转去微信分享完成之后,微信怎么返回我的app呢?虽然我有一个Scheme为anyNameofMyApp,但是微信不知道我有这个Scheme啊!!!所以,在接入微信SDK前,我们必须去微信开放平台去注册一个app,注册后会有一个AppID,这个AppID,实际上就是微信用来打开我们的app的URL Scheme!所以我们在URL Types里面需要把AppID添加进去,identifier按照文档,我们填写weixin。现在,微信服务器知道我们的URL Sheme的值了,而我们app也有这个Scheme,所以微信可以返回我们的App了。同理,如果我们要接入QQ,或者微博,都必须事先去对应的开发平台注册app,拿到他们分配给我们的Scheme。每个平台都有自己的Scheme,这样每个平台才能通过这个唯一值来统计用户信息!!!且保证同一个平台绝对没有相同的两个Scheme。

现在,据说微信已经禁止了用这种方式去打开第三方app,也就是不允许我们在微信里面用Scheme启动一个app。既然不用,为什么还要我们继续填这个scheme呢?我猜测是不让我们用,但是微信自己还是要靠这个来统计数据。

回归正题,记录一下Universal Links怎么用。

如果是旧项目,如果你在你的项目里无法添加capabilities,请参考这里
1、首先,在苹果开发平台,找到你项目的appid,打开它,勾选Associated Domains。勾选之后,可能你本地的证书需要更新一下(不知道怎么更新就在keychain里删掉,然后在xcode重新下载)。关于证书,就只要搞这么多。
2、Xcode中,项目需要添加Associated Domains,添加一个就行了。这里需要的是一个域名,必须是https的,必须是你(公司)自己的!因为需要把一个配置文件上传到此域名根目录。别问我没域名怎么办,凉拌!

associateddomains.png

3、自己创建一个json配置文件,上传到服务器。文件名必须是apple-app-site-association,上传到上一步提供的域名的根目录,或根目录下的.well_known(注意有‘.’)。可以用vim命令创建这个文件。上传文件后,在浏览器输入下载路径查看是否能正常下载。

apple官网说明:Upload the apple-app-site-association file to your HTTPS web server. You can place the file at the root of your server or in the .well-known subdirectory.
这个文件是install app的时候,iOS系统会自动去你提供的域名相应目录下载(所以放在指定目录才找得到)。必须保证服务器处于正常运行状态。如果修改这个文件,iOS系统并不知道你更新了配置文件,但是系统会定期重新下载这个配置文件,至于隔多久更新,苹果没跟我说。所以不要想着你在后台一更新,你的app端就会生效!除非你重新删除app,再安装,有可能马上生效。

配置文件的内容,最简单的版本,如下就可以了 。

association.png

其中,appID是你的iOS账号teamid+bundleid。paths,可以写多个,但我只需要一个。这个path不是某个网页路径,也不是小程序页面路径,它只是一个单纯的字符串,如果你一定要想成有意义,你可以理解成服务器的某个子目录(作为一个app开发者,这里我也纠结了两三天,才弄清楚这是什么)。它的作用呢,就是iOS系统在你install app时,下载这个配置文件,这样系统就知道你的app可以处理哪些links(也就是Universal Links)。现在, 系统知道我提供的域名是 box.xxxx.com,并且从这个域名根目录下载了配置文件apple-app-site-association,(解析后)获得了一个(/若干个)path:/wxkd/iosrider/*,然后系统把域名和path拼接起来,得到https://box.xxxxx.com/wxkd/iosrider/*(传说中的Universal Links),这样就明确了在当前iOS系统的任何app以及浏览器(纠正一下,要在safari内部打开才能看见跳转按钮,微信内嵌浏览器也不行),通过这个link,就可以打开我们的app!!

这里解释一下,path可以是服务器上真实存在的子目录,也可以是不存在的路径!它不是给我们访问服务器用的!所以理论上你可以随便写这个path,但是不要用根目录,可以只有一级,也可以多级子目录。最好重新命名一个目录,避免出问题。关于域名最后的通配符‘*’(后面拼接更多子目录、参数都可以被我们的app处理),Universal Links规则没有硬性规定,但是微信SDK是有强制规定,必须有通配符‘*’,因为微信调起我们的app的时候,要传参数给我们,如果你没有通配符,你的app就只能接收https://box.xxxxx.com/wxkd/iosrider这个link,如果后面再增加任何子目录或参数,都会被系统当普通链接,而不会打开我们的app。

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "TEAMID.com.my.app.bundleid",
                "paths": ["/wxkd/iosrider/*"]
            }
        ]
    }
}

到这里,已经胜利在望了,后面就是根据文档按部就班写代码。
在appDelegate.h里,添加

class AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate {

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        // Override point for customization after application launch.
        
//weixin_app_id是微信开放平台注册后得到的appid。
//universal_link样式:let universal_link = "https://box.xxxxx.xxxx.xxxx.com/wxkd/iosrider/"
        ....
        WXApi.registerApp(weixin_app_id, universalLink: universal_link)
        
        ....
        }
        
        window?.makeKeyAndVisible()
        return true
    }

// 微信 如果分享结束后,你不需要在app里处理回调,抄完下面代码就可以了。如果要处理,就照官方demo写吧。
extension AppDelegate {
    func onReq(_ req: BaseReq) {
        
    }
    
    func onResp(_ resp: BaseResp) {
        
    }
    
    func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
        return WXApi.handleOpen(url, delegate: self)
    }
    
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        return WXApi.handleOpen(url, delegate: self)
    }
    
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        return WXApi.handleOpenUniversalLink(userActivity, delegate: self)
    }
}

然后在需要分享的页面,(可以分享text,图片,web,小程序等等,举例web url)

func shareWebFor(scene: Int32) -> Void {
        guard let urlStr = shareRiderRegisterUrl else {
            JKHUDManager.showError("分享失败")
            return
        }
        let webpageObject = WXWebpageObject()
        webpageObject.webpageUrl = urlStr
        let message = WXMediaMessage()
        message.title = "月入过万不是梦";
        message.description = "成为我享快递骑手,灵活接单,快速结算收入!";
        message.setThumbImage(UIImage(named: "h5_thumb")!)   //分享后展示图片,没有就显示大大的问号图片。
        message.mediaObject = webpageObject;
        let req = SendMessageToWXReq();
        req.bText = false;
        req.message = message;
        req.scene = scene;//WXSceneSession;
        WXApi.send(req) { (result) in}
    }

最后说一下,不知道为什么我的iphone5s,iOS12系统下,微信分享报错'weixinULAPI://" - error: "未能完成操作',但是不影响我正常分享,对用户无感。而且iOS14系统下却不会报错。如果不影响使用,就不管了。
关于包含通配符的链接https://box.xxxxx.com/wxkd/iosrider/*,我测试是可以匹配形如“https://box.xxxxx.com/wxkd/iosrider?name=Jack&age=18”这样的链接的,不要觉得通配符'*'内容前面必须有斜杠,其实就算没有也能匹配上。链接中斜杠是个神奇的东西...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345