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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

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

Swift

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

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

2628閲覧

iOSで外部PDFビューアで起動した際に変更を検知できますか?

yrema

総合スコア286

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

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

Swift

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

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2019/06/25 07:38

編集2019/06/25 17:21

いくつか頂いた情報で質問文を書き換えました。

UIDocumentInteractionControllerによりPDFをAdobe Acrobat Readerに送ってコメント入れて保存したPDFを受け取りたいのですが、
下記のコードでResouces内のsample.pdfをAdobe Acrobat Readerに送って開くことは出来たのですが、戻り方が分からず困っています。
Androidは確か共有機能で外部アプリ起動後に戻ったことを検知できたはずなので、それと同じことがやりたいです。

c#

1 public partial class ViewController : UIViewController, IUIDocumentInteractionControllerDelegate 2 { 3 public ViewController (IntPtr handle) : base (handle) 4 { 5 } 6 7 public override void ViewDidLoad () 8 { 9 base.ViewDidLoad (); 10 11 UIButton button = new UIButton(new CGRect(0, 0, 100, 100)); 12 button.Center = View.Center; 13 button.BackgroundColor = UIColor.Blue; 14 button.TouchUpInside += OnClicked; 15 View.AddSubview(button); 16 } 17 18 private void OnClicked(object sender, EventArgs e) 19 { 20 string fileName = "sample.pdf"; 21 22 // Resourcesのパスを取得 23 string resourcesPath = NSBundle.MainBundle.BundlePath; 24 // PDFのパスを取得 25 string pdfPath = Path.Combine(resourcesPath, fileName); 26 27 // Documentのパスを取得 28 string documentPath = NSSearchPath.GetDirectories(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0]; 29 30 if (NSFileManager.DefaultManager.FileExists(pdfPath)) 31 { 32 // 外部アプリで開く 33 NSUrl copyDstPathUrl = new NSUrl(pdfPath, false); 34 UIDocumentInteractionController dic = UIDocumentInteractionController.FromUrl(copyDstPathUrl); 35 dic.Delegate = this; 36 if (!dic.PresentOpenInMenu(new CGRect(0, 0, 500, 500), View, true)) 37 { 38 Console.WriteLine("ファイルに対応するアプリがありません", this); 39 } 40 } 41 } 42 }

▼UIDocumentInteractionControllerが表示されたところ([Acrobatにコピー]をクリック)
イメージ説明

▼Adobe Acrobat Readerを起動して取り消し線を入れた後に、右上のメニューを見て「もしかして戻れないんじゃないか」と思い始めたところ
イメージ説明

◆開発環境
▼実機デバイス
iPad 9.7インチ Wi-Fiモデル 32GB MRJN2J/A
▼Windows 10
Visual Studio Community 2017 Version 15.9.11
Xamarin 4.12.3.83
Xamarin.iOS and Xamarin.Mac SDK 12.4.0.64
▼Mac mini(Late 2014)
macOS Majave 10.14.4
Xcode 10.2.1

以下編集前の質問文============================================

タイトルの通りですが、
アプリからPDFを外部ビューアで起動し、ファイルが変更されたことを元のアプリが検知することはできるでしょうか?
★環境
iOS 12以上 objective-c、swift、xamarinなど言語は問いません。

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

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

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

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

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

y_waiwai

2019/06/25 07:40

なんの変更のはなしでしょうか?
yrema

2019/06/25 07:42

ファイルが更新されたということを検知です。質問文を編集しました。
takabosoft

2019/06/25 08:06

どこにあるPDFファイル(?)を、具体的になんの外部ビューアで開いているのでしょうか?
yrema

2019/06/25 08:18

ファイル場所や外部ビューアに依存するということでしょうか?
takabosoft

2019/06/25 08:21

ファイル場所は少なくとも依存します。外部ビューアは可能であれば書いてください。
yrema

2019/06/25 08:29

外部ビューアは何を使うのかはユーザー次第なので1つに絞ることはできませんが、ここでは標準で備わっているPDFビューアを使うと回答します。
yrema

2019/06/25 08:32

ファイル場所は読み書き可能なディレクトリ(Documents/とLibrary/)を使う予定です。
takabosoft

2019/06/25 08:35

自分のDocumentフォルダ内のPDFファイルを外部アプリに渡すのはUIActivityViewControllerか何かですか?
takabosoft

2019/06/25 08:58

「標準で備わっているPDFビューア」ってなんでしょうね?外部ビューアでそんなものありましたっけね・・・
yrema

2019/06/25 09:20

外部アプリに送るのはUIDocumentInteractionControllerを使う想定でいました。
yrema

2019/06/25 09:38 編集

>外部ビューアでそんなものありましたっけね・・・ 逆に言うとiOSで一般的に使われているPDFビューアは何でしょうか? 重ねて質問になりますが、検知できるPDFビューアのアプリ名を教えていだたけないでしょうか?
yrema

2019/06/25 17:23

具体名と外部アプリ起動するまでのコードを付け加えて、質問文を全部書き直しました。
takabosoft

2019/06/26 03:01 編集

iOSでアプリとして単体で存在する標準PDFビューアはたぶんありません。iOSはPdfKitなどを使ってビューア機能を内蔵しているものがおおいです。
guest

回答1

0

ベストアンサー

こんにちは。

まずは、ドキュメントをフォルダを公開し、直接編集を許可する必要があるようです。
iOS 11ファイルAppにDocumentsフォルダを表示して他のアプリと共有する方法

これで自分のドキュメントフォルダのPDFファイルをファイルアプリからAcrobat Readerアプリを使って直接編集できることをまずは確認してください(チェックポイント1)。

次に、UIDocumentInteractionControllerのイニシャライザに自分のドキュメントフォルダのPDFファイルを渡してpresentOptionsMenuします。

この時に表示されるUIは自分の環境では安定しなかったのですが、
「Copy to Acrobat」と表示される場合と、「Open In Actobat」と表示されるときと2パターンありました(ちょっと端末にベータ入れてるせいもあると思うので原因はわかりませんが、一度Copy Toをタップしたあとだと何故かOpen Inに変わったりしました)。

「Open In Acrobat」をタップすると、Acrobat Readerアプリが立ち上がり、編集終了後に「ファイル」アプリを使ってPDFファイルが更新されていることを確認してください(チェックポイント2)。

ここまで動けば、あとはドキュメントフォルダの監視をするだけです。
NSFileCoordinator/NSFilePresenterを使ってディレクトリ監視
を参考にしてください。

手元で試した感じではAcrobat側が更新するとpresentedSubitemDidChange(at:)が呼ばれるようでした。
ここで変更を検出できればゴールかと思います。

投稿2019/06/25 08:51

編集2019/06/26 05:31
takabosoft

総合スコア8356

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

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

yrema

2019/06/25 09:28

ファイルの複製を送っているということは元のファイルが変更されないということでしょうか?
yrema

2019/06/25 17:42

具体名と外部アプリ起動するまでのコードを付け加えて、質問文を全部書き直しました。
takabosoft

2019/06/26 02:59

> ファイルの複製を送っているということは元のファイルが変更されないということでしょうか? そう書いたつもりです。 念の為検証してもらったほうが良いと思いますが...
yrema

2019/06/26 03:41

例えば「ファイル」から「Adobe Acrobat Reader」に送って編集すると、「ファイル」に戻ってきた時にPDFが編集されているのですが、これは送る時にも受け取る時にもファイルの複製を送りあっているということなのでしょうか?受け取り側がコピーを同じファイル名として保存しているだけということなのでしょうか?
takabosoft

2019/06/26 04:08

「ファイル」アプリの話ですか?どこにあるPDFを送りました?
takabosoft

2019/06/26 04:19

すみません、上のフラグを立てると、複製ではなく、オリジナルそのものを編集できるようになると書いてあります。
takabosoft

2019/06/26 04:23

重要:ドキュメントを所定の位置に開くと、他のプロセスがそのドキュメントをいつでも変更できます。したがって、UIDocumentサブクラス、またはNSFilePresenterオブジェクトとNSFileCoordinatorオブジェクトを使用して、ドキュメントへのアクセスを調整する必要があります。 と書かれているので、 https://qiita.com/hanamiju/items/2a9f9edaa832a79733eb のようにディレクトリを監視してやれば変更通知が取れるのではないかと思うのですが。
yrema

2019/06/26 04:42

>「ファイル」アプリの話ですか?どこにあるPDFを送りました? 「ファイル」アプリの話です。場所はiCloud Drive → デスクトップ です。
yrema

2019/06/26 05:18

> LSSupportsOpeningDocumentsInPlace これは良さそうですね。が、info.plistに記述してみたところフォルダが表示されないので、LSSupportsOpeningDocumentsInPlaceについてはまた別の質問を投稿したいと思います。
takabosoft

2019/06/26 05:22

一回まとめますよ
takabosoft

2019/06/26 05:34

回答欄を書き直しました。
yrema

2019/06/26 07:56

できました!NSFilePresenterのXamarinの記事が見当たらなかったので読み替えする必要がありましたが、見事にファイル変更検知が実現できました!ありがとうございます!高評価+100くらいしたいです。 以下の点が気になりましたので、また後日別に質問するかもしれません。 1. PresentedSubitemChangedはアプリが前面に出てこないと呼ばれないこと。⇒そういうものなのかなと理解するしかないですかね? 2. PresentedSubitemChangedがなぜか2回呼ばれること。 3. takabosoftさん同様に「Acrobatで開く」と「Acrobatでコピー」が安定しないこと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問