일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- swift autolayout
- swift sms
- swift 문자
- FlutterView MethodChannel
- Flutter UIKitView MethodChannel
- 스위프트 푸시
- flutter 회전
- flutter rotate
- 스위프트
- Swift flutterviewcontroller
- 앱 꺼졌을 때 푸시 데이터 저장
- NotificationService Extension
- 안드로이드 바로가기
- 스위프트 카메라
- 안드로이드 숏컷
- 스위프트 웹뷰
- 안드로이드 에러
- 스위프트 앨범
- 스위프트 테이블 뷰 셀
- 안드로이드 FCM
- 플러터 뷰 컨트롤러
- Swift flutterview
- 앱 백그라운드 푸시 데이터 저장
- native flutter view
- silent push
- 푸시 데이터 저장
- Flutter NativeView
- 노티피케이션 익스텐션
- 안드로이드 앨범
- 스위프트 UserDefaults
- Today
- Total
Things take time
[SWIFT] 밴드 링크 기능 추가하기 본문
[밴드]
http://developers.band.us/develop/guide/share
밴드 공유하기, 밴드링크는 사용자에게 밴드로 이동하여 해당 메시지나 이미지 등을 추가해서 보낼 수 있다. 카카오링크와 마찬가지이지만, 차이점은 카카오 링크는 SDK를 패키지 내에 추가해야하는 번거로움과 엑스코드 상에서 세팅해야하는 것까지 추가되어 귀찮기 그지 없다. 물론 그만큼 다양하고, 예쁘게 보낼 수 있는 장점이 있다.
밴드 개발자 센터에서 보이는 내용으로 추가하는데, 대신 밴드 사이트에서는 기본적으로 Object-C로만 제공하는 소스이기때문에 이를 스위프트로 이용하여 사용한다.
BOOL isBandInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"bandapp://"]]; if(!isBandInstalled) { // 앱스토어 밴드 바로가기 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/app/id542613198"]]; return; } NSString *serviceDomain = @"www.bloter.net"; NSString *text = @"글 내용"; NSString *percentEncodedText = (NSString*)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)text, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8)); NSString *urlString = [NSString stringWithFormat:@"bandapp://create/post?text=%@&route=%@", percentEncodedText, serviceDomain]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
위의 소스가 Object-C로 보내는 내용이다. 도메인 명은 현재 서비스중인 도메인 명, 어플에서 사용하는 웹의 도메인을 의미하는것 같은데 저 그대로 넣어도 잘 동작해서(?) 솔직히 저걸 왜 하는지.. 어쨌든 text에는 전달할 문자열을 넣게되는 방식이다.
이를 스위프트로 변환하면
func shareBand(url: String){ print("ShareBand Call") let isBandInstalled = UIApplication.shared.canOpenURL(URL(string: "bandapp://")!) print(isBandInstalled) if(!isBandInstalled){ UIApplication.shared.open(URL(string: "itms-apps://itunes.apple.com/app/id542613198")!, options: [:], completionHandler: nil) } else{ let serviceDomain = "www.bloter.net" let text = "글 내용" let textURL = text.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) let str = String(format: "bandapp://create/post?text=%@&route=%@", arguments: [textURL!, serviceDomain]) UIApplication.shared.open(URL(string: str)!, options: [:], completionHandler: nil) } }
위의 소스 그대로 사용하면 된다. 먼저 canOpenURL이란 함수는 스위프트에서 shared.canOpenURL로 사용되며 해당 밴드앱으로 실행할 수 있는지에 대한 리턴 값을 bool값으로 전달한다.
그리고 설치되어 있지 않다면 밴드앱으로 전달하게 한다. intent와 같은 용도랄까.
만약 설치되어있다면 해당 문자열 값을 String.addingPercentEncoding으로 인코딩하여 해당 문자열을 변경해주고, URL값 중 text에는 문자열을 route에는 서비스 도메인 값을 전달하는 방식이다. 이미지를 전달하는 방식도 있긴 할텐데, 내가 필요한 것은 저 text값에 해당 글에 대한 url을 넘겨줄 것이기 때문에 이대로 사용할 것이다.
그리고 한 가지 더, plist에 설정값을 넣어야하는 부분이 있다. 저 canOpenURL의 string값인 bandapp이란 문자열인데, 이 문자열은 아이폰 내에 설치된 앱을 검사하기 위한 목적이므로 해당 문자열을 사용하겠다고 알려야한다.
info.plist의 LSApplicationQueriesSchemes에 string값으로 bandapp 이란 문자열을 입력해 놓는다.
결과화면은 다음과 같다.
** 2017.07.14
기능을 검수하던 중.. 한글로 전달된 내용은 urlQueryAllowed옵션으로 인코딩하여 밴드에 전달하면 위 화면처럼 잘 나오지만, 만약 전달해야할 내용이 Text값이 아니라 URL문자열이라면 위의 소스로는 해결이 안된다.
특히 URL의 파라미터를 전달할때 &라던지.. !같은.. 이런 애들은 따로 묶어서 CharacterSet으로 만들어줘야 한다.
// characterIn: 에 있는 캐릭터들을 도치시켜라, URL인코딩에 포함시키란 뜻 let allowedCharacterSet = (CharacterSet(charactersIn: "!*'();:@&=+$,/?%#[] ").inverted) if let escapedString = text.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) { let str = String(format: "bandapp://create/post?text=%@&route=%@", arguments: [escapedString , serviceDomain]) UIApplication.shared.open(URL(string: str)!, options: [:], completionHandler: nil) }
위와 같이 사용하면 된다.
'iOS (기능)' 카테고리의 다른 글
[SWIFT] 주소록에 저장된 데이터 불러오기 (0) | 2017.06.12 |
---|---|
[SWIFT] UIActivityViewController를 이용하여 아이폰에 설치된 앱들에게 공유하기 (0) | 2017.05.31 |
[SWIFT] 카카오 링크 기능 추가하기 (6) | 2017.05.25 |
[SWIFT] plist파일 읽기 및 UserDefaults (0) | 2017.05.23 |
[SWIFT] 웹뷰와 자바스크립트 연동 (Native <-> JavaScript 통신 방법) (18) | 2017.05.17 |