앱 프로젝트를 진행하다보면, 특정 문자에 대해 SNS 로 공유하고자 하는 기능이 필요할때가 있다.
대표적으로 국내, 해외에서 사용하는 (Facebook, Twitter, Whatsapp, Viber) 4가지를 적용할려고 한다.
해당 예제는 SwiftUI 로 구현했지만 충분히 UIKit 에서도 적용이 가능한 이야기 이다.
1. Whatsapp & Twitter & Viber
1-1. 다음과 같이 스키마를 info.plist 에 추가한다
<key>LSApplicationQueriesSchemes</key>
<array>
<string>whatsapp</string>
<string>viber</string>
<string>twitter</string>
</array>
1-2. 해당 소스에 아래의 URL 만 추가해주면 끝이다.
Whatsapp
앱스토어 URL : https://apps.apple.com/kr/app/whatsapp-messenger/id310633997
스키마 : whatsapp://send?text=(내용)
Viber
앱스토어 URL : https://apps.apple.com/us/app/viber-messenger-chats-calls/id382617920
스키마 : viber://forward?text=(내용)
Twitter
앱스토어 URL : https://apps.apple.com/gb/app/twitter/id333903271
스키마 : twitter://post?message=(내용)
1-3. 만약 url + 내용 사이에 공백이 있을경우 다음과같이 인코딩을 진행하여 추가한다.
let urlStringEncoded = "whatsapp://send?text=hello world".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
if let strUrl = URL(string: 공유할 URL + 내용)
{
if UIApplication.shared.canOpenURL(strUrl) {
UIApplication.shared.open(strUrl, options: [:], completionHandler: {
(success) in
})
} else {
UIApplication.shared.open(URL(string: 앱스토어 URL)!, options: [:], completionHandler: {
(success) in
})
}
}
2. Facebook
- 페이스북 같은경우 공유하기 연동 하는 방식이 살짝 다릅니다.
페이스북 다이얼로그를 띄우기 위해 ViewController(SharingDelegate) 가 필요하기때문에 SwiftUI 에서는 Representable 의 도움을 받아 진행 합니다.
2-1. pod install
pod 'FBSDKShareKit'
2-2. 스키마 info.plist 추가
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
</array>
2-3. SwiftUI View
- facebook 텍스트를 클릭시 bool 값을 통해 Representable 를 띄웁니다
import SwiftUI
import Combine
struct ContentView: View {
@ObservedObject var viewModel = ShareViewModel()
var body: some View {
VStack(spacing: 30) {
Text("facebook")
.onTapGesture {
viewModel.isShowFacebook = true
}
if viewModel.isShowFacebook {
FacebookRepresentable(viewModel: viewModel)
.frame(width:0, height: 0)
}
}
}
}
2-4. ViewModel
- 해당 공유하기를 띄우고 난후 상태변화를 체크하여 다시 값을 변경 해줘야 다시 공유하기를 할수 있기때문에 ViewModel 를 사용합니다.
import Foundation
import SwiftUI
final class ShareViewModel: ObservableObject {
@Published var isShowFacebook = false
}
2-5. UIViewContoller 와 연결할 UIViewControllerRepresentable 추가
import SwiftUI
struct FacebookRepresentable: UIViewControllerRepresentable {
var viewModel: ShareViewModel
func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { }
func makeUIViewController(context: Context) -> some UIViewController {
let facebookViewController = FacebookViewController(viewModel: viewModel)
return facebookViewController
}
}
2-6. Facebook 띄울 Dialog 추가 (ViewController)
- 팝업 같은경우 화면이 만들어진후에 띄워줘야 하기에 viewDidAppear 에 추가합니다.
- SharingDelegate 상에서 공유 상태를 체크 할수 있기때문에 ViewModel 에 값을 갱신 시켜줍니다.
import Foundation
import FBSDKShareKit
class FacebookViewController: UIViewController {
var viewModel: ShareViewModel
init(viewModel: ShareViewModel) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
let url = URL(string: "https://moonggi-dev-story.tistory.com")
let content = ShareLinkContent()
content.quote = "내용 공유해야징"
content.contentURL = url!
ShareDialog(
viewController: self,
content: content,
delegate: self
).show()
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
extension FacebookViewController: SharingDelegate {
func sharer(_ sharer: Sharing, didCompleteWithResults results: [String : Any]) {
print("공유 성공")
viewModel.isShowFacebook = false
}
func sharer(_ sharer: Sharing, didFailWithError error: Error) {
print("공유 에러")
viewModel.isShowFacebook = false
}
func sharerDidCancel(_ sharer: Sharing) {
print("공유 취소")
viewModel.isShowFacebook = false
}
}
그냥 UIActivityViewController 쓰세요.. (ㅠㅠ)
출처 : https://developers.facebook.com/docs/sharing/ios/
'IOS' 카테고리의 다른 글
SwiftUI - TextView Attribute (0) | 2022.06.01 |
---|---|
Swift - Snapkit (0) | 2022.04.10 |
Xcode - info.plist 파일이 없어졌을때 해결 (0) | 2022.02.24 |
Swift - License View (0) | 2022.01.23 |
Swift - ViewModifier 를 이용해 View를 Custom 해보자 (0) | 2022.01.03 |