关于使用 `handleInApp` WorkoutIntentResponseCode Siri 总是说“对不起,你需要在 App 中继续”,这与已弃用的 `continueInApp` 不同

Posted

技术标签:

【中文标题】关于使用 `handleInApp` WorkoutIntentResponseCode Siri 总是说“对不起,你需要在 App 中继续”,这与已弃用的 `continueInApp` 不同【英文标题】:on using `handleInApp` WorkoutIntentResponseCode Siri always says "Sorry,you'll need to continue in App" unlike deprecated `continueInApp` 【发布时间】:2017-10-26 18:31:52 【问题描述】:

我正在尝试将 Siri WorkOut 意图集成到我的应用程序中。我遇到了奇怪的错误。

class StartWorkOutRequestHandling : NSObject, INStartWorkoutIntentHandling 
    func handle(startWorkout intent: INStartWorkoutIntent, completion: @escaping (INStartWorkoutIntentResponse) -> Void) 
        if let _ = intent.workoutName 
            if #available(iosApplicationExtension 11.0, *) 
                let userActivity = NSUserActivity(activityType: "test")
                let response = INStartWorkoutIntentResponse(code: .handleInApp, userActivity: userActivity)
                completion(response);
            
            else 
                // Fallback on earlier versions
                let userActivity = NSUserActivity(activityType: "test")
                let response = INStartWorkoutIntentResponse(code: .continueInApp, userActivity: userActivity)
                completion(response)
            

        
        else 
            let response = INStartWorkoutIntentResponse(code: .failureNoMatchingWorkout, userActivity: .none)
            completion(response);
        
    

正如您在handle(startWorkout 中看到的那样,我正在检查iOS 版本是否为11 或更高,如果是,我使用handleInApp 响应代码,如果不是,我使用continueInApp。这是因为

public enum INStartWorkoutIntentResponseCode : Int 的定义说

@available(iOS,引入:10.0,弃用:11.0,消息: “INStartWorkoutIntentResponseCodeContinueInApp 在 iOS 上已弃用。 请改用 INStartWorkoutIntentResponseCodeHandleInApp") 案例 continueInApp

我知道.handleInApp 在后台打开应用程序,而continueInApp 打开应用程序。

但是当我使用 handleInApp 并向 Siri 说“使用我的 AppName 开始锻炼”时,Siri 会说

“抱歉,您需要在应用中继续”

并提供一个 Open MyApp 按钮。另一方面,如果我简单地使用

    func handle(startWorkout intent: INStartWorkoutIntent, completion: @escaping (INStartWorkoutIntentResponse) -> Void) 
    if let _ = intent.workoutName 
        let userActivity = NSUserActivity(activityType: "test")
        let response = INStartWorkoutIntentResponse(code: .continueInApp, userActivity: userActivity)
        completion(response);
    
    else 
        let response = INStartWorkoutIntentResponse(code: .failureNoMatchingWorkout, userActivity: .none)
        completion(response);
    

忽略警告 Siri 按预期打开应用程序。值得注意的是两种情况

- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
 restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler 
    //this is a legacy app hence part of code is still in Objective-C
 

应用程序委托方法被正确调用。

虽然我在这里发现了类似的问题

Siri always responds 'Continue in the app' when starting workout with SiriKit

但它使用已弃用的 continueInApp。所以不能在 iOS 11 中使用它。

我在这里犯了什么错误?为什么使用handleInApp 打不开应用,为什么Siri 抱怨我需要在应用中继续!如何使用handleInApp打开应用。

如果我不应该在使用锻炼意图时从 Siri 打开应用程序,我相信也无法为锻炼意图触发IntentUI。 参考:SiriKit, How to display response for start Workout Intent?

请帮忙。

【问题讨论】:

【参考方案1】:

请检查这个.....

func handle(intent: INStartWorkoutIntent, completion: @escaping (INStartWorkoutIntentResponse) -> Void) 

        if let _ = intent.workoutName 
            let userActivity = NSUserActivity(activityType: "test")
            let response = INStartWorkoutIntentResponse(code: INStartWorkoutIntentResponseCode(rawValue: 2)!, userActivity: userActivity)
            completion(response);
        
        else 

            let response = INStartWorkoutIntentResponse(code: INStartWorkoutIntentResponseCode(rawValue: 6)!, userActivity: .none)
            completion(response);
        
    

【讨论】:

感谢您发布答案。生病看看并恢复。现在我已经赞成你的回答:) +1

以上是关于关于使用 `handleInApp` WorkoutIntentResponseCode Siri 总是说“对不起,你需要在 App 中继续”,这与已弃用的 `continueInApp` 不同的主要内容,如果未能解决你的问题,请参考以下文章

Clojure HoneySQL - 如何在连接后将字符串值聚合到单行中?

关于go mod 的使用和goland 配置关于go mod 的配置

关于maven的使用--还债篇

关于eval()的使用问题

主页链接发送到关于/关于页面无法回家

关于“使用 Android 播放任意音调”