Things take time

[SWIFT] 밴드 링크 기능 추가하기 본문

iOS (기능)

[SWIFT] 밴드 링크 기능 추가하기

겸손할 겸 2017. 5. 30. 10:02

[밴드]


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)
            }

위와 같이 사용하면 된다.