

環境:swift3 、Xcode8.3.1  
開発経験:開発素人(swift3,c言語を入門レベルまで勉強したことあり)

現在上司の無茶振りによりios対応のzip解凍アプリを作成しています（汗）。  
現に様々な解凍アプリがありますがセキュリティの関係で機能制限をつけ作成したいと思っています。

サンプルアプリやライブラリを使いUITableViewのCellに外部アプリから受け取ったデータを表示させ  
zipファイルをタップした場合は解凍処理、その他の拡張子の場合は対応した外部アプリにデータを渡すことをしたいと思っています。

【現在できてる処理】  
・OutlookAppからのデータの受け取り(zip等）  
・AppのDocuments/Inboxディレクトリから編集可能用のディレクトリ（Documents/ListFolder）にデータを移動  
・Cellに表示、タップした項目の削除処理  
・zipファイル解凍処理（パスワード対応はまだ・・・）

【今回の質問で教えていただきたい処理】  
・zip以外の拡張子を他のアプリに渡す。(excelやwordのAppを表示したいがアイコンが出てこない)  
[![ExcelAppやWordAppを表示したい](https://i.stack.imgur.com/tmtEm.png)](https://i.stack.imgur.com/tmtEm.png)

様々なサイトを参考にInfo.plistを手探りで設定してみましたがそれが合っているのかも分からない状況です・・・[![画像の説明をここに入力](https://i.stack.imgur.com/6ktC6.png)](https://i.stack.imgur.com/6ktC6.png)

力不足なのは重々承知しておりますがどなたかご教示お願いいたします。

以下の箇所がアイコンを表示させたいと思って書いたコードです。

[code]

    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)
            }
        }
    
[/code]

全体のコードは以下の通りです  
ハチャメチャなコードですが・・・

[code]

    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("アクション１をタップした時の処理")
                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()
        }
    }
    
[/code]


CC BY-SA 3.0
2017-05-10T08:05:27.323
34602
2017-05-10T08:38:52.103
2017-05-10T08:38:52.103
3068
23002
question
ios xcode swift3
UIDocumentInteractionControllerのpresentOpenInMenuで開きたいアプリが表示されない