集成ONLYOFFICE移动web编辑器

要访问移动应用程序中的编辑器功能,请通过WebView组件(一个负责在应用程序中打开网页的系统组件)将其与ONLYOFFICE编辑器集成。 之后,用户将能够直接在 iOS 或 Android 设备上查看、创建和编辑文本文档、电子表格和演示文稿,填写和阅读 PDF。

请注意,ONLYOFFICE移动web编辑器仅适用于 企业开发者 版本的商业版本。

在本节中,我们将使用 GitHub上提供的iOS移动演示示例,通过 WKWebView 查看集成过程。

基于ONLYOFFICE测试范例的集成

此示例演示了如何将ONLYOFFICE移动web编辑器与ONLYOFFICE 测试或DMS范例集成。

通过测试范例实现iOS集成

打开ONLYOFFICE编辑器

  1. 下载并安装ONLYOFFICE 文档 企业开发者 版本。
  2. GitHub下载适用于iOS的移动演示示例。
  3. Xcode 打开 EditorWebViewDemo.xcodeproj 项目,以修改此示例的代码片段,使DMS能够正常工作。
  4. 要显示DMS主页,请在 Info.plist 文件的 DocumentServerURL 属性值中指定文档服务器web界面的地址。

    <dict>
        ...
        <key>DocumentServerURL</key>
        <string>https://documentserver/</string>
    </dict>
    

    其中, documentserver 是安装了ONLYOFFICE 文档服务器的服务器的名称。

    如果指定了 DocumentServerURL ,则会加载DMS主页。否则,会发生错误:

    private func load() {
        if documentServerUrlString.isEmpty {
            showAlert(title: "Error", message: "You must specify the document server address, the \"DocumentServerURL\" value in the Info.plist file.")
            return
        }
    
        guard let url = URL(string: documentServerUrlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "") else {
            return
        }
    
        webView.load(URLRequest(url: url))
    }
    
    iOS错误

    未指定DocumentServerURL

    iOS管理

    已指定DocumentServerURL

  5. 使用 DocumentServerViewController 控制器在iOS设备上正确打开编辑器。 在此控制器中,定义通过WKWebView组件打开文档的函数。 首先,请求一个绝对URL并检查它是否包含 "/editor?" 字符串。 如果是,请向链接添加其他查询参数(移动平台类型):

    private var openDocumentMarker = "/editor?"
    private var additionalQueryParameters = ["type": "mobile"]
    
    func webView(_ webView: WKWebView,
        decidePolicyFor navigationAction:
        WKNavigationAction,
        decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
    {
        guard let urlString = navigationAction.request.url?.absoluteString else {
            decisionHandler(.cancel)
            return
        }
    
        if urlString.contains(openDocumentMarker),
           let redirectUrl = navigationAction.request.url?.appendingQueryParameters(additionalQueryParameters)
        {
            decisionHandler(.cancel)
            navigator.navigate(to: .documentServerEditor(url: redirectUrl))
        } else {
            reloadItem.isEnabled = true
            backItem.isEnabled = webView.canGoBack
            forwardItem.isEnabled = webView.canGoForward
    
            title = navigationAction.request.url?.host ?? ""
    
            decisionHandler(.allow)
        }
    
    }
    
  6. DocumentServerViewController 控制器中,创建DMS主页上可用的导航操作。 例如,在我们的测试范例中,它们是用界面元素指定的,例如 Reload, Back, 和 Forward 按钮。
  7. 为了便于与编辑器交互,请定义 活动指示器进度视图 UI组件。

    DocumentServerViewController 的完整代码可以在 此处找到。

    活动指示器

    活动指示器

    进度视图

    进度视图

    按钮

    按钮

  8. 要开始处理文档,请通过WKWebView组件在移动设备上显示ONLYOFFICE编辑器。 为此,请在 DocumentServerEditorViewController 控制器中设置WKWebView和布局,如下所示:

    private func configureView() {
        let preferences = WKPreferences()
        let configuration = WKWebViewConfiguration()
        preferences.javaScriptEnabled = true
        configuration.preferences = preferences
    
        webView = WKWebView(frame: .zero, configuration: configuration)
    
        view.addSubview(webView)
        webView.translatesAutoresizingMaskIntoConstraints = false
    
        webView.navigationDelegate = self
        webView.uiDelegate = self
    
        if let webViewSuperview = webView.superview {
            webView.topAnchor.constraint(equalTo: webViewSuperview.topAnchor).isActive = true
            webView.leadingAnchor.constraint(equalTo: webViewSuperview.leadingAnchor).isActive = true
            webView.bottomAnchor.constraint(equalTo: webViewSuperview.bottomAnchor).isActive = true
            webView.trailingAnchor.constraint(equalTo: webViewSuperview.trailingAnchor).isActive = true
        }
    ...
    }
    
  9. 在Xcode工具栏中,选择要运行应用程序的构建方案和设备。 然后,选择 Product -> Run,或单击项目工具栏中的 Run 按钮来构建和运行代码。
  10. 在应用程序的主屏幕上,选择 Using DocumentServer 选项以演示一个将ONLYOFFICE移动web编辑器与ONLYOFF测试或DMS范例集成的示例。

关闭ONLYOFFICE编辑器

使用 DocumentServerEditorViewController 控制器退出编辑器。 例如,在当前测试范例中,创建 返回 按钮以导航到上一屏:

private let goBackUrl = Bundle.main.object(forInfoDictionaryKey: "DocumentServerURL") as? String ?? ""

func webView(_ webView: WKWebView,
    decidePolicyFor navigationAction: WKNavigationAction,
    decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
{
    guard let urlString = navigationAction.request.url?.absoluteString else {
        decisionHandler(.cancel)
        return
    }
        
    if urlString == goBackUrl {
        decisionHandler(.cancel)
        navigationController?.popViewController(animated: true)
    } else {
        decisionHandler(.allow)
    }
}
回去

退出编辑器的按钮

DocumentServerEditorViewController 的完整代码可以在 此处找到。

基于ONLYOFFICE 文档 API的集成

此示例演示如何使用 API文档配置示例中描述的编辑器配置通过WKWebView打开ONLYOFFICE编辑器。

通过api集成iOS

打开ONLYOFFICE编辑器

  1. 下载并安装ONLYOFFICE 文档 企业开发者 版本。
  2. GitHub下载适用于iOS的移动演示示例。
  3. Xcode 打开 EditorWebViewDemo.xcodeproj 项目,以修改此示例的代码片段,使DMS能够正常工作。
  4. 创建一个空的 html 文件。用演示项目 editor.html 资源作模板。

  5. 添加 div 元素,如下所示:

    <div id="placeholder"></div>
    
  6. 使用将用于您的网站的 JavaScript API 指定您的 ONLYOFFICE 文档服务器链接:

    <script type="text/javascript" src="https://documentserver/web-apps/apps/api/documents/api.js"></script>
    

    其中, documentserver 是安装了ONLYOFFICE 文档服务器的服务器的名称。

  7. 使用要打开的文档的配置添加脚本,初始化div元素的文档编辑器:添加脚本指定你想打开的文档,为 div 元素初始化 文档编辑器

    window.docEditor = new DocsAPI.DocEditor("placeholder",
        {
            {external_config},
            "type": "mobile",
            "events": {
                "onAppReady": onAppReady,
                "onDocumentReady": onDocumentReady,
                "onDownloadAs": onDownloadAs,
                "onError": onError,
                "onInfo": onInfo,
                "onRequestClose": onRequestClose,
                "onRequestInsertImage": onRequestInsertImage,
                "onRequestUsers": onRequestUsers,
                "onWarning": onWarning,
            }
        });
    
  8. 要开始处理文档,请通过WKWebView组件在移动设备上显示ONLYOFFICE编辑器。 为此,请指定 EditorViewController 控制器。向编辑器请求 editor.html 文件的URL, 获取其内容并用示例 samples.plist 文件中的配置替换 "{external_config}" 参数, 在这里,根据 API documentation Try page对所有示例配置进行分类:

    private func load() {
        guard let url = Bundle.main.url(forResource: "editor", withExtension: "html") else {
            return
        }
    
        var html = ""
    
        do {
            html = try String(contentsOf: url)
        } catch {
            print(error)
        }
    
        html = html.replacingOccurrences(of: "{external_config}", with: config ?? "")
        webView.loadHTMLString(html, baseURL: nil)
    }
    
    编辑器示例

    ONLYOFFICE编辑器示例

    EditorViewController 的完整代码可以在 这里找到。

  9. 在Xcode工具栏中,选择要运行应用程序的构建方案和设备。 然后,选择 Product -> Run,或单击项目工具栏中的 Run 按钮来构建和运行代码。
  10. 在应用程序的主屏幕上,选择 使用API配置 选项, 演示如何使用API文档和配置示例中描述的编辑器配置打开ONLYOFFICE移动web编辑器。
  11. 在下一页中,选择一个配置示例以在WKWebView组件中打开生成的HTML。

使用文档

要使用文档(打开、下载、插入图像、提及其他用户等),请使用API文档的事件和方法:

  1. 要跟踪事件并调用适当的方法,请通过 EditorEventsHandler 控制器以本地代码处理ONLYOFFICE编辑器的 事件, 然后将其委托给 EditorViewController处理:

    var delegate: EditorEventsDelegate?
    
    convenience init(configuration: WKWebViewConfiguration) {
        self.init()
       
        configuration.userContentController.add(self, name: EditorEvent.onDownloadAs.rawValue)
        ....
    }
    
    extension EditorEventsHandler: WKScriptMessageHandler {
        func userContentController(_ userContentController: WKUserContentController,
            didReceive message: WKScriptMessage)
        {
            let event = EditorEvent(rawValue: message.name)
    
            switch event {
            case .onDownloadAs:
                guard
                    let json = message.body as? [String: Any],
                    let fileType = json["fileType"] as? String,
                    let url = json["url"] as? String
                else { return }
    
                delegate?.onDownloadAs(fileType: fileType, url: url)
            ...
            }
        }
    }
    

    让我们以 onDownloadAs 事件为例。 在WKWebView配置期间,通过调用 configuration.userContentController.add(self, name: messageName),为特定消息的处理程序注册一个对象。 获取事件参数(文件类型和URL)并将事件委托给 EditorViewController处理:

    func onDownloadAs(fileType: String, url: String) {
        print("⚡ ONLYOFFICE Document Editor create file: \(url)")
    }
    
  2. 定义 callMethod 函数以从本地代码调用 API方法。它可以将字符串、布尔值或对象值作为参数。 此函数将方法名及其参数添加到带有JavaScript代码的字符串中,然后使用 evaluateJavaScript 方法运行WKWebView组件中的JavaScript:

    private func callMethod(function: String, arg: Bool) {
        let javascript = "window.docEditor.\(function)(\(arg))"
        webView.evaluateJavaScript(javascript, completionHandler: nil)
    }
    
    private func callMethod(function: String, arg: String) {
        let javascript = "window.docEditor.\(function)(\"\(arg)\")"
        webView.evaluateJavaScript(javascript, completionHandler: nil)
    }
    
    private func callMethod(function: String, arg: [String: Any]) {
        guard
            let json = try? JSONSerialization.data(withJSONObject: arg, options: []),
            let jsonString = String(data: json, encoding: .utf8)
        else {
            return
        }
    
        let javascript = "window.docEditor.\(function)(\(jsonString))"
        webView.evaluateJavaScript(javascript, completionHandler: nil)
    }
    

    EditorEventsHandler 的完整代码可以在 这里找到。

  3. 要显示下载和打印文档的结果,请使用 PreviewController 控制器。此控制器基于 QLPreviewController。 按文档的URL下载文档,并将 dataSourcedelegate 属性设置为 QLPreviewController

    func present(url: URL, in parent: UIViewController, complation: @escaping (() -> Void)) {
        download(url: url) { fileUrl in
            DispatchQueue.main.async {
                guard let fileUrl = fileUrl else {
                    complation()
                    return
                }
    
                self.fileUrl = fileUrl
    
                let quickLookController = QLPreviewController()
                quickLookController.dataSource = self
                quickLookController.delegate = self
    
                if QLPreviewController.canPreview(fileUrl as QLPreviewItem) {
                    quickLookController.currentPreviewItemIndex = 0
                    parent.present(quickLookController, animated: true, completion: nil)
                }
                complation()
            }
        }
    }
    

    PreviewController 的完整代码可以在 这里找到。

在本节中,我们将使用 GitHub上提供的Android手机演示范例,通过 WebView 查看集成过程。

基于ONLYOFFICE测试范例的集成

此示例演示了如何将ONLYOFFICE移动web编辑器与ONLYOFFICE 测试或DMS范例集成。

通过测试范例实现Android集成

打开ONLYOFFICE编辑器

  1. 下载并安装ONLYOFFICE 文档 企业开发者 版本。
  2. GitHub下载Android手机演示范例。
  3. 使用 Android Studio 打开顶层 build.gradle 文件,修改此示例的代码片段,以便DMS正常工作。
  4. 要显示DMS的主页,请在模块级 build.gradle 文件的 DOCUMENT_SERVER_URL 属性中指定文档服务器web界面的地址。

    buildConfigField("String", "DOCUMENT_SERVER_URL", "https://documentserver/")
    

    其中, documentserver 是安装了ONLYOFFICE 文档服务器的服务器的名称。

    如果指定了 DOCUMENT_SERVER_URL ,则会加载DMS主页。否则,会发生错误:

    private fun showDialog() {
        AlertDialog.Builder(requireContext())
        .setMessage("Document server url is empty.\nYou must specify the address in build.gradle")
        .setPositiveButton("Ok") { dialog, _ ->
            dialog.dismiss()
            requireActivity().finish()
        }
        .create()
        .show()
    }
    
    Android错误

    未指定DocumentServerURL

    Android管理

    已指定DocumentServerURL

  5. 使用 MainFragment.kt 控制器在Android设备上正确打开编辑器。 在此控制器中,定义通过WebView组件打开文档的函数。 请求URL并检查它是否包含 "editor" 字符串,这个字符串指定将要打开的文档:

    private class MainWebViewClient(private val navController: NavController) : WebViewClient() {
    
        override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
            val url = request?.url
            if (url != null) {
                val path = url.path
                if (path?.contains("editor") == true) {
                    navController.navigate(R.id.action_mainFragment_to_editorFragment, Bundle(1).apply {
                        putString("document_url", url.toString())
                    })
                    return true
                }
                return false
            }
            return super.shouldOverrideUrlLoading(view, request)
        }
    
    }
    

    MainFragment.kt 的完整代码,可以在 这里找到。

  6. 要开始处理文档,请通过WebView组件在移动设备上显示ONLYOFFICE编辑器。 为此,在 EditorFragment.kt 控制器中设置WebView和布局如下:

    @SuppressLint("SetJavaScriptEnabled")
    private fun setSettings() {
        webView?.settings?.apply {
            javaScriptEnabled = true
            javaScriptCanOpenWindowsAutomatically = true
            loadWithOverviewMode = true
            cacheMode = WebSettings.LOAD_NO_CACHE
            domStorageEnabled = true
        }
        webView?.webViewClient = EditorWebViewClient(findNavController())
    }
    
  7. 在Android Studio工具栏中,选择应用程序和运行应用程序的设备。 然后,单击项目工具栏中的 Run 按钮来构建和运行代码。
  8. 该应用程序将被打开,以演示一个将ONLYOFFICE移动web编辑器与ONLYOFF测试或DMS范例集成的示例。

关闭ONLYOFFICE编辑器

使用 EditorFragment.kt 控制器退出编辑器:

private class EditorWebViewClient(private val navController: NavController) : WebViewClient() {

    override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
        request?.url?.let { url ->
            if (!url.toString().contains("editor")) {
                navController.popBackStack()
                return true
            }
        }
        return super.shouldOverrideUrlLoading(view, request)
    }

}

EditorFragment.kt 的完整代码可以在 这里找到。