"사용자의 앱으로 만들 수 있는 단축어"에 내 앱 추가하기 with NSUserActivity
제곧내
# SiriKit 간단 정의
- 사용자가 음성, intelligent suggestions, 개인화된 workflow를 통해 디바이스와 상호작용 할 수 있도록 도와주는 프레임워크.
그렇다고 SiriKit이렇게 있는게 아니고, 실제 프레임워크 이름은 Intents와 IntentsUI다.
# 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로 해봐야지! ~.~