JumpManager.m 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. //
  2. // JumpManager.m
  3. // tk_hybrid_demo
  4. //
  5. // Created by terry.guo on 2018/6/19.
  6. // Copyright © 2018年 Terry. All rights reserved.
  7. //
  8. #import "WebViewController.h"
  9. #import "WKWebViewController.h"
  10. #import "BaseViewController.h"
  11. #import "JumpManager.h"
  12. static NSString * const kWebviewIdentifier = @"webview";
  13. static NSString * const kWKWebviewIdentifier = @"wk";
  14. static NSString * const kUIWebviewIdentifier = @"ui";
  15. @interface JumpManager ()
  16. @property (strong, nonatomic) NSDictionary *mappings;
  17. @end
  18. @implementation JumpManager
  19. + (instancetype)sharedInstance {
  20. static dispatch_once_t onceToken;
  21. static JumpManager *instance;
  22. dispatch_once(&onceToken, ^{
  23. instance = [[self alloc] init];
  24. });
  25. return instance;
  26. }
  27. - (id)init {
  28. self = [super init];
  29. if (self) {
  30. [self setupMappings];
  31. }
  32. return self;
  33. }
  34. - (void)setupMappings {
  35. [self registerPage:@"IndexViewController" identifier:@"tk_page_index"];
  36. [self registerPage:@"FirstViewController" identifier:@"tk_page_first"];
  37. [self registerPage:@"SecondViewController" identifier:@"tk_page_second"];
  38. }
  39. #pragma mark --是否拦截
  40. + (BOOL)canAndGoOutWithLink:(NSString *)link {
  41. Class class = [[JumpManager sharedInstance]classFromLink:link];
  42. return class != nil;
  43. }
  44. #pragma mark --跳转
  45. + (BOOL)openPageWithLink:(NSString *)link {
  46. return [JumpManager openPageWithLink:link withObject:nil];
  47. }
  48. + (BOOL)openPageWithLink:(NSString *)link withObject:(id)anObject {
  49. Class class = [[JumpManager sharedInstance]classFromLink:link];
  50. if (class) {
  51. BaseViewController *viewController = [[class alloc]initWithPageLink:link withObject:anObject];
  52. return [[JumpManager sharedInstance]pushViewController:viewController];
  53. }else {
  54. return [JumpManager openH5PageWithLink:link];
  55. }
  56. }
  57. + (BOOL)openH5PageWithLink:(NSString *)link {
  58. NSDictionary *urlParams = [self convertLinkURLtoParam:link];
  59. NSString *useWhichWebView = urlParams[kWebviewIdentifier];
  60. if ([useWhichWebView isEqualToString:kWKWebviewIdentifier]) {
  61. WKWebViewController *wkWebViewController = [WKWebViewController webVCWithURLString:link];
  62. return [[JumpManager sharedInstance]pushViewController:wkWebViewController];
  63. } else {
  64. WebViewController *webViewController = [WebViewController webVCWithURLString:link];
  65. return [[JumpManager sharedInstance]pushViewController:webViewController];
  66. }
  67. }
  68. + (NSMutableDictionary *)convertLinkURLtoParam:(NSString *)linkURL {
  69. NSRange range = [linkURL rangeOfString:@"?"];
  70. if (range.location != NSNotFound) {
  71. NSString *paramStr = [linkURL substringFromIndex:range.location+1];
  72. NSArray *arrParam = [paramStr componentsSeparatedByString:@"&"];
  73. NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
  74. for (NSString *subParam in arrParam) {
  75. NSArray *arrsub = [subParam componentsSeparatedByString:@"="];
  76. NSString *value = [[arrsub objectAtIndex:1] stringByRemovingPercentEncoding];
  77. [dic setObject:value forKey:[arrsub objectAtIndex:0]];
  78. }
  79. return dic;
  80. }
  81. return nil;
  82. }
  83. #pragma mark --私有
  84. - (Class)classFromLink:(NSString *)aLink {
  85. __block BOOL match;
  86. __block NSString *key = nil;
  87. [[self.mappings allKeys]enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  88. match = [aLink rangeOfString:obj].location != NSNotFound;
  89. if (match) {
  90. key = obj;
  91. *stop = YES;
  92. }
  93. }];
  94. if (key) return NSClassFromString(self.mappings[key]);
  95. return nil;
  96. }
  97. - (void)registerPage:(NSString *)pageName
  98. identifier:(NSString *)identifier {
  99. NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:self.mappings];
  100. if (pageName.length > 0 && identifier.length > 0)
  101. [dict setObject:pageName forKey:identifier];
  102. self.mappings = [NSDictionary dictionaryWithDictionary:dict];
  103. }
  104. - (BOOL)pushViewController:(UIViewController *)vc {
  105. if (vc == nil) {
  106. return NO;
  107. }
  108. UIApplication *app = [UIApplication sharedApplication];
  109. UIViewController *rootVC = [app valueForKeyPath:@"delegate.window.rootViewController"];
  110. if ([rootVC isKindOfClass:[UITabBarController class]]) {
  111. UIViewController *nVC = [(UITabBarController *)rootVC selectedViewController];
  112. if ([nVC isKindOfClass:[UINavigationController class]]) {
  113. vc.hidesBottomBarWhenPushed = YES;
  114. [(UINavigationController *)nVC pushViewController:vc animated:YES];
  115. return YES;
  116. }
  117. } else if ([rootVC isKindOfClass:[UINavigationController class]]) {
  118. [(UINavigationController *)rootVC pushViewController:vc animated:YES];
  119. return YES;
  120. }else {
  121. if ([rootVC respondsToSelector:@selector(selectedViewController)]) {
  122. UIViewController *nVC = [(UITabBarController *)rootVC selectedViewController];
  123. if ([nVC isKindOfClass:[UINavigationController class]]) {
  124. vc.hidesBottomBarWhenPushed = YES;
  125. [(UINavigationController *)nVC pushViewController:vc animated:YES];
  126. return YES;
  127. }
  128. }
  129. }
  130. return NO;
  131. }
  132. @end