Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
0 oy
1.3k kez görüntülendi
ios development kategorisinde tarafından

Merhaba;
Json veri olarak döküman için url alıyorum. Ben bunu webview ile değilde daha güzel olması için Döküman sınıflarından birisi kullanarak uygulamam içinde açmak istiyorum. Çok araştırdım Türkçe veya İngilizce webview dışında bir çözüm bulamadım. Fakat mevcut uygulamaları incelediğimde webview dışında IOS Sınıflarından bir şekilde yararlanıp. Webview'siz olarak uygulama içinde gösterebiliyorlar. Webview kullanmadan nasıl gelen pdf url'mi açabilirim ?

1 cevap

0 oy
tarafından

UIDocumentInteractionController veya QuickLook kullanarak yapabilirsin.
web'de bulunan bir pdf dosyalarının indirilmesi ve görüntülenebilmesi için basit bir örnek hazırladım.

Önemli: Örneğin çalışabilmesi için "info.plist" içerisine aşağıdaki parametreyi eklemelisin.

App Transport Security Settings
Allow Arbitrary Loads = YES

//
//  ViewController.swift
//  pdfDisplayer
//
//  Created by Yasin TURKOGLU on 13.04.2018.
//  Copyright © 2018 Yasin TURKOGLU. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UIDocumentInteractionControllerDelegate {

    let actionButton:UIButton = {
        let button = UIButton(type: .custom)
        button.backgroundColor = .blue
        button.setTitle("Download and display PDF", for: .normal)
        button.addTarget(self, action: #selector(displayPDFAction), for: .touchUpInside)
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }()

    let UIDocumentInteractionControllerPDFPresenter:UIDocumentInteractionController = {
        let interactionController = UIDocumentInteractionController()
        return interactionController
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.UIDocumentInteractionControllerPDFPresenter.delegate = self

        self.view.addSubview(self.actionButton)
        NSLayoutConstraint.activate([
            self.actionButton.heightAnchor.constraint(equalToConstant: 50.0),
            self.actionButton.widthAnchor.constraint(equalToConstant: 250.0),
            self.actionButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            self.actionButton.centerYAnchor.constraint(equalTo: self.view.centerYAnchor)
        ])
        self.view.layoutIfNeeded()

    }

    @objc func displayPDFAction() {
        print("Downloading and displaying process has been started")
        UIApplication.shared.isNetworkActivityIndicatorVisible = true
        downloadAndDisplayPDFFromURL(string: "https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf") { (error) in
            if let receivedError = error {
                print("An error occurred:\(receivedError.localizedDescription)")
            } else {
                print("Successfully downloaded and presented")
            }
            UIApplication.shared.isNetworkActivityIndicatorVisible = false
        }
    }

    func downloadAndDisplayPDFFromURL(string: String, _ completed: @escaping(Error?)->Void) {
        DispatchQueue.global(qos: .background).async {
            if let pdfURL = URL(string: string) {
                do {
                    let pdfData = try Data(contentsOf: pdfURL)
                    let documentsDirectoryURL = try FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("Sample.pdf")
                    try pdfData.write(to: documentsDirectoryURL, options: .atomic)
                    DispatchQueue.main.async {
                        self.UIDocumentInteractionControllerPDFPresenter.url = documentsDirectoryURL
                        self.UIDocumentInteractionControllerPDFPresenter.presentPreview(animated: true)
                        completed(nil)
                    }
                } catch {
                    completed(error)
                }
            }
        }
    }

    //MARK: UIDocumentInteractionControllerDelegate methods
    func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {
        return self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}
tarafından

Hocam öncelikle çok teşekkür ederim.
Verdiğiniz kod çok güzel çalışıyor. Fakat benim indirmeden uygulama içinde açmam lazım. Böyle bir şey mümkün değil'mi? Verdiğiniz kod üzerinde çok oynadım indirmeden açabileyim diyede bir türlü olmadı. İndirmeden açabiliyor'muyum ? Yada tam olarak nasıl açabilirim ?

tarafından

indirmeden açmaktan kastettiğin uygulamanın main bundle'ı na, yani dosya yapısına kaydettiğin bir pdf dosyasını açmaksa, bunu sadece IOS 11 öncesi sürümlerde yapabilirsin.
Bir hatamıdır, yoksa bir zorunluluk mu bilemiyorum ama, IOS 11'den itibaren proje kök dizinine eklenmiş dökümanlar UIDocumentInteractionController veya QuickLook kullanılarak açılamıyorlar.
Bir açıklamada yok bu konuya ilişkin. Sadece developer forumda konuşulmuş bir durum.
https://forums.developer.apple.com/thread/91835

Yine de bu olumsuz durumun üstesinden gelmek bir şekilde mümkün.
Verdiğim örnek de dosyayı internetten indirip "documentsDirectoryURL" sabitinde oluşturduğumuz dosya yoluna "Sample.pdf" adıyla yazdırıyorduk.
bunun yerine, main bundle'da ki dosyayı alıp, "documentsDirectoryURL" dizinine yazdırmak ve daha sonra bu lokasyon üzerinden görüntülemek bir çözüm olabilir. Denemek lazım.

tarafından

Peki hocam sizin örnek koddaki gösterimde PDF'i indirdiği için açarken paylaşım seçenekleride beliriyor. Ben istemiyorum kullanıcım bunu alıp başkasına yollasın. Bunu nasıl engelleyebilirim.?

tarafından

Güzel soru. Ne yazık ki ne UIDocumentInteractionController ne de QuickLook'da navigation bar'da yer alan paylaşım seçeneklerinin gösterildiği butonu kaldırmak gibi bir seçenek yok. Daha önce de hiç böylesi bir duruma ihtiyaç duymamıştım. İnternet'de biraz araştırınca farklı yollardan kaldırılabileceğine dair bir iki örneğe rastladım ve denedim ama bir sonuca ulaşamadım. 3. parti kütüphaneler var git'de. Alternatif olarak onlar denenebilir.

...