美文网首页
iOS URL Schemes和BundleID打开APP的正确

iOS URL Schemes和BundleID打开APP的正确

作者: 徽Se头像 | 来源:发表于2017-03-14 15:02 被阅读2263次

    URL Schemes并不仅仅只是让你跳转一下

    苹果选择沙盒来保障用户的隐私和安全,但沙盒也阻碍了应用间合理的信息共享,于是有了URL Schemes。使用过第三方支付,分享等功能的同学对于URL Schemes都不陌生,使用它我们可以很方便的跳转到第三方APP来使用它们的很多功能。
    如果想要深入了解的同学可以看一看官方文档,或者网上的大神阐述的他们眼中的URL Schemes

    1.A程序跳转B程序:

    从本APP跳转到第三方APP仅仅只需要三步:

    首先、在B程序中添加自己的URL Schemes

    URL Schemes.png

    然后在Info.plist文件中添加LSApplicationQueriesSchemes属性并设置为Array,然后再其中添加你要跳转APP的URL Schemes白名单


    Info.plist.png

    最后代码中添加一个跳转按钮,在按钮方法里添加跳转即可:

        NSURL *otherAppUrl = [NSURL URLWithString:@"ceshi://"];
        //判断当前系统是否有安装第三方app客户端
        if([[UIApplication sharedApplication] canOpenURL:otherAppUrl]){
            [[UIApplication sharedApplication] openURL:otherAppUrl];
        }else{
            //打开一个网页
            NSURL *myUrl = [NSURL URLWithString:@"https://www.baidu.com/"];
            [[UIApplication sharedApplication] openURL:myUrl];
        }
    
    

    2.AB程序互相跳转

    基于A程序跳转B程序的基础上,我们仅需在A程序中先设置好自己的URL Schemes,然后再B程序的Info.plist文件中配置A的URL Schemes白名单,然后再添加Action其中只需要修改代码中的跳转url即可。

    3.A程序跳转B程序,B程序在不知道A的URL Schemes的情况下返回A程序

    由于任务需要,公司内部APP需要相互调用,其中主程序ZH需要给其他授权,于是ZH的URL Schemes开放出来,其他APP都可以调用。
    这时问题来了,作为主程序的ZH不可能因为突然多一个APP需要授权了,ZH的Info.plist文件中又得添加一个URL Schemes的白名单。同时Info.plist文件在程序中是只读属性没有办法更改,不知道有没有黑科技,官方文档中有介绍。
    但是微信第三方登陆,都是可以在授权登陆以后,还能返回原来APP的。
    于是我们可以在其他程序跳转ZH时,将本APP的URL Schemes通过NSURL传递到ZH中,在ZH需要返回到原来APP的时候,在Action里我们通过访问网页来作为中间件访问,调用openURL即可。

        NSURL *otherAppUrl = [NSURL URLWithString:@"ceshi://"];
        //打开一个网页
        NSURL *myUrl = [NSURL URLWithString:@"https://www.baidu.com/"];
        [[UIApplication sharedApplication] openURL:myUrl];
        
    
    

    然而让人不能理解的是,在调用微信的时候,我们的APP并没有设置URL Schemes,微信居然还能返回,估计是用的BundleID打开的APP,哦,上帝,万能的Runtime!来吧,代码!
    头文件引入:#import <objc/runtime.h>

        Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
        NSObject * workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];
        BOOL isopen = [workspace performSelector:@selector(openApplicationWithBundleID:) withObject:@"bangyongli.pedometer"];
    

    相关文章

      网友评论

          本文标题:iOS URL Schemes和BundleID打开APP的正确

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