티스토리 뷰

반응형

 

제곧내

 

# SiriKit 간단 정의

- 사용자가 음성, intelligent suggestions, 개인화된 workflow를 통해 디바이스와 상호작용 할 수 있도록 도와주는 프레임워크.

그렇다고 SiriKit이렇게 있는게 아니고, 실제 프레임워크 이름은 IntentsIntentsUI다.

 

Donating Shortcuts

Siri는 사용자가 앱을 사용하여 수행할 수 있는 작업에 대한 shortcuts을 예측하고

Spotlight 검색, 잠금 화면 및 Siri watch face와 같은 위치에서 사용자에게 이러한 shortcuts을 제안할 수 있다.

Siri는 앱이 Siri에 donation한 것을 기반으로 앱에서 사용할 수 있는 shortcuts에 대해 학습한다.

 

# 오늘 해볼것

단축어 > 갤러리 탭 > 사용자의 앱으로 만들 수 있는 단축어

보면 이렇게 미리 만들어진(?) 단축어가 있다. 

내 앱애도 이걸 추가해보자.

NSUserActivity 와 INIntent로 하는 방법이 있는데, 일단은 NSUserActivity로 해볼 것. 

 

1. import Intents

import Intents

2. NSUserActivity만들기

let activity = NSUserActivity(activityType: "com.zedd.shortcuts.bookmark")
activity.title = "북마크 보기" // 🚨 반드시 title을 지정해줘야한다. 🚨

3. INShortcut만들기

let suggestions = INShortcut(userActivity: activity)

4. INVoiceShortcutCenter에 만든 activity setting해주기

INVoiceShortcutCenter.shared.setShortcutSuggestions([suggestions])

 

대충 어떤 느낌인지만 알면 됨 (전체 코드는 밑에 있음)

 

# 결과

(아니 이게 이렇게 쉽게 되는거였다니..)

 

# 개선

왼쪽 카뱅, 오른쪽 내 앱...단축어 이름이 채워져있지 않아 Siri에 추가가 활성화가 안되어있음.

let activity = NSUserActivity(activityType: "com.zedd.someActivity")
activity.title = "북마크 보기"
activity.suggestedInvocationPhrase = "응 북마크 실행해" ✅

suggestedInvocationPhrase을 지정해주면 된다. 

으음 편안

 

# 단축어 실행

뭐 이렇게 추가가 됐을텐데, 이걸 누르면 

앱 실행 ➞ Navigation을 하여 보여주고 싶은 화면 보여준다.

그냥 iOS Search API - CoreSpotlight에서 했던거랑 똑같이 하면됨;;


[AppDelegate]

func application(UIApplication, continueUserActivity 
				 userActivity: NSUserActivity, 
				 restorationHandler: [AnyObject]? -> Void) -> Bool { }

 

[SceneDelegate]

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    // code
}

 

나는 SceneDelegate니깐...SceneDelgate에서 해주겠음. 

 

 

그냥 이런식..userActivity.activityType은 아까 

let activity = NSUserActivity(activityType: "com.zedd.shortcuts.bookmark")
activity.title = "북마크 보기" // 🚨 반드시 title을 지정해줘야한다. 🚨

에서 지정해준 "com.zedd.shortcuts.bookmark"이다.

 

[ShortcutsSuggestionProvider] 전체 코드

 

 

suggestion이 여러개인 경우 때문에 enum으로 했는데 이건 편한 방식대로 하면 될듯

나는 싱글톤으로 만들어서

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        ShortcutsSuggestionProvider.shared.setup() ✅
        return true
}

AppDelegate의 didFinishLaunchingWithOptions에서 호출해줌. 

헉 근데 지금 보니 딱히 싱글톤이어야 하는 이유는 없을 듯;;;;

 

# SceneDelegate사용시 주의할 점 

🚨 iOS Search API - CoreSpotlight 에서와 똑같이, 

앱이 background에 없음 ➞  단축어를 이용해 앱 실행 ➞ scene(_ scene: UIScene, continue userActivity:) 메소드가 안불림이슈가 있으므로 

 

 

이렇게 해줘야한다. 

 

# 단축어 실행 결과 

(노란색ViewController가 위 코드에서 SecondViewController임)

 

끝~~

 

 

이렇게 NSUserActivity로 쉽게 되는지 몰랐어요 OTL...

2019년도 쯤에 그때도 똑같이zzzzzzz카뱅이 추가한거 보면서 했었는데 그때는 INIntent로 했었거든요...

그때 왜 안되는지 이해를 못하고 글이 묻혔는데, 지금보니 왜 안되는지 알것 같네요 ㅎㅎ..밥팅

다음에는 INIntent로 해봐야지! ~.~

반응형