zoukankan      html  css  js  c++  java
  • iOS开发-应用之间的跳转及通信

    Update

    2016-08-12: 在Github的Demo上增加Mac自定义Url Scheme,可以在Safari上输入特定协议头打开应用,并传递参数)

    简介

    我们接下来将要实现应用程序之间的跳转及通讯。现在手机开发中,很多时候我们都需要在应用内跳转到别的应用中,这个是很常见的。

    为此,我们首先需要准备两个项目ApplicationOneApplicationTwo。(下载项目源码)

    应用间的简单跳转

    ApplicationOne应用跳转到ApplicationTwo应用

    我们需要先创建在ApplicationTwo项目里设置URL Types协议,这里我设置为GC,如下所示

    ApplicationOne应用添加事件

    @IBAction func openApplication() {
    	// 1
        let urlSting = "GC://"
        // 2
        if let url = NSURL(string: urlSting) {
    	    // 3
            let application = UIApplication.sharedApplication()
            // 4
            if application.canOpenURL(url) {
            // 5
                application.openURL(url)
            }
        }
    }
    
    • 1: 创建urlString字符串
    • 2: 利用urlString字符串创建真正的url,并检测url是否有用
    • 3: 获得UIApplication实例
    • 4: 检测是否能够打开此url
    • 5: 打开url,在这里即为我们的应用跳转

    需要注意的是,协议开头必须要是完整的,即为****://

    应用间的传值跳转

    实现方式很简单,我们只需要在url协议里补充参数就可以了,比如我现在传一个字符串GarveyCalvin

    现在事件的代码是这样的

    @IBAction func openApplication() {
        let urlSting = "GC://GarveyCalvin"
        if let url = NSURL(string: urlSting) {
            let application = UIApplication.sharedApplication()
            if application.canOpenURL(url) {
                application.openURL(url)
            }
        }
    }
    

    你可以在协议后补充n个参数,只需要双方都能解析得到就行,具体的协议规则自行商议

    然后在ApplicationTwo应用的AppDelegate文件,我们需要实现如下方法去接收其它应用传进来的参数

    func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
    let newUrlHost: NSString = url.absoluteString ?? ""
    let range = newUrlHost.rangeOfString("//")
        
    if range.length != NSNotFound {
        let params = newUrlHost.substringFromIndex(range.length)
        UIAlertView(title: "params is (params)", message: nil, delegate: nil, cancelButtonTitle: "Confirm").show()
    } else {
        UIAlertView(title: "haven't params", message: nil, delegate: nil, cancelButtonTitle: "Confirm").show()
    }
        
    return false
    }
    

    应用间的反向跳转

    我们要实现的是,从ApplicationOne跳转到ApplicationTwo应用,再从ApplicationTwo跳转回ApplicationOne应用里。

    具体的实现步骤如下:

    • 我们需要在ApplicationOne项目中添加URL Types协议,具体看文章的上方,我们刚刚才做过。
    • 为了实现应用间的反转跳转,我们必须让ApplicationTwo应用知道是从哪里跳转的,因此我们可以在ApplicationOne url跳转事件把自身的URL Types协议传递给ApplicationTwo应用。像这样GC://GarveyCalvin&GCFirst
    • 这样我们就能在ApplicationTwo应用的application(_:openURL: sourceApplication:annotation:)方法中获取到ApplicationOne的协议,我们保存它,等到需要反向跳转的时候就可以使用它来进行跳转了。

    适配iOS9

    有一位git友提醒了我,在iOS9下运行报以下错误(issue):

    -canOpenURL: failed for URL: "GC://GarveyCalvin&GCFirst" - error: "This app is not allowed to query for scheme GC"
    

    这是因为在iOS9中,苹果做了严格的限制,我们想要调起这个url,必须要手动添加白名单,这样苹果才会"放行"。我们需要在info.plist里添加

    <key>LSApplicationQueriesSchemes</key>
    <array>
    	<string>GC</string>
    </array>
    

    LSApplicationQueriesSchemes是一个数组,用于存放url白名单

    Download

    你们可以通过这个Git的链接去下载本文章所使用的完整项目源码。(ApplicationJumpAndSentValue).

    参考文章


    iOS开发拓展篇—应用之间的跳转和数据传递

    iOS应用程序开发之应用间的跳转

    在Mac和iOS中注册自定义的URL Scheme



    博文作者:GarveyCalvin

    博文出处:http://www.cnblogs.com/GarveyCalvin/

    本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!

  • 相关阅读:
    How do you Design a Circular FIFO Buffer (Queue) in C?

    搞懂分布式技术5:Zookeeper的配置与集群管理实战
    Spring boot 启动提示数据源错误
    IntelliJ IDEA 如何配置数据源
    Windows 10 中你可能用得最多的快捷键
    JUnit 5 测试问题 throws java.lang.Exception’ must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS)
    Intellij IDEA 如何自动生成 serialVersionUID
    Docsify 初始化文件夹
    Docsify 安装
  • 原文地址:https://www.cnblogs.com/GarveyCalvin/p/4877115.html
Copyright © 2011-2022 走看看