티스토리 뷰

반응형


안녕하세요 :) Zedd입니다.

오늘...그냥 폰을 보고있는데 신기....한 것을 발견했습니다.


네 1도 안신기하죠?

제가 3D Touch를 전혀ㅕㅕㅕㅕ사용하지 않아서....

저는....신기하다고 생각했어요.

근데 보통 제가 폰에 올리는 연습용? 앱들은 꾹 눌러도 저런게 하나도 안뜨더라구요.



 하지만 대부분의 앱?에 3D Touch를 하면

공유가 나오게 됩니다. 



이렇게요.


아무튼 해보고싶어서 도전






3D touch (포스터치) 사용해보기



일단 애플문서를 봅시다.

<애플문서> 또는 Adopting 3D Touch on iPhone 또는Information Property List Key Reference


일단 무슨소리인지 잘 모르겠는데.. Information Property List Key Reference에 잘 설명이 되어있는 것 같습니다.

간략하게 요약하자면, 위 그림과 같이 홈스크린에서 저렇게 꾸욱 눌러서 저렇게 나오는? 것이 
static Home screen quick actions이라고 합니다. 
이는 info.plist의 UIApplicationShortcutItems에 배열로 저장이 되어있습니다.
이 UIApplicationShortcutItems안에는 사전(Dictionary)가 있는데요,(즉 배열 안에 사전이 있다는 말)
각 사전에는 하나의 quick action과 그 사용방법에 대한 자세한 정보가 들어있습니다.

info.plist파일에서 정의한 static quick action은 파일에 나타나는 순서와 동일한 순서로 홈 화면에 표시됩니다.




이런식으로요.

여기에는 필수가 있고, 아닌게 있는데,


이 두가지가 필수(required)입니다.

하나씩 볼까요?


UIApplicationShortcutItemType : 사용자가 해당 quick action을 호출 할 때, 앱에 전달되는 문자열을 사용하여 quick action작업을 타입으로 분류한 다음, 수신한 작업 타입을 명확하게 구분 할 수 있습니다. 


UIApplicationShortcutItemTitle : quick action의 타이틀로, 홈스크린에서 사용자에게 표시되는 문자열입니다.타이틀이 너무 길고, UIApplicationShortcutItemSubtitle을 지정하지 않은경우, 타이틀이 두줄로 표시됩니다. 앱의 InfoPlist.strings파일을 사용하여 quick action 타이틀을 로컬라이징할 수 있습니다(선택사항) 


아하~~!~~!

그리고 필수가 아닌게 4가지가 있습니다. 볼까요? XD



UIApplicationShortcutItemSubtitle : 홈 스크린에서, 사용자에게 해당 타이틀 문자열 바로 아래에 표시되는 선택적(optional) 문자열(있어도 되고 없어도 된다.) quick action을 위한 Subtitle을 지정하면 시스템은 타이틀의 길이에 관계없이 한 줄에 quick action 타이틀을 표시합니다. UIApplicationShortcutItemTitle와 마찬가지로,InfoPlist.strings파일을 사용하여 quick action Subtitle을 로컬라이징할 수 있습니다(선택사항)

 

UIApplicationShortcutItemIconType : 시스템 제공 라이브러리의 아이콘 타입을 지정하는 선택적(optional)문자열. UIApplicationShortcutIcon class Reference의 UIApplicationShortcutIconType enum을 참고하세요. 아이콘은 quick action의 타이틀과 함께 홈 스크린에 표시됩니다. 


UIApplicationShortcutItemIconFile : 앱 번들에서 사용할 아이콘, 이미지 또는 Asset 카탈로그에서 이미지 이름을 지정하는 선택적 문자열입니다. 홈스크린의 quick action 타이틀 앞에 아이콘이 표시됩니다. 아이콘은 OS Human Interface Guidelines에 따라, 정사각형, 단일색상 및 35x35pt여야 합니다. 


UIApplicationShortcutItemUserInfo : 선택적(optional)인 앱 정의 사전(dictionary). 이 사전의 한가지 용도는 UIApplicationShortcutItem class Reference에 있는 "빠른 실행을 위한 응용 프로그램 시작 및 응용 프로그램 업데이트 고려 사항" 섹션에서 설명한대로, 응용프로그램 버전 정보를 제공하는 것입니다. 



ㅇㅇㅎㅇㅎㅇㅎㅇㅎ그렇군

우리 프로젝트에 적용해봅시다.


프로젝트 새로 만드시거나, 이미 있는 프로젝트 열어줍시다. 

그리고 info.plist로 가줍시다. 

그리고...막 이케이케 추가해주면 좋겠지만..소스코드가 더 편하니까..!!!

