美文网首页
应用间通信总结

应用间通信总结

作者: WHZ闹哪样 | 来源:发表于2016-08-04 16:51 被阅读44次

一.准备工作

1.设置APP Schemes值, schemes作为app的url 格式为schemes://
2.相互添加白名单, 白名单为设置的schemes值
<key>LSApplicationQueriesSchemes</key>
<array>
<string> your schemes </string>
</array>

发送方:
BOOL judge = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"schemes://"]];
if (judge) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"schemes://success=1&count=100"]];
} else {
NSLog(@"未安装应用");
}

接收方

XXXXXXXX----(错误,9.0以后废弃的方法)接收方:

  • (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return YES;
    }

正确的接收方法(先添加通知再发送通知,在接受过程中可能会存在衔接受到了,但是控制器还没有创建的问题):
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{
NSString *receText = [[url host] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@ %@",receText, url.absoluteString);
NSArray *arr = [receText componentsSeparatedByString:@"="];
NSString *str = [arr firstObject];
if ([str isEqualToString:@"AM_goodsID"]) {
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:[arr lastObject] forKey:@"goodId"];
// 延迟1秒执行先添加通知再发送
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[[NSNotificationCenter defaultCenter] postNotificationName:@"APPMASTERTOPRODETAIL" object:nil userInfo:dic];
});
}
return YES;
}

虽然跳转成功了,但是还会有一系列的问题,例如tabbar隐藏,navigationbar是否隐藏,颜色变化. 当进入到另一个app时,需要获取当前显示的控制器,下面是获取当前屏幕显示的viewcontroller的方法(网上普遍流传另一种方法,但是不能获取tabbar的控制器)

  • (UIViewController *)getCurrentVC{
    UIViewController *result = nil;
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    //app默认windowLevel是UIWindowLevelNormal,如果不是,找到UIWindowLevelNormal的
    if (window.windowLevel != UIWindowLevelNormal)
    {
    NSArray *windows = [[UIApplication sharedApplication] windows];
    for(UIWindow * tmpWin in windows)
    {
    if (tmpWin.windowLevel == UIWindowLevelNormal)
    {
    window = tmpWin;
    break;
    }
    }
    }
    id nextResponder = nil;
    UIViewController *appRootVC=window.rootViewController;
    // 如果是present上来的appRootVC.presentedViewController 不为nil
    if (appRootVC.presentedViewController) {
    nextResponder = appRootVC.presentedViewController;
    }else{
    UIView *frontView = [[window subviews] objectAtIndex:0];
    nextResponder = [frontView nextResponder];
    }
    if ([nextResponder isKindOfClass:[UITabBarController class]]){
    UITabBarController * tabbar = (UITabBarController *)nextResponder;
    UINavigationController * nav = (UINavigationController *)tabbar.viewControllers[tabbar.selectedIndex];
    // UINavigationController * nav = tabbar.selectedViewController ; 上下两种写法都行
    result=nav.childViewControllers.lastObject;
    }else if ([nextResponder isKindOfClass:[UINavigationController class]]){
    UIViewController * nav = (UIViewController *)nextResponder;
    result = nav.childViewControllers.lastObject;
    }else{
    result = nextResponder;
    }
    return result;
    }

调用过程中会出现tabbar隐藏与否的问题,可以通过判断是否为根视图来设置
UIViewController *controller = [self getCurrentVC];
controller.hidesBottomBarWhenPushed = YES;
[controller.navigationController pushViewController:detail animated:YES];
for (UINavigationController *contr in self.viewControllers) {
if (contr.childViewControllers.firstObject == controller) {
controller.hidesBottomBarWhenPushed = NO;
}

应用间通信的所有的坑都在这儿了

相关文章

  • 应用间通信总结

    一.准备工作 1.设置APP Schemes值, schemes作为app的url 格式为schemes:...

  • Android--IPC

    Binder IPC (Inter-Process Communication) 进程间通信,支持应用间通信、应用...

  • iOS应用间通信:URL Schemes

    iOS应用间通信:URL Schemes 抛开越狱不谈,URL Schemes几乎是iOS应用间通信(Inter-...

  • Vue中组件之间的通信方式?

    vue是组件化开发框架,所以对于Vue应用来说组件间的数据通信非常重要。 通信方式总结: props $emit/...

  • iOS应用间通信

    上一篇文章中我们已经详细的介绍了通知扩展怎么使用,无奈我们产品的设计又有了其他 奇(辣) 思(鸡) 妙(到) 想(...

  • 应用间跳转、通信

    应用间跳转 •app应用的跳转的原理 •如何实现两个app应用之间的跳转 •如何实现两个app之间跳转到指定的页面...

  • iOS应用间通信

    注意:需要为即将调用的app设置白名单,在info.plist中,添加如下设置: LSApplicati...

  • intent

    协助应用间的交互和通信

  • 8、BroadcastReceiver 与 LocalBroad

    BroadcastReceiver是针对应用间、应用与系统间、应用内部进行通信的一种方式LocalBroadcas...

  • 进程间通信总结

    转载请以链接形式标明出处:本文出自:103style的博客 《Android开发艺术探索》 学习记录 目录 进程间...

网友评论

      本文标题:应用间通信总结

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