[TIL] 2021.03.08

승아·2021년 3월 8일
0

👩🏻‍💻 오늘 공부한 내용

ShareExtension CustomView( 참고 사이트 )

  1. UIViewController를 상속해줍니다.
class ShareViewController: UIViewController{    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}
  1. MainInterface.stroyboard에서 Custom 해줍니다. (MainInterface.storyboard가 나도 모르는사이에 생겼음)
  2. 혹시 데이터를 기존 앱에 넘겨줘야 될 일이 생겼을 경우 Project로 갑니다.

    Target을 해당 프로젝트로 선택한 후 1번에서 App Groups를 추가하여 "group.Bundle Identifier"을 생성해 체크해줍니다.

    Target을 ShareExtension으로 설정해준 후 아까와 같이 "group.Bundle Identifier"을 생성해 체크해줍니다.

익스텐션과 앱은 별개라 서로 영역을 접근할 수 없지만 앱의 데이터를 사용해야하는 경우 사용할 수 있는게 UserDefault! userDefault는 key: vlaue 형태의 폰 DB.

동일한 App Groups에 묶여 있는 애들은 또 다른 외부의 앱, 익스텐션에서도 호출이 가능하기 때문에 같은 그룹으로 묶어줍니다.

  1. ShareExtension에서 입력한 데이터를 저장
let defaults = UserDefaults(suiteName: "group.Bundle Identifier") 
defaults?.set(nameTextField.text, forKey: "Name") // (value, key)
defaults?.set(tags, forKey: "Tag")
defaults?.set(memoTextView.text, forKey: "Memo")
defaults?.set(currentURL, forKey: "URL")
defaults?.synchronize() // 동기화
  1. 앱에서 데이터 불러오기
let defaults = UserDefaults(suiteName: "group.com.sainkr.WishList")
guard let name = defaults?.string(forKey: "Name") else { return }
guard let memo = defaults?.string(forKey: "Memo") else { return }
guard let tags = defaults?.stringArray(forKey: "Tag") else { return }
guard let url = defaults?.string(forKey: "URL") else { return }

// 다 사용했으면 제거
defaults?.removeObject(forKey: "Name")
defaults?.removeObject(forKey: "Memo")
defaults?.removeObject(forKey: "Tag")
defaults?.removeObject(forKey: "URL")
  1. 그 외 부분
  • url 불러오기
private func getLink(){
    if let item = extensionContext?.inputItems.first as? NSExtensionItem {
        if let attachments = item.attachments {
            for attachment: NSItemProvider in attachments {
                if attachment.hasItemConformingToTypeIdentifier("public.url") {
                    attachment.loadItem(forTypeIdentifier: "public.url", options: nil, completionHandler: { (url, error) in
                        if let shareURL = url as? NSURL {
                            // Do stuff with your URL now.
                            print(shareURL.absoluteString)
                        }
                    })
                }
            }
        }
    }
}
  • 취소버튼 눌렀을 때
self.extensionContext!.cancelRequest(withError: NSError(domain: "com.domain.name", code: 0, userInfo: nil))
  • 완료버튼 눌렀을 때
self.extensionContext!.completeRequest(returningItems: nil, completionHandler: nil)

Share Extension 디바이스에서 안뜨는 문제 ( 참고 사이트 )


생성한 target에 General -> Deplyment Info를 디바이스의 iOS 버전보다 낮춰주자 !

0개의 댓글