NSString 中提取url 并打开



NSString * const KILabelLinkTypeKey = @"linkType";

NSString * const KILabelRangeKey = @"range";

NSString * const KILabelLinkKey = @"link";


typedef NS_ENUM(NSUInteger, KILinkType)

{

    KILinkTypeUserHandle,

    KILinkTypeHashtag,

    KILinkTypeURL,

}



- (NSArray *)getRangesForURLs:(NSAttributedString *)text

{

    NSMutableArray *rangesForURLs = [[NSMutableArray alloc] init];;

    

    // Use a data detector to find urls in the text

    NSError *error = nil;

    NSDataDetector *detector = [[NSDataDetector alloc] initWithTypes:NSTextCheckingTypeLink error:&error];

    

    NSString *plainText = text.string;

    

    NSArray *matches = [detector matchesInString:plainText

                                         options:0

                                           range:NSMakeRange(0, text.length)];

    

    // Add a range entry for every url we found

    for (NSTextCheckingResult *match in matches)

    {

        NSRange matchRange = [match range];

        

        // If there's a link embedded in the attributes, use that instead of the raw text

        NSString *realURL = [text attribute:NSLinkAttributeName atIndex:matchRange.location effectiveRange:nil];

        if (realURL == nil)

            realURL = [plainText substringWithRange:matchRange];

 

            if ([match resultType] == NSTextCheckingTypeLink)

            {

                [rangesForURLs addObject:@{KILabelLinkTypeKey : @(KILinkTypeURL),

                                           KILabelRangeKey : [NSValue valueWithRange:matchRange],

                                           KILabelLinkKey : realURL,

                                           }];

            }

        }

    

    return rangesForURLs;

}



#pragma mark - Interactions


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

  [super touchesBegan:touches withEvent:event];

}


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

    [super touchesMoved:touches withEvent:event];

}


- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

    [super touchesEnded:touches withEvent:event];

    

    if (self.linkRanges.count > 0) {

       NSDictionary * tmpdic = self.linkRanges[0];

       NSString * url = tmpdic[@"link"];

        LOGD(@"***********************  url : %@",url);

        if (url.length > 0) {

            [self attemptOpenURL:[NSURL URLWithString:url]];

        }

    }

}


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

{

    [super touchesCancelled:touches withEvent:event];

    

}



- (void)attemptOpenURL:(NSURL *)url

{

    BOOL safariCompatible = [url.scheme isEqualToString:@"http"] || [url.scheme isEqualToString:@"https"];

    

    if (safariCompatible && [[UIApplication sharedApplication] canOpenURL:url])

    {

        [[UIApplication sharedApplication] openURL:url];

    }

    else

    {

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Problem"

                                                        message:@"The selected link cannot be opened."

                                                       delegate:nil

                                              cancelButtonTitle:@"Dismiss"

                                              otherButtonTitles:nil];

        [alert show];

    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值