왜 인스타그램 DM에 문제가 생겼을까요^^

무슨 일이 있었는지


인스타그램 DM에서'한자 변환 불가','탁음 입력 불가'등의 오류가 발생한 것 같다.
※ 현재 앱을 통해 수정

왜 일어났는지(재현)


이번에는 개구리라는 글자만 찾아서 녹색으로 만들자.
흔히 볼 수 있는 예는'트위터에서 라벨을 파란색 문자로 바꾸는 것'이다.
이번에는 간단히 돌아가자.
class ViewController: UIViewController, UITextViewDelegate {
    let searchText = "かえる"
    
    func textViewDidChange(_ textView: UITextView) {
        let attributedText = NSMutableAttributedString(string: textView.text, attributes: [.foregroundColor: UIColor.darkText])
        if let range = textView.text.range(of: searchText) {
            attributedText.addAttributes([.foregroundColor: UIColor.green], range: range.toNSRange(from: textView.text))
        }
        textView.attributedText = attributedText
    }
}
이동 시 아래 코드 필요
  • UITExtView의 View 추가 및 delegate 응용
  • 이하 extension
  • 다른 여러 가지(이해 가능하죠)
  • extension Range where Bound == String.Index {
        func toNSRange(from text: String) -> NSRange {
            return NSRange(self, in: text)
        }
    }
    
    간단히 재현할 수 있습니다.
    '개구리'의 문자 색깔은 녹색으로 변할 수 있다
    이번에는 탁음을 바꿀 수 없는 오류가 발생했다는 것이 중점이다.
    再現GIF
    3배속 재생
    코드도 알아볼 수 있게.
    문자를 입력할 때마다 텍스트를 검사하고 디스플레이를 수정합니다.
    입력한 문자를 강제로 덮어썼기 때문에 변환된 문자가 취소됩니다.
    한 글자씩 입력할 때마다'확인'상태라는 뜻이다.
    따라서 바꿀 수도 없다
    '가오'를 치려고 해도'가로'로 정하고 탁음점 위치의 안문자'^^'를 입력한다.
    영어권 등에서는 문자 입력법의'전환'습관이 없어야 하기 때문에 이 문제를 주목하기 어렵다.
    그래서 인스타그램급 서비스에서도 이런 오류가 발생했다고 생각한다.
    그나저나 한 시기쯤에 화제가 됐던 홍.
    훅 같은 실시간 채팅 이슈가 잠시 화제가 됐다.
    현재(2021/04/03)에도 같은 문제가 발생했다.
    미국발 일본 시장 우선순위도 낮을 것으로 예상돼 당분간 대응이 불가능한 상황이다.
    만약 영어권에서 주요 응용 프로그램을 찾게 된다면, 나는 아직도 많은 응용 프로그램이 이런 오류를 남길 것이라고 생각한다.

    타사 키보드 없음


    참고로 이곳의 버그는 ATOKSimeji와 같은 제3자 키보드에서 발생하지 않을 것이다.
    OS 수준의 제3자가 아직 표준 키보드로 구현한'입력 중인 문자의 배경색을 바꾸어 변환하는 기능'을 개방하지 않았기 때문이다.
    정확히 말하면 iOS 13 미만에서는 위에서 설명한 대로 이 기능이 iOS 13 이상에서 켜져 있다.
    하지만 개방된 기능도 불안정해 사용을 권장하지 않는 상황이다.

    그래서 뭐?


    OS 수준에서 타사에 "입력의 문자 배경색을 변경하여 변환 기능 실행"
    따라서 입력한 문자(OS에서)는 가명과 같다.
    따라서 변환 기능을 위해 입력한 문자를 잠시 보류하고 변환 후보를 선택하면 백그라운드에서 입력한 문자를 삭제한 후 시스템에서 한자를 입력하는 행위가 실행된다.
    보통 그래요.
  • 교체 입력
  • 키보드의 후보 변환 개구리
  • 를 클릭
  • 시스템에서 순간적으로'후퇴공간'키를 3회 가볍게 두드리고'개구리'
  • 를 입력한다.
  • 사용자가 보기에'개구리'가'개구리'로 바뀌었음
  • 이번 고장의 원인은 앞에서 말한 바와 같이'한 글자를 입력할 때마다 강제로 확정된다'는 상황 때문이다.
    다른 한편, 제3자 키보드는 BUG와 상관없이 항상'한 글자를 입력할 때마다 결정된다'는 동일한 상황에 처해 있으며, 이 경우 정상적인 작업을 위해 제작되기 때문에 이번 BUG의 영향을 받지 않는다.

    보태다


    필자는 평소에 ATOK을 사용한다.ATOK의 현재 상황을 전달합니다.
    버그가 발생해도 Atok에서 일어나지 않는 GIF
    상기 고장이 발생한 코드와 같은 구축이지만 ATOK는 발생하지 않았다.

    Atok이 사용자에게 어떻게 설명했는지

    커서 위치 입력이라는 기능이지만 ON 상태로 설정하면 아까그래서 뭐?에 적힌 대로 처리됩니다.
    이 기능은 OS의 제한을 강제로 회피해 구현한 기능이기 때문에 애플이 선호하는 실상은 아닐 것으로 보인다.
    그리고 이런 불합리한 실시 방식은 응용 프로그램에 따라 정상적으로 작동하지 못할 수도 있다.
    따라서 키보드에 입력된 문자를 표시하는 '제한 중 원하는 실현' 은 '커서 입력 위치 = OFF' 이다.

    해결책


    아주 간단합니다.
    속성markedTextRange, 변환 중인 문자 범위를 얻을 수 있습니다.
    nil이면 변환에 문자열이 없고 표시된 텍스트에 장식 처리를 반영하는 것도 문제없습니다.
    func textViewDidChange(_ textView: UITextView) {
        if textView.markedTextRange != nil {
            // 変換中の文字がある!
            return
        }
        
        // ... 以下先程のコードが続く ...
    }
    
    '개구리'의 녹색 장식을 구현하면서 탁음 입력과 변환 등의 기능을 확인했다.
    回避GIF
    더 세부적으로 시행하려면 UITextRange의 위치 정보를 얻을 수 있기 때문에 그 값을 활용하는 것도 방법이다.

    좋은 웹페이지 즐겨찾기