iOS开发 --- UIWebView替换之友盟分享SDK更新(微信未验证应用问题)

背景

ShareSDK v7.0.3 (更新日期:2020年6月16日)

最近每次更新版本时都会收到一封邮件,连续收到几次后,就决定要把这件事(UIWebView替换成WKWebView)提上日程了。简单的展示页面中UIWebView替换完成后,下一项工作就是SDK更新了。

1,AFNetworking更新(目前用的好像还是3.0,哈哈。。);

2,友盟SDK更新,包括统计SDK,ShareSDK。

本片博客主要记录下在更新ShareSDK中遇到的问题,及一些需要注意的地方。

iOS开发 --- UIWebView替换之友盟分享SDK更新(微信未验证应用问题)_第1张图片

一,下载SDK

1,社会化分享 SDK

2,U-Share集成文档

文档中有几个关键点:

[1],其实v6.9.7版本的SDK中关于UIWebView替换成WKWebView的问题已经更新了。

iOS开发 --- UIWebView替换之友盟分享SDK更新(微信未验证应用问题)_第2张图片

 

[2],这个就是我这是更新中遇到的主要的问题,我想应该也有不少小伙伴也遇到了吧!!!!在下面会详细写下。

iOS开发 --- UIWebView替换之友盟分享SDK更新(微信未验证应用问题)_第3张图片

二,微信官方文档 

微信官方文档(关于openSDK1.8.6的更新说明)

iOS常见问题

 apple-app-site-association 验证是否正确

[1], 要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的 id。(如下图所示,在 AppDelegate 的 didFinishLaunchingWithOptions 函数中向微信注册 id)。

/**
#import "WXApi.h"
*/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //向微信注册
    [WXApi registerApp:APP_ID universalLink:UNIVERSAL_LINK];
    return YES;
}

 

[2] ,使用SDK 自检函数排查接入问题

SDK1.8.7版本,WXApi新增了自检函数checkUniversalLinkReady:,帮助开发者排查SDK接入过程中遇到的问题。

注意事项:

调用自检函数之前必须要先调用registerApp:universalLink接口, 并确认调用成功。自检过程中会有Log产生,可以先调用startLogByLevel函数,根据Log排查问题,会多次回调block。仅用于新接入SDK时调试使用,请勿在正式环境中调用
示例代码:

//在register之前打开log, 后续可以根据log排查问题
[WXApi startLogByLevel:WXLogLevelDetail logBlock:^(NSString *log) {
    NSLog(@"WeChatSDK: %@", log);
}];

//务必在调用自检函数前注册
[WXApi registerApp:APP_ID universalLink:UNIVERSAL_LINK];

//调用自检函数
[WXApi checkUniversalLinkReady:^(WXULCheckStep step, WXCheckULStepResult* result) {
    NSLog(@"%@, %u, %@, %@", @(step), result.success, result.errorInfo, result.suggestion);
}];

WXULCheckStep值说明:

step = WXULCheckStepParams: 参数检查
step = WXULCheckStepSystemVersion: 当前系统版本检查
step = WXULCheckStepWechatVersion: 微信客户端版本检查
step = WXULCheckStepSDKInnerOperation: 微信SDK内部操作检查
step = WXULCheckStepLaunchWechat: App拉起微信检查
step = WXULCheckStepBackToCurrentApp: 由微信返回当前App检查
step = WXULCheckStepFinal: 最终检查
会依次回调这7个step,当回调了WXULCheckStepFinal,说明检测通过,SDK接入成功。 任一step回调的result.success为NO, 流程终止,后续不再回调,可以根据result.errorInfo的查看当前步骤错误的原因,根据result.suggestion修复问题.

三,配置 Universal Link

因为微信开放平台的要求, 所以必须配置 Universal Link, 否则 iOS13 无法使用微信分享、支付功能。

公司域名:www.ABCD.com

项目中配置Associated Domains:applinks:www.ABCD.com

apple-app-site-association文件中将paths配置为:"paths": [ "/app/*"],注意后面要加*(星号通配符)

微信开放平台中配置Universal Links:https://www.ABCD.com/app/

项目中注册微信时 : https://www.ABCD.com/app/

1,在项目中开启Associated Domains 域

applinks:后面是你的域名,例如 applinks:help.wechat.com

2,制作apple-app-site-association 文件

创建一个json格式的命名为apple-app-site-association文件,注意这个文件必须没有后缀名,文件名必须为apple-app-site-association。

我们都知道,每个开发者账号的Team ID是唯一的,每个App的Bundle ID是唯一的,那么问题来了:同一份apple-app-site-association文件需要同时适配多个App该如何处理?

解决办法就是在区分appID的同时,还需要注意必须配置不同的paths,否则当设备同时安装多个应用会出现分享完成后跳转异常,原因是当分享完成后跳转回来的时候是通过paths来决定应该返回哪个App的。

如果两个appID中配置的paths完全相同就会出现:
应用A→发起分享→跳转到微信内→选择好友/朋友圈发送→跳转回应用B
而理想情况应该是:
应用A→发起分享→跳转到微信内→选择好友/朋友圈发送→跳转回应用A

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "TeamID.BundleID1",
                "paths": [ "/wx_conn/app1/*", "/qq_conn/10000001/*"]
            },
            {
                "appID": "TeamID.BundleI2",
                "paths": [ "/wx_conn/app2/*", "/qq_conn/10000002/*"]
            }
        ]
    }
}
{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "HQH47S9JSQ.help.wechat.com",
                "paths": [ "/app/*" ]
            }
        ]
    }
}

