Ticket #39798

iOS版 「ファイル」アプリ対応

Open Date: 2019-11-28 01:18 Last Update: 2019-12-01 01:26

Reporter:
Owner:
Status:
Closed
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
Fixed
File:
None

Details

iOS11から追加されている「ファイル」アプリに対応する。

  • 「ファイル」アプリで選択されたファイルをMIDITrailに取り込めるようにする。
  • MIDITrailのDocumentsフォルダの内容を「ファイル」アプリから参照できるうようにする。

本対応により、SafariでダウンロードしたファイルをMIDITrailに取り込めるようになる。

Ticket History (3/10 Histories)

2019-11-28 01:18 Updated by: yknk
  • New Ticket "iOS版 「ファイル」アプリ対応" created
2019-11-30 11:21 Updated by: yknk
Comment

ファイル受け渡し調査

ファイル受け渡しを指定されるDelegate

  • (1) application:didFinishLaunchingWithOptions: (昔から定義されているDelegate)
  • (2) application:openURL:options: (iOS9から導入されたDelegate)

ファイル受け渡しパターンと渡されるURLの例

  • (a) メールの添付ファイルをMIDITrailで開く
    file:///private/var/mobile/Containers/Data/Application/(MIDITrailのID)/Documents/Inbox/abcd.mid
    
  • (b) ファイルAppでMIDITrailのDocumentsフォルダ配下のファイルを開く
    file:///private/var/mobile/Containers/Data/Application/(MIDITrailのID)/Documents/abcd.mid
    
  • (c) ファイルAppで他アプリのDocumentsフォルダ配下のファイルをMIDITrailで開く
    file:///private/var/mobile/Containers/Data/Application/(他アプリのID)/Documents/abcd.mid
    
  • (d) ファイルAppでDownladフォルダ配下のファイルををMIDITrailで開く
    file:///private/var/mobile/Containers/Shared/AppGroup/(何かのID)/File%20Provider%20Storage/Downloads/abcd.mid
    
  • (e) SafariでダウンロードしたファイルをMIDITrailで開く
    file:///private/var/mobile/Library/Mobile%20Documents/com~apple~CloudDocs/Downloads/abcd.mid
    

考察

いずれのケースも、(1)(2)のDelegateが両方とも実行された。指定されたURLは(1)(2)で同じであった。 ただし少なくとも(e)のケースでは、(1)で渡されたNSURLオブジェクトを利用すると、ファイルへのアクセスは権限なしで失敗する。 しかし(2)で渡されたNSURLオブジェクトを利用すると、ファイルへのアクセスは成功する。

2019-11-30 11:25 Updated by: yknk
Comment

ファイルの受け取りパターンごとの処理方針

iOS9以降で(b)(c)(d)(e)が実施できる。

  • (a) メールの添付ファイルをMIDITrailで開く
    • MIDITrailのDocuments/Inboxフォルダ配下にファイルがコピーされるため、Documentsフォルダに移動する。
  • (b) ファイルAppでMIDITrailのDocumentsフォルダ配下のファイルを開く
    • もともとMIDITrailのDocumentsフォルダ配下に存在するため、ファイルの移動やコピーはしない。
  • (c) ファイルAppで他アプリのDocumentsフォルダ配下のファイルをMIDITrailで開く
  • (d) ファイルAppでDownladフォルダ配下のファイルををMIDITrailで開く
  • (e) SafariでダウンロードしたファイルをMIDITrailで開く
    • 指定されたURLのデータを読み込んで、MIDITrailのDocumentsフォルダ配下にファイルを作成して書き込む。 ファイルコピーはできないため。
2019-11-30 11:26 Updated by: yknk
Comment

対策1:プロジェクト設定

Targets / MIDITrail / Signing & Capabilities

iCloud を追加。"iCloud Documents"を選択状態にする。これによりプロジェクトに MIDITrai.entitlements ファイルが追加された。

Targets / MIDITrail / Info

