簡體   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