美文网首页ios基础ios新版本特性与适配
iOS Universal Link 结合第三方实现微信唤起ap

iOS Universal Link 结合第三方实现微信唤起ap

作者: cyh老崔 | 来源:发表于2017-06-06 16:02 被阅读388次

    一. 微信跳转app简介

    1. 能实现什么样的跳转? 由webView唤起app.
    • webView如果用safari打开, 将唤起app, 这是原生的功能
    • webView的按钮可以唤起app, 这是第三方的功能
    1. 为什么不能使用URL Scheme 实现app? 因为微信禁止.

    一. Universal Link 基本使用

    可参见这篇文章 <a href="http://www.jianshu.com/p/96649a73795b">iOS Universal Link(通用链接)</a>

    三. 第三方网站: LinkedMe

    此处我们利用第三方网站来实现

    1. linkedMe官网
    2. 技术支持QQ群: <em>209222314</em>

    四. 集成步骤

    1. 自己注册得到LinkedME Key
    2. 此处我使用cocopods集成, 在Podfile中添加:
    pod 'LinkedME-iOS-Deep-Linking-SDK_Pod_IDFA',:git=>"https://github.com/WFC-LinkedME/LinkedME-iOS-Deep-Linking-Demo.git"
    
    • 注: 文档中的pod地址不对, 上述地址是我询问 技术支持 得到.
    1. 配置URL Types:

      配置`URL Types`
    2. 配置 LinkedME Keyinfo.plist :

      配置 `LinkedME Key`.png
    • LinkedME Key 来自:
      `LinkedME Key`.png
    1. 配置Associated Domains:
      `Associated Domains.png
    • 注: 此处我配置了4值:
    • 1与2 是我们的后台正式与测试url
    • 3与4 是LinkedMe 要求的配置
    1. 配置LinkedMe 官网需要的信息: Bundle ID, Apple App Prefix, URI Scheme
    • 6.1 相关配置界面进入路径:


      路径.png
    • 6.2 6.2 配置上述三个值: Bundle ID, Apple App Prefix, URI Scheme

      Bundle ID`, `Apple App Prefix`, `URI Scheme`.png
    1. 集成代码:
    • 注: 需要JS端集成相关JS SDK, 几分钟即可集成完毕.

    • 7.1 在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 集成:

    + (void)yh_setupDeepLinkWithLaunchOptions:(NSDictionary *)launchOptions{
        ///deep link, 第三方linkedMe
        
        //初始化及实例
        LinkedME *linkedme = [LinkedME getInstance];
        
        //获取跳转参数
        [linkedme initSessionWithLaunchOptions:launchOptions automaticallyDisplayDeepLinkController:NO deepLinkHandler:^(NSDictionary* params, NSError* error) {
            if (!error) {
                //防止传递参数出错取不到数据,导致App崩溃这里一定要用try catch
                @try {
                    
                    YHLinkedMeM *linkedMeM = [YHLinkedMeM mj_objectWithKeyValues:params];
                    
                    if (linkedMeM.$control.link.length >0) {
                    //if (title.length >0 && tag.length >0) {
                        //如果app需要登录或者注册后,才能打开详情页,这里可以先把值存起来,登录/注册完成后,再使用
                        
                        //自定义跳转, 下面是我自己的方法, 不是linkedMe的
                        [self yh_jumpTriggeredByDeepLinkWithLink:linkedMeM.$control.link];
                        
                    }
                } @catch (NSException *exception) {
                    
                } @finally {
                }
            } else {
                YHLog(@"LinkedME failed init: %@", error);
            }
        }];
        
    }
    

    注:

    • 1 )上面是我封装的一个方法.
      1. Deep Link唤起app, 无论此时app在后台还是前台, 都会调用这个回调, 所有相关逻辑要在这个回调中处理:
        处理回调.png
    • 7.2 必须实现的3个方法
    • 7.2.1 方法一
    - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
        
        if ([[userActivity.webpageURL description] rangeOfString:@"lkme.cc"].location != NSNotFound) {
            return  [[LinkedME getInstance] continueUserActivity:userActivity];
            
        }else if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { //safari 跳转处理
            
            NSURL *webpageURL = userActivity.webpageURL;
            
            NSString *urlString = webpageURL.absoluteString;
            
            NSString *host = webpageURL.host;
            if ([host isEqualToString:@"app.cuiyuhe.com"] ||
                [host isEqualToString:@"apptest.cuiyuhe.com"]) {
                //进行我们需要的处理
                [YHDeepLinkTool yh_jumpTriggeredByDeepLinkWithLink:urlString];
            }
            
        }
        
        return YES;
    }
    
    
    • 7.2.2 方法二
    - (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation{
        //判断是否是通过LinkedME的UrlScheme唤起App
        if ([[url description] rangeOfString:@"click_id"].location != NSNotFound) {
            return [[LinkedME getInstance] handleDeepLink:url];
        }
       
        return YES;
    }
    
    • 7.2.3 方法三
    //判断url 打开链接
    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
       
        // 跳转自己控制器, scheme跳转
        NSString *kJumpPrefixStr = @"cuiyuhe://";
        if ([url.absoluteString hasPrefix:kJumpPrefixStr]) {
           
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                NSString *urlStr = url.absoluteString;
                
                NSString *subString = [urlStr substringFromIndex:kJumpPrefixStr.length];
                NSString *ecodeStr=[self URLDecodedString:subString];
                FMDetailsView *detailsView = [[FMDetailsView alloc]init];
                detailsView.hidesBottomBarWhenPushed = YES;
                detailsView.linkUrl = ecodeStr;
                [[FMTabBarViewController sharedManager].selectedViewController pushViewController:detailsView animated:YES];
               
               
            });
            return YES;
        }
       
       
        /********* linkedMe --------- begin ********/
        //判断是否是通过LinkedME的UrlScheme唤起App
        if ([[url description] rangeOfString:@"click_id"].location != NSNotFound) {
            return [[LinkedME getInstance] handleDeepLink:url];
        }
       
        /********* linkedMe --------- end *********/
       
        return YES;
    }
    

    四. 声明

    我也只是linkedMe的一个用户, 且认为解决了我的需求, 没有任何推销之意 :)
    类似的平台还有魔窗mLink等, 但是我没用过, 就不说啦.

    相关文章

      网友评论

        本文标题:iOS Universal Link 结合第三方实现微信唤起ap

        本文链接:https://www.haomeiwen.com/subject/knngfxtx.html