본문 바로가기

IOS

SwiftUI - SNS 공유하기 (Facebook, Twitter, WhatsApp, Viber)

앱 프로젝트를 진행하다보면, 특정 문자에 대해 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 - 공유 - 문서 - Facebook for Developers

Modeling Content Each type of content has a interface you can use to represent it which conforms to SharingContent. After you model the content, add a sharing interface to your app which conforms to Sharing or use the provided ShareDialog class. Links When

developers.facebook.com

 

'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