如何与我的应用程序共享所选文本?

时间:2017-07-09 09:30:49

标签: ios objective-c mobile share

我想让我的应用程序出现在UIActivityViewController中以进行文本共享,例如Mail,iMessage,Notes,Gmail等等。

例如,当用户点击所选文字并点击附件中的任何应用中的“分享”按钮时:

For example, when user tapback on selected text and hit the 'Share' button like in the attachment.

我希望我的应用程序出现在UIActivityViewController中,当用户选择我的应用程序时,启动它可以处理所选文本。

所以我尝试过: 在Apple文档中搜索。

  • 搜索相关的UTI但我明白UTI仅用于文件,而不是用于简单的NSString(如果我错了,请纠正我)。
  • 我试图实现Share Extension,但这不是我想要的解决方案,我不需要post弹出窗口,而且我需要在Mail,Notes,iMessage之后共享后启动我的应用程序(关于Apple文档,我们无法仅通过今日扩展程序通过共享扩展启动包含应用程序。)
  • 当然,我在StackOverFlow中搜索了很多。

那么任何解决方案? 谢谢!

1 个答案:

答案 0 :(得分:1)

假设您已经有一些应用。

  1. 添加目标文件->新建->目标。在 在左窗格中,从iOS部分中选择应用程序扩展, 选择动作扩展,然后点击下一步
  2. 设置产品名称。确保操作类型当前用户界面。点击完成
  3. Project Navigator 中,展开扩展程序组,然后单击 MainInterface.storyboard 。选择图像视图并将其替换为UITextView。创建并绑定@IBOutlet弱变量。
  4. 选择扩展的 Info.plist ,导航到 NSExtension-> NSExtensionAttributes-> NSExtensionActivationRule 。将 NSExtensionActivationRule 的类型从String更改为Dictionary。展开字典后,单击其旁边的+按钮。这将添加一个子密钥。将其名称设置为 NSExtensionActivationSupportsText ,将其类型设置为Boolean,并将值设置为 YES 。这样可以确保仅在至少一个输入项包含文本时才显示操作扩展。
  5. 将此代码放入 ActionViewController.swift

_

import UIKit
import MobileCoreServices
class ActionViewController: UIViewController {

    @IBOutlet weak var textView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Get the item[s] we're handling from the extension context.
        
        var textFound = false
        for item in self.extensionContext!.inputItems as! [NSExtensionItem] {
            for provider in item.attachments! {
                if provider.hasItemConformingToTypeIdentifier(kUTTypePlainText as String) {
                    // This is an plain Text.
                    weak var weakTextView = self.textView
                    provider.loadItem(forTypeIdentifier: kUTTypePlainText as String, options: nil, completionHandler: { (textItem, error) in
                        OperationQueue.main.addOperation {
                            if let strongTextView = weakTextView {
                                if let gotText = textItem as? String {
                                    strongTextView.text = gotText
                                    // do what you need with the text
                                }
                            }
                        }
                    })
                    
                    textFound = true
                    break
                }
            }
            
            if (textFound) {
                // We only handle one text, so stop looking for more. You can do as you need.
                break
            }
        }
    }

    @IBAction func done() {
        // Return any edited content to the host app.
        // This template doesn't do anything, so we just echo the passed in items.
        self.extensionContext!.completeRequest(returningItems: self.extensionContext!.inputItems, completionHandler: nil)
    }
}