繁体   English   中英

如何处理从另一个应用程序共享到我自己的 iOS 应用程序的文件?

[英]How to handle a file shared from another app to my own iOS app?

我按照上一个问题( Swift、Xcode、iOS - How to handle a file sent with 'Open in...' from another app to my own app )将功能集成到我的应用程序Open in... 例如,我想使用“ Files应用程序来选择一个文档文件(例如 PDF)并在我自己的应用程序中打开。

但是,不会调用AppDelegate中的以下代码。 我想知道这是不是因为 Swift 的版本不同? Apple 更改了源代码以针对iOS 15或更早版本执行此操作? 如果我能听到如何在Swift 5iOS 15实现这一点,我将不胜感激。

func application(_ app: UIApplication,
                     open url: URL,
                          options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool{
    do {
        let data = try Data(contentsOf: url)
        // Do something with the file
        print ("File was shared!")
        print (data)
       
        
    } catch {
        print("Unable to load data: \(error)")
    }

    return true
}

我已经按照其他应用程序可以尝试共享文件的方式设置了该应用程序。 尝试在我的应用程序中打开时,我的应用程序打开了,但上面的代码似乎没有被调用。

你正在寻找的是 URL Schemes。 只有当您拥有该应用程序的注册网址方案时,您才能从当前打开的应用程序打开另一个应用程序。 如果该应用没有提供打开它的 URL 方案,你就不能。

检查以下示例:

  1. https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app

  2. https://medium.com/@MdNiks/custom-url-scheme-deep-link-fa3e701a6295

  3. https://www.appcoda.com/working-url-schemes-ios/

并且,不可能启动任意应用程序,而是启动注册了 URL Schemes 的本机应用程序。

看起来您只是部分地遵循了上一个问题的方法。 在这种情况下,此人已成功实现了自定义 URL 方案解决方案的 3 部分中的 2 部分,因此答案仅提供了第三部分。

正如https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app所说:

要支持自定义 URL 方案:

  1. 定义应用程序 URL 的格式。
  2. 注册您的方案,以便系统将适当的 URL 定向到您的应用程序。
  3. 处理您的应用收到的 URL。

他们的问题是:

我的应用程序显示在我可以将文件发送到的可用应用程序中。 我的问题是之后会发生什么? 当我选择将它发送到我的应用程序时,它会切换到我的应用程序,然后从那里切换到我的应用程序,我不知道如何接收文件并读取它以提取其内容。

所以他们已经完成了第 1 步和第 2 步(因此,他们的应用程序正在可用的应用程序中正确显示,等等)。

就您而言,听起来您还没有完成第 1 步和第 2 步?

另一种可能性是(也来自https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app )如果您使用的是场景,请注意还有其他入口点到您的应用程序。

如果您的应用已选择加入场景,并且您的应用未运行,则系统会在启动后将URL 传递到场景 ( :willConnectTo:options:) 委托方法,并在您的应用打开 URL 时传递到场景 ( :openURLContexts:)在内存中运行或暂停。

就像是

func scene(_ scene: UIScene, 
       willConnectTo session: UISceneSession, 
       options connectionOptions: UIScene.ConnectionOptions) {

// Determine who sent the URL.
if let urlContext = connectionOptions.urlContexts.first {

    let sendingAppID = urlContext.options.sourceApplication
    let url = urlContext.url
    print("source application = \(sendingAppID ?? "Unknown")")
    print("url = \(url)")

    // Process the URL similarly to the UIApplicationDelegate example.
}

/*
 *
 */
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM