我正在使用SiriKit开发一个简单的照片搜索。我可以在主ViewController上搜索和显示图像,但不能使用IntentsUI框架在Intents UI上显示图像。我遵循了这个tutorial,但是它缺少Intents UI实现。这是我到目前为止所做的。

IntentHandler.swift

class IntentHandler: INExtension, INSearchForPhotosIntentHandling {

    override func handler(for intent: INIntent) -> Any {

        return self
    }

    // MARK: - INSearchForPhotosIntentHandling

    func resolveDateCreated(forSearchForPhotos intent: INSearchForPhotosIntent, with completion: @escaping (INDateComponentsRangeResolutionResult) -> Void) {

        if intent.dateCreated != nil {
            completion(INDateComponentsRangeResolutionResult.success(with: intent.dateCreated!))
        }
        else{
            completion(INDateComponentsRangeResolutionResult.needsValue())
        }
    }


    func confirm(searchForPhotos intent: INSearchForPhotosIntent, completion: @escaping (INSearchForPhotosIntentResponse) -> Void) {

        let response = INSearchForPhotosIntentResponse(code: .ready, userActivity: nil)
        completion(response)
    }

    func handle(searchForPhotos intent: INSearchForPhotosIntent, completion: @escaping (INSearchForPhotosIntentResponse) -> Void) {
        let response = INSearchForPhotosIntentResponse(code:.continueInApp,userActivity: nil)

        if intent.dateCreated != nil {
            let calendar = Calendar(identifier: .gregorian)
            let startDate = calendar.date(from:(intent.dateCreated?.startDateComponents)!)
            response.searchResultsCount = photoSearchFrom(startDate!)

        }
        completion(response)
    }


    // MARK: - Search Photos

    func photoSearchFrom(_ startDate: Date) -> Int {

        let fetchOptions = PHFetchOptions()
        fetchOptions.predicate = NSPredicate(format: "creationDate >= %@", startDate as CVarArg)

        let fetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image,
                                              options: fetchOptions)
        return fetchResult.count
    }

}

AppDelegate.Swift
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {

        // implement to handle user activity created by Siri or by our SiriExtension
        let viewController = self.window?.rootViewController as! PhotoViewController
        viewController.handleActivity(userActivity)

        return true
    }
}

PhotoViewController.swift
class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        INPreferences.requestSiriAuthorization { (status) in
            print(status)
        }
    }

    func handleActivity(_ userActivity: NSUserActivity) {

        let intent = userActivity.interaction?.intent as! INSearchForPhotosIntent

        if (intent.dateCreated?.startDateComponents) != nil {
            let calendar = Calendar(identifier: .gregorian)
            let startDate = calendar.date(from:(intent.dateCreated?.startDateComponents)!)

            self.displayPhoto(startDate!)
        }
    }


    func displayPhoto(_ startDate: Date) {

        let fetchOptions = PHFetchOptions()
        fetchOptions.predicate = NSPredicate(format: "creationDate >= %@", startDate as CVarArg)
        let fetchResult = PHAsset.fetchAssets(with:
            PHAssetMediaType.image, options: fetchOptions)

        let imgManager = PHImageManager.default()

        imgManager.requestImage(for: fetchResult.firstObject! as PHAsset,
                                targetSize: view.frame.size,
                                contentMode: PHImageContentMode.aspectFill,
                                options: nil,
                                resultHandler: { (image, _) in
                                    self.imageView.image = image
        })
    }
}

现在出现了 IntentViewController.swift
class IntentViewController: UIViewController, INUIHostedViewControlling {

    @IBOutlet weak var imageView:UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        INPreferences.requestSiriAuthorization { (status) in
            print("From IntentViewController: \(status)")
        }
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        print("IntentViewController-> viewDidLoad")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - INUIHostedViewControlling

    // Prepare your view controller for the interaction to handle.
    func configure(with interaction: INInteraction!, context: INUIHostedViewContext, completion: ((CGSize) -> Void)!) {

        print("From configure")

        let intent = interaction?.intent as! INSearchForPhotosIntent

        if (intent.dateCreated?.startDateComponents) != nil {
            let calendar = Calendar(identifier: .gregorian)
            let startDate = calendar.date(from:(intent.dateCreated?.startDateComponents)!)
            self.displayPhoto(startDate!)
        }

        if let completion = completion {
            completion(self.desiredSize)
        }
    }

    var desiredSize: CGSize {
        return self.extensionContext!.hostedViewMaximumAllowedSize
    }

    func displayPhoto(_ startDate: Date) {

        let fetchOptions = PHFetchOptions()
        fetchOptions.predicate = NSPredicate(format: "creationDate >= %@", startDate as CVarArg)
        let fetchResult = PHAsset.fetchAssets(with:
            PHAssetMediaType.image, options: fetchOptions)

        let imgManager = PHImageManager.default()

        imgManager.requestImage(for: fetchResult.firstObject! as PHAsset,
                                targetSize: view.frame.size,
                                contentMode: PHImageContentMode.aspectFill,
                                options: nil,
                                resultHandler: { (image, _) in
                                    self.imageView.image = image
        })
    }
}

我是否需要在IntentHandler.swift文件的handle方法内编写任何其他代码才能使用Intents UI显示图像?我不想继续在应用程序中运行,实际上我想在Intents UI中获得结果。提前致谢。

最佳答案

好。我在苹果documentation上找到它。

如果您支持Intent,则可以提供Intents UI扩展
在以下领域:

Messaging

Payments

Ride booking

Workouts

这表示我无法使用Intents UI进行照片搜索。

10-06 10:20