2
-(void)viewDidLoad {

    [super viewDidLoad];

    NSExtensionItem *item = self.extensionContext.inputItems[0];
    NSItemProvider *itemProvider = item.attachments[0];
     NSLog(@"%@",itemProvider);

    if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypePlainText])
    {    
        [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypePlainText options:nil completionHandler:^(NSString *item, NSError *error)
        {       
            if (item)
            {
                textString=item;    
            }
        }];
    }

I am using share extension in my app. I am using it as a subclass of a UIViewController not SLcomposer.In the viewDidLoad i am trying to access the text in the page from NSItemProvider,But it has only one key which is public url , Can anybody give me an idea of how to achieve the kUTTypePlainText in NSItemProvider. I also set NSExtensionActivationSupportsText, its type to Boolean, and the value to YES

hacker
  • 8,919
  • 12
  • 62
  • 108

2 Answers2

7

You can use the ExtensionPreprocessingJS to do this.

First, add the the NSExtensionJavaScriptPreprocessingFile key to the NSExtensionAttributes dictionary in your Info.plist. The value should be the name of your JavaScript file without the extension, i.e. MyExtensionJavaScriptClass.

Then, in the NSExtensionActivationRule dictionary in your Info.plist, set the NSExtensionActivationSupportsWebPageWithMaxCount key with a value of 1 (type Number).

Next, add MyExtensionJavaScriptClass.js to your extension with the following code:

var MyExtensionJavaScriptClass = function() {};

MyExtensionJavaScriptClass.prototype = {
    run: function(arguments) {
       arguments.completionFunction({"title": document.title});
    } 
};

// The JavaScript file must contain a global object named "ExtensionPreprocessingJS".
var ExtensionPreprocessingJS = new MyExtensionJavaScriptClass;

Then include the following function in your ShareViewController viewDidLoad and import MobileCoreServices

    let extensionItem = extensionContext?.inputItems.first as! NSExtensionItem
    let itemProvider = extensionItem.attachments?.first as! NSItemProvider

    let propertyList = String(kUTTypePropertyList)
    if itemProvider.hasItemConformingToTypeIdentifier(propertyList) {
        itemProvider.loadItemForTypeIdentifier(propertyList, options: nil, completionHandler: { (item, error) -> Void in
            let dictionary = item as! NSDictionary
            NSOperationQueue.mainQueue().addOperationWithBlock {
                let results = dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as! NSDictionary
                let title = results["title"] as! String                                        
                //yay, you got the title now
            }
        })
    } else {
        print("error")
    }
ryanman
  • 3,794
  • 3
  • 25
  • 15
William Ku
  • 798
  • 5
  • 17
0

I guess you've to request the site using the provided URL, parse the content and get the title from that string.

BTW: Apple Documentation say:

If your Share or iOS Action extension needs to access a webpage, you must include the NSExtensionActivationSupportsWebPageWithMaxCount key with a nonzero value

See the section "Accessing a Webpage"

Sal
  • 1,230
  • 13
  • 21