iOS 应用程序的跳转

作者: liuyanhongwl | 来源:发表于2017-08-22 16:52 被阅读55次

    一. 应用程序间通信

    例如,要在Safari应用程序中打开Google主页,我们可以编写如下代码:

    NSURL *url = [NSURL URLWithString:@"http://google.com"]; 
    [[UIApplication sharedApplication] openURL:url];
    

    这里的http://部分叫做URL方案(URL scheme),它表示想要载入的应用程序。

    还有几种用于本地iPhone应用程序的URL方案,并且可以使用类似的方式来启动它们。About Apple URL Schemes

    二. A应用打开B应用。

    原理: A应用根据URL Schemes来启动B应用。

    • B应用 注册一个自定义的URL Schemes
    • A应用 通过B注册的URL Schemes启动B
    1. B应用 注册URL Schemes

    在B应用的info.plist文件下加入 URL Types

    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>com.wlnana17.B</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>myapp</string>
            </array>
        </dict>
    </array>
    
    

    CFBundleURLName: 是URL Identifier,是自定义的URL Scheme的名字,建议采用反转域名的方法保证该名字的唯一性,比如come.yourCompany.yourApp。

    CFBundleURLSchemes: 是一个数组,可以定义多个URL Schemes。这里不需要再后面追加://,如果设置为myapp, 那么自定义的url就是myapp://。

    2. A应用 使用B注册的URL Schemes启动B
     BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"myapp://"]];
                BOOL isOpen = NO;
                if (canOpen) {
                    isOpen = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"myapp://openedapp.wlnana17.com?property1=10"]];
                }
    
    3. iOS9 URL Schemes

    在iOS9以后,如果使用 canOpenURL: 方法,该方法所涉及到的 URL scheme 必须在"Info.plist"中将它们列为白名单,否则不能使用。key叫做LSApplicationQueriesSchemes ,键值内容是

    <key>LSApplicationQueriesSchemes</key>
    <array>
     <string>urlscheme</string>
     <string>urlscheme2</string>
     <string>urlscheme3</string>
     <string>urlscheme4</string>
    </array> 
    
    

    所以在iOS9以后,我们需要在A应用的info.plist里加入如下,才能打开B应用

    <key>LSApplicationQueriesSchemes</key>
    <array>
     <string>myapp</string>
    </array> 
    
    

    苹果为什么要这么做?

    在 iOS9 之前,你可以使用 canOpenURL: 监测用户手机里到底装没装微信,装没装微博。但是也有一些别有用心的 App ,这些 App 有一张常用 App 的 URL scheme,然后他们会多次调用canOpenURL: 遍历该表,来监测用户手机都装了什么 App ,比如这个用户装了叫“大姨妈”的App,你就可以知道这个用户是女性,你就可以只推给这个用户女性用品的广告。这是侵犯用户隐私的行为。

    4. 打开B应用

    被打开的B应用会调用application:openURL:options:方法

    • 如果B应用不在后台:会走application:willFinishLaunchingWithOptions:application:didFinishLaunchingWithOptions:方法,如果这两个方法有一个返回NO,将不会走application:openURL:options:方法。

    • 如果B应用在后台,不会走application:willFinishLaunchingWithOptions:application:didFinishLaunchingWithOptions:方法,所以会调用application:openURL:options:

    三. 问题

    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0); // no equiv. notification. return NO if the application can't open for some reason
    
    

    为什么返回NO无效果?有知道的小伙伴指点一下。

    四. 应用程序之间共享数据

    这里的共享数据指的是APP跳转时,通过URL传递数据。

    五. 其他

    也可以在Safari中,键入使用定制模式的URL(myapp://),确认是否启动B应用,就可以从Safari中打开注册的B应用

    详情请看 App Programming Guide for iOS

    相关文章

      网友评论

        本文标题:iOS 应用程序的跳转

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