ios基础ios新版本特性与适配

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

2017-06-06  本文已影响388人  cyh老崔

一. 微信跳转app简介

  1. 能实现什么样的跳转? 由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"
  1. 配置URL Types:

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

    配置 `LinkedME Key`.png
  1. 配置Associated Domains:
    `Associated Domains.png
  1. 配置LinkedMe 官网需要的信息: Bundle ID, Apple App Prefix, URI Scheme
  1. 集成代码:
+ (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);
        }
    }];
    
}

注:

- (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;
}

- (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;
}
//判断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等, 但是我没用过, 就不说啦.

上一篇下一篇

猜你喜欢

热点阅读