UIDocumentInteractionControllerのpresentOpenInMenuで開きたいアプリが表示されない
環境:swift3 、Xcode8.3.1
開発経験:開発素人(swift3,c言語を入門レベルまで勉強したことあり)
現在上司の無茶振りによりios対応のzip解凍アプリを作成しています(汗)。
現に様々な解凍アプリがありますがセキュリティの関係で機能制限をつけ作成したいと思っています。
サンプルアプリやライブラリを使いUITableViewのCellに外部アプリから受け取ったデータを表示させ
zipファイルをタップした場合は解凍処理、その他の拡張子の場合は対応した外部アプリにデータを渡すことをしたいと思っています。
【現在できてる処理】
・OutlookAppからのデータの受け取り(zip等)
・AppのDocuments/Inboxディレクトリから編集可能用のディレクトリ(Documents/ListFolder)にデータを移動
・Cellに表示、タップした項目の削除処理
・zipファイル解凍処理(パスワード対応はまだ・・・)
【今回の質問で教えていただきたい処理】
・zip以外の拡張子を他のアプリに渡す。(excelやwordのAppを表示したいがアイコンが出てこない)
様々なサイトを参考にInfo.plistを手探りで設定してみましたがそれが合っているのかも分からない状況です・・・
力不足なのは重々承知しておりますがどなたかご教示お願いいたします。
以下の箇所がアイコンを表示させたいと思って書いたコードです。
switch extensionType {
case "zip":
showAlert(extensionFileName)
default:
print(listFolderPathUrlName.appendingPathComponent("\(extensionFileName)"))
controller = UIDocumentInteractionController(url: listFolderPathUrlName.appendingPathComponent("\(extensionFileName)"))
controller.delegate = self as? UIDocumentInteractionControllerDelegate
self.controller?.uti = "public.data"
if !(controller.presentOpenInMenu(from: self.view.frame, in: self.view, animated: true)){
let alert = UIAlertController(title: "送信失敗", message: "ファイルを開けるアプリが見つかりませんでした.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
self.present(alert,animated: true,completion: nil)
}
}
全体のコードは以下の通りです
ハチャメチャなコードですが・・・
import UIKit
import SSZipArchive
class FileList: UIViewController, UITableViewDataSource, UITableViewDelegate {
var manager: FileManager!
var path: String!
var homePath: String!
var paths: Array<String>!
var checkedFileName:String!
var extensionFileName:NSString!
var extensionType:String!
var newDocumentsPath:String!
var logsPath:URL!
var isDir:ObjCBool! = false
var listFolderPathStringName:String!
var documentsInboxFolderPath:URL!
var inboxPathStringName:String!
var deleatFileName:String!
var removeItemPath:String!
var pathsName:Array<String>!
var inboxPaths:String!
var controller:UIDocumentInteractionController!
var openUrl:NSURL!
var documentsPath1:NSURL!
var inboxPathUrlName:URL!
var listFolderPathUrlName:URL!
var inboxList:Array<String>!
var num:Int = 0
var tempoName:URL!
var listFolderList:Array<String>!
var atDir:Array<String>!
var toDir:Array<String>!
@IBOutlet weak var myTableView: UITableView!
@IBOutlet weak var reviewButton: UIButton!
@IBAction func reViewCell(_ sender: Any) {
moveItem()
myTableView.reloadData()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int {
print("--------tableView-numberOfRowsInSection-------")
if paths == nil {
return 1
}
return paths.count;
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
print("--------tableView-cellForRowAt-------")
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "Cell")
print(indexPath.row)
cell.textLabel?.text = paths[indexPath.row]
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("--------tableView-didSelectRowAt-------")
checkedFileName = paths[indexPath.row] //選択されたファイルパスをcheckedFileNameに格納
print("checkedFileName :\(checkedFileName!)")
extensionFileName = NSString(string: checkedFileName)
print("extensionFileName:\(extensionFileName!)")
extensionType = extensionFileName.pathExtension
print("extensionType :\(extensionType!)")
switch extensionType {
case "zip":
showAlert(extensionFileName)
default:
print(listFolderPathUrlName.appendingPathComponent("\(extensionFileName)"))
controller = UIDocumentInteractionController(url: listFolderPathUrlName.appendingPathComponent("\(extensionFileName)"))
controller.delegate = self as? UIDocumentInteractionControllerDelegate
self.controller?.uti = "public.data"
if !(controller.presentOpenInMenu(from: self.view.frame, in: self.view, animated: true)){
let alert = UIAlertController(title: "送信失敗", message: "ファイルを開けるアプリが見つかりませんでした.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
self.present(alert,animated: true,completion: nil)
}
}
}
//Cell削除
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
print("--------editActionsForRowAt-------")
let deleteButton: UITableViewRowAction = UITableViewRowAction(style: .normal, title: "削除") { (action, index) -> Void in
self.deleatFileName = self.paths[indexPath.row]
self.paths.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
self.removeItemPath = self.listFolderPathStringName + "/\(self.deleatFileName!)"
try! self.manager.removeItem(atPath: self.removeItemPath)
print("removeItemPath = \(self.removeItemPath)")
}
return [deleteButton]
}
//Cellで選択したフォルダがZIP形式ならアラートを表示し解凍をするかキャンセルかを選択
func showAlert(_ sender: Any) {
print("--------showAlert--------")
let actionSheet = UIAlertController(title: "解凍", message: "\(extensionFileName!)を解凍しますか?", preferredStyle: UIAlertControllerStyle.actionSheet)
let action1 = UIAlertAction(title: "はい", style: UIAlertActionStyle.default, handler: {
(action: UIAlertAction!) in
print("アクション1をタップした時の処理")
self.extractAction(self.checkedFileName)
})
let cancel = UIAlertAction(title: "キャンセル", style: UIAlertActionStyle.cancel, handler: {
(action: UIAlertAction!) in
print("キャンセルをタップした時の処理")
})
actionSheet.addAction(action1)
actionSheet.addAction(cancel)
self.present(actionSheet, animated: true, completion: nil)
}
//解凍処理(cellで選択されたファイルがzip形式ならそれを解凍しデータを保存
func extractAction(_ sender: Any){
print("--------extractAction--------")
print("checkedFileName:\(checkedFileName)")
let thisPath = listFolderPathStringName + "/" + checkedFileName
print(thisPath)
if !SSZipArchive.unzipFile(atPath: thisPath, toDestination: listFolderPathStringName) {
print("解凍できませんでした:")
}
viewWillAppear(true)
}
func refreshPaths() {
print("--------refreshPaths--------")
paths = manager.subpaths(atPath: listFolderPathStringName)
print("paths = \(paths)")
if paths != nil {
print("paths.count = \(paths.count)")
}
print("----------------------------")
}
override func viewWillAppear(_ animated: Bool) {
self.myTableView.reloadData()
}
func moveItem(){
documentsPath1 = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])
listFolderPathStringName = homePath + "/Documents/ListFolder/"
inboxPathStringName = homePath + "/Documents/Inbox/"
inboxPathUrlName = URL(fileURLWithPath: inboxPathStringName)
listFolderPathUrlName = URL(fileURLWithPath: listFolderPathStringName)
print("======================================================")
print("listFolderPathStringName = \(listFolderPathStringName)")
print(" inboxPathStringName = \(inboxPathStringName)")
print(" documentsPath1 = \(documentsPath1)")
print(" inboxPathUrlName = \(inboxPathUrlName)")
print(" listFolderPathUrlName = \(listFolderPathUrlName)")
print("======================================================")
// /Inboxと/ListFolderのディレクトリが存在するか確かめ処理
// /Inboxディレクトリがあれば
if manager.fileExists(atPath: inboxPathStringName) == true{
// /ListFolderディレクトリがあれば
if manager.fileExists(atPath: listFolderPathStringName) == true{
//Inboxディレクトリ内のサブパス(ファイル名)をinboxListに保存
inboxList = try! manager.subpathsOfDirectory(atPath: inboxPathStringName)
print(" inboxListCount = \(inboxList.count)")
print(" inboxList = \(inboxList)")
//inboxListのファイルパスをListFolderにコピー
for _ in inboxList{
num = 0
do{
tempoName = inboxPathUrlName.appendingPathComponent("\(inboxList[num])")
print("tempoName = \(tempoName)")
print("tempolast = \(tempoName.lastPathComponent)")
try manager.moveItem(at: tempoName, to: listFolderPathUrlName.appendingPathComponent(tempoName.lastPathComponent))
}catch let copyerror as NSError{
NSLog("\(inboxList[0])は既に存在するかコピーができませんでした.\(copyerror.debugDescription)")
}
num += 1
}
// コピー後のlistFolderディレクトリの中を確認
listFolderList = manager.subpaths(atPath: listFolderPathUrlName.path)
print("listFolderList = \(listFolderList)")
}else{ // /ListFolderディレクトリが無ければディレクトリを作成
do{
try manager.createDirectory(atPath: listFolderPathUrlName.path, withIntermediateDirectories: true, attributes: nil)
}catch let createListFolderError as NSError{
NSLog("フォルダを作成できませんでした.\(createListFolderError.debugDescription)")
}
}
}else{ // /Inboxディレクトリが無ければディレクトリを作成
do{
try manager.createDirectory(atPath: listFolderPathUrlName.path, withIntermediateDirectories: true, attributes: nil)
}catch let createListFolderError as NSError{
NSLog("フォルダを作成できませんでした.\(createListFolderError.debugDescription)")
}
}
refreshPaths()
}
override func viewDidLoad() {
super.viewDidLoad()
myTableView.delegate = self
myTableView.dataSource = self
manager = FileManager.default
homePath = NSHomeDirectory()
moveItem()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}