質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iPad

iPadは、Appleがデザインしたタブレット型コンピュータです。iPadアプリケーションは通常Xcode IDEのObjective-Cで書かれますが、iPadアプリケーションを組むためのほかのツールを使うことも可能です。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

707閲覧

iOSで他のアプリから「共有」されたファイルのURLを自分の自作アプリで取得する方法

sekiseki_2

総合スコア2

iPad

iPadは、Appleがデザインしたタブレット型コンピュータです。iPadアプリケーションは通常Xcode IDEのObjective-Cで書かれますが、iPadアプリケーションを組むためのほかのツールを使うことも可能です。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/09/18 18:58

編集2021/11/11 12:22

前提・実現したいこと

SwiftでプログラミングをしてiOS用のPDFを読み込むアプリケーションを作っております。
他のアプリ(例えばSafariFiles)などから、PDFのファイルを自分の作っているアプリで開きたいのです。

発生している問題・エラーメッセージ

プログラムの内部に保存したPDFファイルからPDFを表示する方法はなんとかTutorialやウェブでの情報を元に探すことができました。

そして、PDFのファイルを他のアプリケーションで開いた際に「共有」を押すと、自作のアプリが表示されるようにも設定することができました。

しかし、二つの動作をつなげることができず、外部のアプリから「共有」にて送られたPDFファイルを開く方法が分からず困っています。

該当のソースコード

以下のソースコードを作成しました。

ViewController

1import UIKit 2import PDFKit 3 4class ViewController: UIViewController { 5 6 @IBOutlet weak var pdfView: PDFView! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // PDFの表示 11 if appDelegate.pdfUrl != nil{ 12 if let url = appDelegate.pdfUrl{ 13 if let pdfDocument = PDFDocument(url:url) 14 { 15 pdfView.autoScales = true 16 pdfView.document = pdfDocument 17 } 18 } 19 } 20 21 else if let url = Bundle.main.url(forResource: "pdf", withExtension: "pdf") 22 { 23 if let pdfDocument = PDFDocument(url:url) 24 { 25 pdfView.autoScales = true 26 pdfView.document = pdfDocument 27 } 28 } 29}

AppDelegate

1 2 var appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate 3 4 5 func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { 6 print("url: ", url) 7 pdfUrl = url 8 // ここにViewControllerを呼び出すプログラムを入れたいのですが、 9 } 10

試したこと

上記のようにViewControllerとAppDelegateにプログラミングを作成し、二つをどうにか組み合わせようとしたのですが、どうにもAppDelegate.swiftURLを取得したものを、上手にViewController.swiftに送って、PDFとして表示することができません。
AppDelegate.swiftImport PDFKitなどを入れて直接プログラムを書いてみたりもしたのですが、どうもうまくいきません。。。
もしお詳しい方がいらっしゃいましたら、どのように 対処をしたらいいのか、簡単なサンプルコードをつけてご教授いただけますと大変助かります。

追記:
TsukubaDepot様に教えていただきましたサイトにて、URLをAppDelegateとViewControllerで共有できるプログラミングを追加しました。
しかし、AppDelegateから、ViewControllerを呼び出す方法が分からず、結局この共有したURLが上手に利用できずにいます。

追記2:
Swiftプログラミンはずぶの素人のため、少しずつ少しずつ勉強しておりましたら、バージョンがどんどん変わっていってしまっていて、もう、あとの、func application ()...も反応しなくなってしまいました。いろいろと調べたのですが、結局、共有されたファイルを受け取るURLも取得することもできません。どなたか、他のアプリからのファイルを共有したときに、せめてファイル名を取得できる方法をご教授いただけますと幸いです。

https://www.dcom-web.co.jp/lab/swift/custom_url_schemeを読んで、下記のものに書き換えてみたりもしたのですが、そもそも、下記が呼ばれていないようなのです。。。

swift

1func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool { 2 // 起動後の処理 3 let alert = UIAlertController(title: "タイトル", message: "アラートのメッセージです。", preferredStyle: .alert) 4 alert.addAction(UIAlertAction(title: "OK", style: .default)) 5 viewController.present(alert, animated: true, completion: nil) 6 return true 7}

以下のウェブサイトも関係しているのかな、と思いましたが、素人故、あまりよく分かりませんでした。。。
https://dev.classmethod.jp/articles/deprecated-openurl/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TsukubaDepot

2020/09/20 01:15

これは、AppDelegate で受け取ったインスタンスを、ViewController などでも使いたい、という問題でしょうか。 私も推奨される方法は知りたいところなのですが、たとえば、 http://hari-blog.com/appdelegate あたりは参考になりませんでしょうか。 あるいは、ご質問のタイトルを変更された方がいいかもしれません。 「AppDelegate で定義したプロパティ(変数)を他のインスタンス(ViewControllerなど)で参照する方法について」 などです。
sekiseki_2

2020/09/20 02:17

TsukubaDepot様、私の質問にコメントをいただきましてありがとうございます。また、ウェブサイトの紹介もありがとうございます。紹介していただきましたウェブサイトに従い、取得したURLをViewControllerでも共有することができました! しかし、共有してたURLを使ってViewcontrollerを更新することが上手にできません。。。AppDelegateから画面遷移をすればいいのかな?と思うのですが、なかなかうまくいきません。 質問内容・また、質問タイトルについても、より明確なものに修正したいと思います。
mskRR

2020/09/20 03:09

notificationCenter でポストして該当viewControllerに処理をさせてください。 インポートしたファイルを扱うのでしょうから同時にuserInfoでローカルのurlを送って処理させてみては。 やり方は調べてね。
sekiseki_2

2020/09/20 05:49

reeebock様、コメントありがとうございます。notificationCeterでの処理、調べてみたいと思います!
guest

回答1

0

自己解決

これの回答を探している方がいるかは分かりませんが。。。。以下のコードで対応できました。

ViewController.swiftdidFileShareOpenTheAppというフラグを持たせていて、ViewController内部のオリジナルFuncのpdfLoad(fileUrl: )から、PDFのロードをさせています。

swift

1class SceneDelegate: UIResponder, UIWindowSceneDelegate { 2 3 var window: UIWindow? 4 5 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 6 guard let scene = (scene as? UIWindowScene) else { return } 7 8 let window = UIWindow(windowScene: scene) 9 self.window = window 10 window.makeKeyAndVisible() 11 12 if let urlContext = connectionOptions.urlContexts.first { 13 openURLContext(urlContext) 14 } else { 15 print ("starting the app in a normal manner") 16 let storyboard = UIStoryboard(name: "Main", bundle: nil) 17 let vc = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController 18 self.window?.rootViewController = vc 19 //set flag 20 vc.didFileShareOpenTheApp = false 21 } 22 } 23 24 // You are being asked to open a document (via Files App -> Share). 25 func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { 26 // Only open the first document you are passed. 27 if let urlContext = URLContexts.first { 28 openURLContext(urlContext) 29 } 30 } 31 32 33 34 private func openURLContext(_ urlContext: UIOpenURLContext) { 35 36 let inputURL = urlContext.url 37 guard inputURL.startAccessingSecurityScopedResource() else { 38 print ("URL access was denied") 39 return 40 } 41 print("inputURL (inputURL)") 42 let storyboard = UIStoryboard(name: "Main", bundle: nil) 43 let vc = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController 44 self.window?.rootViewController = vc 45 //set flag 46 vc.didFileShareOpenTheApp = true 47 vc.pdfLoad(fileUrl: inputURL) 48 } 49// other things 50}

投稿2021/12/08 07:24

sekiseki_2

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問