Показывать изображения в пользовательском интерфейсе Intents с помощью SiriKit

Я разрабатываю простой поиск фотографий с помощью SiriKit. Я могу искать и отображать изображения в главном viewcontroller, но не могу отображать изображения в интерфейсе Intents с помощью инфраструктуры Intents UI. Я следовал этому руководству, но в нем отсутствует реализация интерфейса Intents. Вот что я сделал до сих пор.

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
        })
    }
}

Нужно ли писать какой-либо дополнительный код внутри метода handle файла IntentHandler.swift, чтобы показывать изображения с помощью Intents UI? Я не хочу продолжать в приложении, на самом деле я хочу получить результаты в интерфейсе Intents. Заранее спасибо.

1 ответ

Решение

Хорошо. Я нашел это в документации Apple.

Вы можете предоставить расширение Intents UI, если вы поддерживаете намерения в следующих доменах:

Messaging

Payments

Ride booking

Workouts

Что указывает на то, что я не могу использовать Intents UI для поиска фотографий.

Другие вопросы по тегам