Search code examples
iosobjective-cswiftuiactivityviewcontrollerios8-extension

How to include an Objective-C Extension in my Swift ActivityViewController?


I have included the 1Password extension in my Browser app by following this question.

However, I already have an iOS 8 Share Sheet (ActivityViewController) on my app and would like to include the 1Password inside this share sheet inside of using it's own. My app is in Swift but the 1Password is in Objective-C.

Here's the code I'm using for the ActivityViewController:

@IBAction func _shareButton(sender: UIButton) {

    var shareContent = _searchBar.text

    if let myWebsite = NSURL(string: "\(_searchBar.text)")
    {
        let objectsToShare = [myWebsite]
        let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
        if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
            // The app is running on an iPad, so you have to wrap it in a UIPopOverController
            var popOver: UIPopoverController = UIPopoverController(contentViewController: activityVC)
            let rect = CGRect(origin: CGPoint(x: 559, y: 44), size: CGSize(width: 38, height: 32))
            // if your "share" button is a UIBarButtonItem
            popOver.presentPopoverFromRect(rect, inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)

        } else {
            self.presentViewController(activityVC, animated: true, completion: nil)

        }
    }
}

And here's how the 1Password Extension code:

@IBAction func onePasswordButton(sender: AnyObject) {
    OnePasswordExtension.sharedExtension().fillItemIntoWebView(self._webView, forViewController: self, sender: sender, showOnlyLogins: false, completion: {(Bool) in
        // error handling
    })
}

I tried using the code for the extension in the applicationActivities part of the UIActivityViewController, but it doesn't work (Build Failed).

Is it possible to have the 1Password extension inside the ActivityViewController?

Thanks,

PastaCoder


Solution

  • I have contacted Rad Azzouz from AgileBits Support through Github (you can find the detailed issue here) and we managed to solve the issue.

    Here is the code used for the ActivityViewController with the 1Password extension.

    @IBAction func showShareSheet(sender: AnyObject) -> Void {
        var onePasswordExtension = OnePasswordExtension.sharedExtension()
    
        // Create the 1Password extension item.
        onePasswordExtension.createExtensionItemForWebView(self.webView, completion: {(extensionItem, error) -> Void in
            if extensionItem == nil {
                println("Failed to create an extension item: <%@>", error)
                return
            }
            // Initialize the 1Password extension item property
            self.onePasswordExtensionItem = extensionItem
    
            var activityItems: NSArray = [ self ]; // Add as many custom activity items as you please
    
            // Setting up the activity view controller
            var activityViewController = UIActivityViewController(activityItems: activityItems as [AnyObject], applicationActivities: nil)
    
            if sender.isKindOfClass(UIBarButtonItem) {
                self.popoverPresentationController?.barButtonItem = sender as! UIBarButtonItem
            }
            else if sender.isKindOfClass(UIView) {
                self.popoverPresentationController?.sourceView = sender.superview
                self.popoverPresentationController?.sourceRect = sender.frame
            }
    
            activityViewController.completionWithItemsHandler = {(activityType, completed, returnedItems, activityError) -> Void in
                if onePasswordExtension.isOnePasswordExtensionActivityType(activityType) {
                    if (returnedItems.count > 0) {
                        onePasswordExtension.fillReturnedItems(returnedItems, intoWebView: self.webView, completion: { (success, returnedItemsError) -> Void in
                            if success == false {
                                println("Failed to fill login in webview: <%@>", returnedItemsError)
                            }
                        })
                    }
                    else {
                        // Code for other custom activity types
                    }
                }
            }
    
            self.presentViewController(activityViewController, animated: true, completion: nil)
        })
    }