여기에 있는대로, 소스를 복사해서 info.plist에 붙혀줘봅시다.

<key>UIApplicationShortcutItems</key>

    <array>


        <dict>

            <key>UIApplicationShortcutItemIconFile</key>

            <string>open-favorites</string>

            <key>UIApplicationShortcutItemTitle</key>

            <string>Favorites</string>

            <key>UIApplicationShortcutItemType</key>

            <string>com.mycompany.myapp.openfavorites</string>

            <key>UIApplicationShortcutItemUserInfo</key>

            <dict>

                <key>key1</key>

                <string>value1</string>

            </dict>

        </dict>



        <dict>

            <key>UIApplicationShortcutItemIconType</key>

            <string>UIApplicationShortcutIconTypeCompose</string>

            <key>UIApplicationShortcutItemTitle</key>

            <string>New Message</string>

            <key>UIApplicationShortcutItemType</key>

            <string>com.mycompany.myapp.newmessage</string>

            <key>UIApplicationShortcutItemUserInfo</key>

            <dict>

                <key>key2</key>

                <string>value2</string>

            </dict>

        </dict>


    </array>

코드에서 보실 수 있듯이, 배열안에 사전이 있는 모습이네요.

필수가 아닌것들이 들어있긴 한데, 일단 실행해봅시다. 볼드체로 되어있는것이 필수입니다. 

그러면..!!



이렇게 홈스크린에서 quick action이 가능해지게 됩니다. 

여기서 궁금해진.....

info.plist파일에서 정의한 static quick action은 파일에 나타나는 순서와 동일한 순서로 홈 화면에 표시됩니다.


다며..근데 왜 반대..


Favorites가 먼저면 뭔가 위에..?맨 위에..?있어야 할 것 같은데..



맨 아래네요 :)....뭔가 맨 아래를 제일 처음으로 시작하나 봅니다. 

맞네요!!



스택구조인가봐요. info.plist에 있는 순서대로 들어가게 됩니다.  가장 밑에 있는 것이 top에 가게 되죠. ㅇㅎㅇㅎㅇㅎ

그리고 아까부터 상당히 거슬렸을텐데요,



New Message에는 아이콘이 있고, Favorites에는 뭔가 동그랗게 점이 있네요.

우리가 아까 info.plist에 추가한 소스코드 있죠? 잘 보면 둘이 뭔가 다른점이 있답니다.

        <dict>//Favorites

            <key>UIApplicationShortcutItemIconFile</key>

            <string>open-favorites</string>

        </dict>



        <dict>//New Message

            <key>UIApplicationShortcutItemIconType</key>

            <string>UIApplicationShortcutIconTypeCompose</string>

        </dict>

자, 다시한번 말씀드리지만 Favorites이 먼저 정의?되었으므로 가장 밑에 들어가게 되는겁니다.

New Message는 가장 마지막에 정의되었으니까 제일 위에~~


자. 다른점이 보이시나요!?!?!?

네. Favorites는 UIApplicationShortcutItemIconFile이고, New Message는 UIApplicationShortcutItemIconType이네요!!!!!!!!!!!!

File과 Type은 엄연히 다른거였어요. 먼저. 일단 둘다 필수(required)는 아닙니다. 


UIApplicationShortcutItemIconFile은 앱 번들에서 사용할 아이콘, 이미지 또는 Asset 카탈로그에서 이미지 이름을 value로 주는 거였고, 

UIApplicationShortcutItemIconType 시스템 제공 라이브러리의 아이콘 타입을 지정하는 선택적(optional)문자열을 value로 주는 거였죠. 

그러니까!!!!


자, 우리가 내가 직접 만든 아이콘을 주고 싶어요. 그러면 우리는 Asset에 넣거나 그러죠?

그 아이콘 파일을 사용하고 싶으면!!!!UIApplicationShortcutItemIconFile을 key로 하고, 

value를 그 내가 만든 아이콘의 이름을 주면 되는거에요.


근데 시스템에서 제공하는 아이콘을 쓰고싶다!!!!!!!!!그러면 UIApplicationShortcutItemIconType을 쓰면 되는겁니다.


엥;;;시스템에서 제공하는 아이콘이 있나;


네!! bar button item의 inspector에서 보실 수 있습니다. 


자. New Message의 value가 뭐였는지 봅시다. 

UIApplicationShortcutIconTypeCompose네요!

저기 Compose가 보이네요.

눌러볼까요



비슷하네요!!


하지만 Favorites같은 경우.


        <dict>//Favorites

            <key>UIApplicationShortcutItemIconFile</key>

            <string>open-favorites</string>

        </dict>

현재 Asset에 open-favorites라는 이름을 가진 파일이 없기 때문에, 저렇게 점으로 나오는 것입니다. value로 어떤 값을 주든지 점으로 나올거에요 :)