Document Types に登録済みの4項目について、次のプロパティを追加。 (Standard MIDI File, Image File, Downloadable Sounds, SoundFont)

  • CFBundleTypeRole: Viewer -> ドキュメントに対するアプリの役割:ビューア
  • LSHandlerRank: Alternate -> ドキュメントのサポートレベル:閲覧可能

Imported UTIs に次の4項目を追加。(2)はカスタムでないので登録不要と思われるが、念のため追加した。

  • (1) Standard MIDI File / public.midi-audio / public.data / mid
  • (2) Image File / public.jpeg, public.png / public.data / jpg, png
  • (3) Downloadable Sounds / public.downloadable-sound / public.data / dls
  • (4) SoundFont / com.soundblaster.soundfont / public.data / sf2
(Edited, 2019-11-30 11:32 Updated by: yknk)
2019-11-30 11:27 Updated by: yknk
Comment

対策2:MIDITrailアプリケーションクラスの修正

MIDITrailAppDelegate::application:openURL:options

指定URLオープンのデリゲートを定義して、アプリケーションオブジェクトに通知する処理を追加。

MIDITrailApp::initialize

既存のファイル受け取り処理 receiveFileFromOtherApp の呼び出しを、iOS9未満の時だけ呼び出すように修正。

MIDITrailApp::receiveFileFromOtherApp

ファイル受け取り時に、既存ファイルとファイル名が重複した場合、ファイル名の末尾に追加する連番のフォーマットを変更する。

変更前:XXX-1.mid  ハイフン
変更後:XXX_1.mid  アンダーバー
ファイル一覧でファイル名をソート表示したときに、連番が追加されたファイルが後ろに並ぶようにするため。

MIDITrailApp::openURL

指定URLのパスを確認して、以下のいずれかの処理を実行する。

  • (a) MIDITrailのDocuments/Inboxフォルダ配下のファイルが指定された場合
    • MIDITrailのDocumentsフォルダに移動する。ファイル名が重複するときはファイル名末尾に連番(_1,_2,...)を追加する。
  • (b) MIDITrailのDocumentsフォルダ配下のファイルが指定された場合
    • 何もしない。
  • (a)(b)に該当しなかった場合
    • 指定されたURLからファイルをダウンロードして、MIDITrailのDocumentsフォルダにファイルを保存する。
    • ファイル名が重複するときはファイル名末尾に連番(_1,_2,...)を追加する。

次に以下の処理を実行する。

  • ファイルビュー制御と設定ビュー制御が保持するファイル一覧を更新させる。
  • ファイルビュー制御に、受け取ったファイルまでスクロールして選択状態するよう依頼する。

MIDITrailApp::makeFileNameAtDocumentsWithBaseFileName

MIDITrailのDocumentsフォルダ配下にファイルを配置するときのファイル名生成メソッドを追加。 ファイル名が重複するときはファイル名末尾に連番(_1,_2,...)を追加する。

MIDITrailApp::receiveFileFromURL:toFilePath

指定URLからファイルダウンロードするメソッドを追加。

2019-11-30 11:27 Updated by: yknk
Comment

対策3:ファイルビュー制御の修正

MTFileViewCtrl::initWithNibName:bundle

ファイル一覧 m_pFileArray のクリア処理を追加。

MTFileViewCtrl::makeFileList

ファイル一覧を複数回更新するケースを想定して m_pFileArray の破棄処理を追加。

MTFileViewCtrl::updateFileList

ファイル一覧更新メソッドを追加。

MTFileViewCtrl::scroolToFile

指定ファイルまでスクロールして選択状態にするメソッドを追加。

2019-11-30 11:27 Updated by: yknk
Comment

対策4:設定ビュー制御の修正

MTSettingViewCtrl::updateFileList

ファイル一覧更新メソッドを追加。 背景画像ビュー制御とWavetableファイルビュー制御にファイル一覧更新を指示する。

MTSettingBGIMGViewCtrl::initWithNibName:bundle

ファイル一覧 m_pFileArray のクリア処理を追加。