details:是个数组, 可以配置多个app;

appID:你的Team ID+BundleID,中间用.隔开;

paths:域名后拼接的路径, 不能带query参数, 微信使用Universal Links拉起第三方App时,会在Universal Links末尾拼接路径和参数,因此App配置的paths必须加上通配符/*, 按照微信配置的例子, Universal Links就是https://help.wechat.com/app

3,上传apple-app-site-association 文件

把你刚才制作好的apple-app-site-association文件交给服务器端的小伙伴,放到服务器的根目录下或者放到.well-known文件夹下。苹果会优先去.well-known文件夹下找, 如果没有就去跟目录下载。

还有一种说法是,iOS9.3之前是根目录下即:https://www.ABCD.com/apple-app-site-association,iOS9.3之后是.well-known目录下即:https://www.ABCD.com/.well-known/apple-app-site-association

文件路径,二选一(不带任何后缀):

https://help.wechat.com/apple-app-site-association

https://help.wechat.com/.well-known/apple-app-site-association

4,检测apple-app-site-association文件是否上传成功

App Search API Validation Tool

iOS开发 --- UIWebView替换之友盟分享SDK更新(微信未验证应用问题)_第4张图片

5,验证Universal Links

1>Safari浏览器验证

    在浏览器中输入https://www.ABCD.com/app/,例如输入https://help.wechat.com/app, 打开网站后一定要下拉,会有类似这样的弹窗, 点击打开会直接跳转APP。

iOS开发 --- UIWebView替换之友盟分享SDK更新(微信未验证应用问题)_第5张图片

2>备忘录验证

打开备忘录输入https://www.ABCD.com/app/,例如输入https://help.wechat.com/app,点击会直接跳转自己的app, 或者长按会弹窗 在"app"中打开。

6,微信开放平台配置Universal Links

      微信要求填写格式是https开头,"/"结尾, 所以填写https://help.wechat.com/app/

iOS开发 --- UIWebView替换之友盟分享SDK更新(微信未验证应用问题)_第6张图片

7,AppDelegate配置

1>,在Xcode中,在 “info”标签栏的“LSApplicationQueriesSchemes“添加weixin 和weixinULAPI(如下图所示)。

 

 2>,注册及自检函数

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    #ifdef DEBUG
    /*在register之前打开log, 后续可以根据log排查问题*/
    [WXApi startLogByLevel:WXLogLevelDetail logBlock:^(NSString *log) {
        NSLog(@"WeChatSDK: %@", log);
    }];
    #endif

    // 向微信注册
    [WXApi registerApp:kWXAppID universalLink:kUniversalLinks];
    
    #ifdef DEBUG
    /*调用自检函数(支付或者分享成功之后要删除这个方法,不然会导致会每次打开app都会与微信进行关联)*/
    [WXApi checkUniversalLinkReady:^(WXULCheckStep step, WXCheckULStepResult* result) {
         NSLog(@"---------%@, %u, %@, %@", @(step), result.success, result.errorInfo, result.suggestion);
    }];
    #endif
}

/*
打印如下:说明是OK的!!
app[14232:3095208] ---------0, 1, check passed,
app[14232:3095208] ---------1, 1, check passed,
app[14232:3095208] ---------2, 1, check passed,
app[14232:3095208] ---------3, 1, check passed, 
app[14232:3095208] ---------4, 1, check passed,
app[14232:3095208] ---------5, 1, Universal Link check passed. The application is launched by WeChat via Universal Link,
app[14232:3095208] ---------6, 1, All Check Passed!,
*/

3>,回调测试 :

当APP被UniversalLink调起后,可以在delegate中使用如下方法进行对应处理,获取相关paths信息等(这里使用了微信的处理方式)。

// 通用链接会调用
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray> * __nullable restorableObjects))restorationHandler {
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        NSURL *webpageURL = userActivity.webpageURL;
        if ([webpageURL.absoluteString isEqualToString:kUniversalLinks]) {
            // 如果UniversalLinks跳转 会到这里
            NSLog(@"%@",webpageURL);
        } else {
            [[UIApplication sharedApplication]openURL:webpageURL];
        }
    }
    return [WXApi handleOpenUniversalLink:userActivity delegate:self];
}

4>,如果调用的是友盟分享,切记要配置 

-(void)confitUShareSettings{
    //配置微信平台的Universal Links
    //微信和QQ完整版会校验合法的universalLink,不设置会在初始化平台失败
    [UMSocialGlobal shareInstance].universalLinkDic = @{@(UMSocialPlatformType_WechatSession):TCUMUnivernalLink};
}

注意点

  1. 如果什么都配置正确了,还是调不起app, 就把app删除了重新安装一下。
  2. 如果所有都配置完成了, 微信分享登录都可以,但是还会出现"未验证应用", 是因为未验证应用名单非实时更新,只有前一天有接入新SDK(1.8.6版本以上)并且有正确调用记录,第二天才会移除出名单, 并且前一天正确分享次数在10次以上。
  3. 添加测试函数checkUniversalLinkReady后,每次启动都会跳转微信,然后再跳回app,注释掉就不会再跳微信了。

相关文章

(SDK) - 更新微信开放平台 openSDK1.8.6

iOS 微信openSDK使用Universal Links填坑

Universal Link--apple-app-site-association文件问题

IOS 配置Universal Links

你可能感兴趣的:(iOS,第三方库/工具)