자..이제 3D touch를 하면 quick action이 나오는 것 까지 해봤는데, 해당 quick action을 누르면 그냥..그냥 앱이 열릴 뿐, 아무작업도 하지 않습니다..

quick action을 누르면 뭔가 작업을 하도록 해줘봅시다.

일단, 저는 "공유"만 해볼게요.

정말 큰?앱..? 조금 큰 회사에서 만든 앱 같은 경우에는 뭔가 다양한 quick action이 있는데, 대부분의 앱들은 공유밖에 없더라구요.

일단 공유부터 하자구요 :)


.

.

.

고 해서 찾아봤는데zzzzzzzzzzzzzzzzzzz

이 "공유"기능은 앱스토어에 올라간 앱이면 다 된다고 하네요............................

즉, 아무작업을 해주지 않아도 앱스토어에 올리기만 하면, 3D touch를 했을 떄, 공유라는 quick action이 생긴다는 것이죠.ㅎㅋ...ㅎㅋㅎ.......이럴수가..ㅎㅎㅇㅎㅌㅎㅋㅎㅋ

그렇군


그럼 다음으로 넘어갑시다.

우리만의 quick action을 만듭시다...

일단 제가 기존 앱들의 여러가지 quick action을 다 해봤는데, 일단 "화면"을 띄워준다. 이거에요.

예를 들어볼까요?



CGV앱으로 예를 들어볼게요. 

극장별예매, 영화별예매, 모바일티켓 셋 다 해당 "화면"만을 보여주는 역할을 합니다. 그렇죠?

그러니까 우리도 하나를 추가하되, 앱을 시작하면 나오는 루트화면이 아닌 어떤 특정한 화면을 나타나게 해주도록 해봅시다.

이전글에서 Delegate를 이용해서 데이터를 전달하는 앱 하나 만들었었죠? 거기에 quick action을 추가해줍시다~.~ 

목표는 quick action에 새로운 텍스트 쓰기라고 해서 그걸 누르면, TextField가 있었던 ViewController로 가는 거죠.

일단 info.plist를 수정해줍시다. 



타이틀은 알아서 작성해주시고, 일단 저 UIApplicationShortcutItemType을 확실하게 해주세요. 필수인 항목이었죠? 내가 그 quick action을 눌렀을 때, 앱에 전달되는 문자열입니다.



그럼 저 quick action을 눌렀을 때, 이제 어떻게 해야할까요?!

여기에 설명이 되어있는데요, 번역을 해보자면


사용자가 홈 스크린의 quick action중 하나를 선택하면, 시스템이 앱을 시작하거나 다시 시작하며, UIKit는 app delegate의 application:performActionForShortcutItem:completionHandler:메소드를 호출합니다. 메소드가 있어야 할때만 메소드가 호출되도록 하는 방법에 대한 자세한 내용은 UIApplicationDelegate Protocol Reference를 참고하십시오.


네..그렇습니다..친절하게 app delegate에 메소드가 있습니다!!!

  func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {

        //code

    }

위 코드죠. 

여기서 shortcutItem으로 우리의 quick action 타입과 타이틀 같은 것들을 확인 할 수 있어요. 

이렇게요.


지금은 우리가 quick action이 한개여서 뭐 어케어케 할 수 있겠지만, 만약 quick action이 여러개라면?!

if , if else로 하기에는 너무 코드가 지저분해지죠?

enum을 사용하면 편하게 할 수 있습니다. 



  enum ApplicationShortcutTypes: String {

        case newText = "New Text"

        case favorites = "favorites"

    }

이렇게요.

그러면, 


   guard let actionType = ApplicationShortcutTypes(rawValue: shortcutItem.type) else{

            return

        }

        switch (actionType){

            //code

        }


이런식으로 해당 type일 때, switch문으로 접근을 할 수 있게 되어 코드가 깔끔해지게 된답니다.

저는 newText일 때, TextField가 있는 ViewController를 띄우고 싶으니까!!


 switch (actionType){

        case .newText:

            let storyboard = UIStoryboard(name: "Main", bundle: nil)

            let rootViewController = storyboard.instantiateViewController(withIdentifier: "HomeViewController")

            self.window!.rootViewController = rootViewController

            rootViewController.performSegue(withIdentifier: "show", sender: nil)

            self.window?.makeKeyAndVisible()

        default:

            print("default")

        }

이런식으로 해주면 된답니다 :)

ㅎ_ㅎ

아무튼 오늘은 3D Touch를 사용하는 방법에 대해서 알아봤습니다.

잘 쓰면 엄청 편할 것 같아요 :)

도움이 되었길 바라며 ~.~

반응형