MTSettingBGIMGViewCtrl::makeFileList

ファイル一覧を複数回更新するケースを想定して m_pFileArray の破棄処理を追加。

MTSettingBGIMGViewCtrl::updateFileList

ファイル一覧更新メソッドを追加。

MTSettingWavetableViewCtrl::initWithNibName:bundle

ファイル一覧 m_pFileArray のクリア処理を追加。

MTSettingWavetableViewCtrl::makeFileList

ファイル一覧を複数回更新するケースを想定して m_pFileArray の破棄処理を追加。

MTSettingWavetableViewCtrl::updateFileList

ファイル一覧更新メソッドを追加。

2019-11-30 11:28 Updated by: yknk
  • Resolution Update from None to Fixed
  • Status Update from Open to Closed
2019-12-01 01:26 Updated by: yknk
Comment

対策5:iCloud Container設定追加

アプリをリリースする際にOrganizerでValidateを実施したところ、以下のエラーが発生した。 この問題を解決するため、iCloud Containerの設定を追加する。

Automatic signing is unable to resolve an issue with the "MIDITrail.app" target's entitlements.
Automatic signing can't add the com.apple.developer.icloud-container-environment entitlement 
to your provisioning profile. Switch to manual signing and resolve the issue by downloading 
a matching provisioning profile from the developer website. Alternatively, to continue using
automatic signing, remove this entitlement from your entitlements file and its associated 
functionality from your code. Then rebuild your archive and try again.

Developer Webサイトの設定

  • Developer Webサイトにログインして、"Certificates, Identifiers & Profiles"を選択。
  • Identifiers を選択して、(+)ボタンを押す。
  • iCloud Containers を選択して Continue を押す。
  • 以下の文字列を入力して Continue を押す。
    • Description : MIDITrail iOS Container
    • Identifier : iCloud.me.osdn.users.yknk.ios.MIDITrail
  • 登録内容を確認して Register を押す。
  • Identifiers に戻る。登録したIdentifier(MIDITrail iOS Container)は表示されない。
  • MIDITrail for iOS を選択すると、Edit your App ID Configuration 画面が表示される。
  • Capabilities の一覧に対して、以下の変更を実施。
    • App Groups : 選択マークを外す。Xcodeのプロジェクトでは選択していないため。
    • Push Notifications : 選択マークを外す。Xcodeのプロジェクトでは選択していないため。
    • iCloud : 選択マークがついていることを確認。
      • Include CloudKit support(requires Xcode6) : 選択はそのまま。
      • Configure ボタンを押す。
      • 先ほど登録したIdentifier(MIDITrail iOS Container)が表示されるのでチェックマークをつけて Continue を押す。
    • Save を押すと次のメッセージが表示されるので Confirm を押す。
      Modify App Capabilities
      Adding or removing any capabilities will invalidate any provisioning profiles 
      that include this App ID and they must be regenerated for future use.
      (機能を追加または削除すると、このApp IDを含むプロビジョニングプロファイルが無効になり、
      将来使用するために再生成する必要があります。)
      
2019-12-01 01:26 Updated by: yknk
Comment

対策5:iCloud Container設定追加(続き)

Xcodeプロジェクトの設定

  • Targets / MIDITrail / Signing & Capabilities を選択。
  • iCloud セクションで、iCloud Documents にチェックアークがあることを確認。
  • Containers は未設定の状態のため、リロードアイコンを押すと、先ほど登録したIdentifierが現れるのでチェックマークをつける。
    • v iCloud.me.osdn.users.yknk.ios.MIDITrail

Xcodeプロジェクトの設定(その他)

  • Project / MIDITrail / Build Settings を選択。
  • Code Signing Identity に"iPhone Distribution: xxxx (xxxx)"が設定されていたが、未設定に変更した。 Targets / MIDITrail / Signing & Capabilities の Signing で Automatically manage signing を有効にしているため。

Attachment File List

No attachments

Edit

Please login to add comment to this ticket » Login