【问题标题】:How to navigate Share Extension to host app in Swift?如何在 Swift 中导航共享扩展以托管应用程序?
【发布时间】:2019-07-23 23:35:55
【问题描述】:

ShareExtension 获取 URL 后,如何在 Swift 中导航共享扩展以托管应用程序?

import UIKit
import Social
import MobileCoreServices

class ShareViewController: UIViewController {

    let sharedKey = "shareappKey"

    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationItem.title = "Picked URL"        
        getURL()
    }

    @IBAction func nextAction(_ sender: Any) {

        self.redirectToHostApp()
    }

    @IBAction func cancelAction(_ sender: Any) {

        self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
    }

    func redirectToHostApp() {

        let url = URL(string: "SelectedURL:\(sharedKey)")
        var responder = self as UIResponder?
        let selectorOpenURL = sel_registerName("openURL:")
        while (responder != nil) {
            if (responder?.responds(to: selectorOpenURL))! {
                let _ = responder?.perform(selectorOpenURL, with: url)
            }
            responder = responder!.next
        }
        self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
    }

    func getURL() {

        if let item = extensionContext?.inputItems.first as? NSExtensionItem {
            if let itemProvider = item.attachments?.first {
                if itemProvider.hasItemConformingToTypeIdentifier("public.url") {
                    itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil, completionHandler: { (url, error) -> Void in

                        if let error = error {
                            print("error :-", error)
                        }
                        if (url as? NSURL) != nil {
                            // send url to server to share the link
                            do {
                                if (url as? URL) != nil {
                                    // do what you want to do with shareURL
                                    print("Selected URL :- ", url as Any)
                                    print(url as Any)

                                    let dict: [String : Any] = ["imgData" :  url as Any, "name" : "Added" as Any]
                                    print(dict)
                                    let userDefault = UserDefaults.init(suiteName: "group.com.abcd.shareapp")
                                    userDefault?.set(dict, forKey: self.sharedKey)
                                    userDefault?.synchronize()

                                   // Here I got Struct 
                                }
                            }catch let err{
                                print(err)
                            }
                        }
                        self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil)
                    })
                }
            }
        }
    }    
}


// Host App
import UIKit

class ViewController: UIViewController {

    var urlString = String()

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let userDefault = UserDefaults.standard
        userDefault.addSuite(named: "group.com.abcd.shareapp")

        if let dict = userDefault.value(forKey: "img") as? NSDictionary{

            let data = dict.value(forKey: "imgData") as! Data
            let str = dict.value(forKey: "name") as! String
            print("Data is :- ", data)
            print("Str is :- ", str)
            userDefault.removeObject(forKey: "img")
            userDefault.synchronize()

            // Here i need to get that URL from Share Extention
        }
    }
}

错误

2019-07-15 22:01:15.045361+0530 LearningAppShare[3183:73775] [用户 默认值] 尝试设置非属性列表对象 { imgData = "https://m.jagran.com/lite/cricket/headlines-sachin-tendulkar-son-arjun-tendulkar-picked-for-rs-5-lakh-for-t20-mumbai-league-19192257.html"; 名称=添加; } 作为密钥 URLKey 的 NSUserDefaults/CFPreferences 值 2019-07-15 22:01:15.047424+0530 LearingAppShare[3183:73775]


由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'尝试插入非属性 列表对象{ imgData = "https://m.jagran.com/lite/cricket/headlines-sachin-tendulkar-son-arjun-tendulkar-picked-for-rs-5-lakh-for-t20-mumbai-league-19192257.html"; 名称=添加; } 用于密钥 URLKey'

【问题讨论】:

    标签: ios swift slcomposeviewcontroller


    【解决方案1】:

    我已经回答了自己的问题。

    您可以存储在字典中。 但 UserDefaults 无法保存具有自定义数据类型(如 Image 或 URL)的字典。 因此,您需要先将字典转换为数据,然后再保存为默认值

    import UIKit
    import Social
    import MobileCoreServices
    
    class ShareViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.navigationItem.title = "Picked URL"        
            getURL()
        }
    
        @IBAction func nextAction(_ sender: Any) {
    
            self.redirectToHostApp()
        }
    
        @IBAction func cancelAction(_ sender: Any) {
    
            self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
        }
    
        func redirectToHostApp() {
    
            let url = URL(string: "YourOwnURLscheme:\(sharedKey)")
            var responder = self as UIResponder?
            let selectorOpenURL = sel_registerName("openURL:")
            while (responder != nil) {
                if (responder?.responds(to: selectorOpenURL))! {
                    let _ = responder?.perform(selectorOpenURL, with: url)
                }
                responder = responder!.next
            }
            self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
        }
    
        func getURL() {
    
            if let item = extensionContext?.inputItems.first as? NSExtensionItem {
                if let itemProvider = item.attachments?.first {
                    if itemProvider.hasItemConformingToTypeIdentifier("public.url") {
                        itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil, completionHandler: { (url, error) -> Void in
                            if let error = error {
                                print("error :-", error)
                            }
                            if (url as? NSURL) != nil {
                                // send url to server to share the link
                                                        do {
                                var urlData: Data!
                                if let url = url as? URL{
                                    urlData = try Data(contentsOf: url)
                                }
                                let dict: [String : Any] = ["urlData" :  urlData as Any, "name" : self.contentText as Any]
                                print(dict)
                                let userDefault = UserDefaults(suiteName: "group.com.abcd.sharecontent1")
                                userDefault?.set(dict, forKey: "storedURLData")
                                userDefault?.synchronize()
                            }catch let err{
                                print(err)
                            }
                           }
                        })
                    }
                }
            }
        }    
    }
    
    
    // Host App
    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet var imgView: UIImageView!
        @IBOutlet var lblText: UILabel!
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
    
            let userDefault = UserDefaults(suiteName: "group.com.abcd.sharecontent1")
    
            if let dict = userDefault?.value(forKey: "storedURLData") as? NSDictionary{
    
                let data = dict.value(forKey: "urlData") as! Data
                let str = dict.value(forKey: "name") as! String
                print("Data is :- ", data)
                print("str is :- ", str)
    
                self.lblText.text = str
    
                userDefault?.removeObject(forKey: "storedURLData")
                userDefault?.synchronize()
            }
        }
    }
    

    【讨论】:

    • 它是否适用于多个图像?对我来说,如果有多个图像,它会在主机应用程序内返回 nil。
    • @SantoshSingh 我没有检查多个图像。也许如果您现在已经完成,请在添加另一个答案部分提供代码。它会帮助某人。
    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    相关资源
    最近更新 更多