어플리케이션의 iOS13 대응으로 반한 일

10668 단어 iOSiOS13Swift
iOS 응용 프로그램을 개발하고 있지만 iOS13에서는 실행할 수 없습니다.저는 iOS13에 대응하는 데 필요한 일과 빠져있는 일을 쓰고 싶습니다.

Xcode11에서 스토리보드와 소스 코드를 모르는 두 가지 디스플레이 방법


(2019/9/21 추적)
일단 걸려 넘어진 건 여기야.Xcode 스토리보드에서 UI 구성 요소를 원본 코드에 대응하기 위해 인접해 있는 것을 표시합니다.Xcode10까지 오른쪽 위에 ◯인이 겹치는 아이콘 두 개를 눌렀지만 Xcode11에 없어서 어떻게 표시해야 할지 모르겠어요.
'그것'의 정식 이름은 조수 편집기인 것 같은데, 스토리보드를 표시한 상태에서 편집기 메뉴를 선택한 Assistant를 통해 순조롭게 표시됩니다.

UISearchBar의 텍스트 필드에 대한 공식 지원


이전에는 UISearchBar 내의 텍스트 필드에 접근하는 것을 지원하지 않았으며, 비공식적인 searchBar.value(forKey: "_searchField") as? UITextField 등으로 겨우 사용되었다.
iOS13에서 공식 API로 텍스트 필드에 대한 액세스 제공
let searchField = searchBar.searchTextField
큰 장면을 렌더링하는 동안 이 고장이 발견되었습니다.그리고 이 등급은 UISearchTextField의 등급으로 Token 디스플레이 기능(iOS 표준 메일 응용 프로그램의 검색 기능 등을 지원하며 카드와 같은 디스플레이)이다.
그저 그렇다면 기존 응용 프로그램에는 영향이 없는 것 같지만 그것과 함께 나는 두 가지에 빠졌다.

_searchField 접근 금지 문제


원래는 비공식적이기 때문에 문제도 무엇이지만 텍스트 필드에 대한 접근이 공식화되면서 응용 프로그램에서 접근하는 것을 금지한다_searchField.따라서 이 방법으로 텍스트 필드를 가져오려면 공식 API를 변경해야 합니다.

Any? 프로토콜에 대한 전송 문제


이 문제는 iOS13과 직접적으로 관련이 있는 것은 아니지만 자신의 응용 프로그램에서 원래 _searchField 에서 얻은 텍스트 필드를 사용해서 token 표시를 겨우 했습니다.
이번에는 토큰 기능을 정식으로 지원해 주셔서 감사합니다.
태그 표시를 UISearchTextField 클래스에 추가하려면 UISearchToken 클래스를 사용합니다.이 때 표시된 아이콘, 문자열도 마찬가지지만 검색 날짜와 시간 같은 것을 기억해야 합니다.따라서 UISearchToken유형의 속성representedObject을 가지고 있으며 여기에 이 정보를 기입하면 나중에 검색하고 검색할 수 있다.
그렇다면 검색할 관건적인 항목(날짜와 시간, 이름 등)이 여러 개 있다면 자연히 Any? 에 입력된 클래스는 어떤 공동 프로토콜을 실현했는지(여기 representedObject로 가정) 클래스입니다.
다음과 같은 경우를 가정합니다.
// 検索キー用の共通プロトコル
protocol SearchKey {
}
// 日付検索用のキー
class DateKey : SearchKey {
}
// 名前検索用のキー
class NameKey : SearchKey {
}
SearchKey 또는 representedObject 객체를 넣고 체크 아웃할 때
let searchKey = token.representedObject as? SearchKey
이렇게 꺼내려고 했지만 이 방법으로는 DateKey 꺼낼 수가 없었어요.
위의 URL에는 잘 해결되었지만 Swift에서는 NameKey형을 프로토콜형에 직접 전송할 수 없을 것 같습니다.한 번nil형이면 좋은 해결 방안이 있기 때문에 다음과 같이 회피했다.
let searchKey = token.representedObject as AnyObject as? SearchKey

검색 표시줄 단추 취소 문제


(2019/12/19 추기했습니다. iOS13 대응 이후 눈치채지 못했습니다. 이 문제가 발생한 것 같습니다.
내 응용 프로그램에서 검색 결과의 일람 화면에 편집 단추가 있습니다. 편집이 눌렀을 때 검색 입력 영역을 비활성으로 설정하고 취소 단추를 삭제했기 때문에 iOS13에 대응하여 다음과 같이 코드를 고쳤습니다.
let searchBar = parentVC.searchController.searchBar
searchBar.setShowsCancelButton(false, animated: true)
searchBar.searchTextField.isEnabled = false
그러나 실행Any? 취소 버튼이 사라지지 않고 편집된 취소 버튼이 편집 모드에서 벗어난 후(이 때 위와 상반된 코드를 실행), 검색된 취소 버튼으로 원래의 일람 화면으로 되돌아갈 때 검색된 취소 버튼이 남아 있는 현상이 발생한다.
이 문제의 해결 방법은 아직 알 수 없지만 상술한 AnyObject을 하지 않으면 발생하지 않을 것이다.setShowsCancelButton 취소 버튼을 없애기 위해 불렀어야 하는데 사라지지 않고 상술한 문제만 일으킬 수 있기 때문에 임시 처리로 건너뛰었다.
취소 버튼은 사라지지 않았지만 일람 화면으로 돌아갈 때 버튼이 남아 있는 문제를 피할 수 있습니다.

setShowsCancelButton 태그 번역 실패 문제


이 문제는 Xcode 11.3에서 해결된 것 같다(2019/12/19 확인. 11.2 고칠 수 있다)
내 프로그램은storyboard를 사용하여 화면을 개발합니다.영어와 일본어를 지원하기 때문에 먼저 영어로 화면을 만들어요, Main.strings에서 해당 ObjectID에 대해 일본어를 설정하는 방법
하지만 Xcode 11GM Seed로 개발하면서 어느새 번역이 안 됐어요.내 응용 프로그램의 경우staticsetShowsCancelButton에 설정된 UITableViewCell의 제목은 일률적으로 번역할 수 없다.다른 구성 요소는 모두 보통 번역된 것이기 때문에 Xcode의 오류일 수 있다고 생각하지만 좋은 해결 방법이 없어서 아래의 방법으로 잠시 회피했습니다.
  • 번역실패UITableViewUITableViewCell값을 수동복제
  • 부터UILabelObjectID까지(IB에서의Accessibility아래로)
  • Identifier 에 대한 DataSource 클래스 추가 구현
  • override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = super.tableView(tableView, cellForRowAt: indexPath)
        if let label = cell.textLabel, let id = label.accessibilityIdentifier, id.count > 0 {
            let key = id + ".text"
            let localizedString = NSLocalizedString(key, tableName: "Main", comment: "")
            if key != localizedString {
                label.text = localizedString
            }
        }
        return cell
    }
    
    한마디로 존재ObjectID,Main.strings에 대응하는 번역이 존재하면 텍스트를 교체합니다.
    이렇게 하면 순조롭게 번역할 수 있다.
    주의사항은 수동 복제 UITableView 시 틀리지 마세요.다른 ID를 잘못 붙여넣으면 다른 번역어가 표시되어 보기 싫습니다.
    또 Stack overflow에서 같은 문제가 발견되었기 때문에 이 같은 회피 대책을 투고해 봤다.
    https://stackoverflow.com/questions/57905965/xcode-11-ios-13-localization-issue

    액세스 가능성 표시기 해제로 인한 응용 프로그램 충돌 문제


    한 번의 대응이 끝난 후 App Store에 업로드하고 Test Flight로 동작을 확인할 때 시작할 때 프로그램이 붕괴되는 현상이 발생했습니다.시뮬레이터의 디버깅과 현지의 실제 디버깅에서 잘 작동하기 때문에 조사가 매우 어렵다
    3   UIKitCore                       0x1a3227148 UISearchDisplayControllerNoLongerSupported + 247
    
    이 붕괴 일지를 단서로 삼아 우리는 다음과 같은 정보를 찾았다.
    https://github.com/mapbox/mapbox-gl-native/issues/15559
    오래전부터 추천하지 않던 ObjectID iOS13에 의해 완전히 폐지되어 사용하면 붕괴됩니다.
    문제는 이런 반을 사용한 기억이 나지 않고 UISearchDisplayController에서 전체 원본을 검색해도 찾을 수 없기 때문에 왜 이런 오류가 발생했는지 모르겠지만 사실은 있다.

    검색 기능을 개발할 때 시행착오가 추가된 실제 사용하지 않은 물건이 남아 있는 것으로 보인다.UISearchDisplayController 에서 검색해도 이 설명을 찾을 수 없습니다. UISearchDisplayController 에서 검색해야 합니다.
    이거 삭제하면 돼.

    주 루틴 이외의 사용자 인터페이스 구성 요소 접근 검사 엄격


    원래 화면 묘사와 관련된 처리는 메인 라인부터 시작해야 하지만 화면 묘사와 직접 동반되는 처리가 아니더라도 UI 구성 요소에 대한 접근 검사는 엄격해진다.내 응용 프로그램의 경우 다른 라인에서 접근한 UISearchDisplayController searchDisplayControllerUIViewController 처리가 검사에 걸렸습니다.
    나는 단지 splitViewController 클래스에 보존된 자신의 속성에 접근하고 싶어서 navigationController 또는 ViewController 클래스를 거치지 않고 필요한 View Controller에 직접 접근하는 것을 피했다.

    Xcode11GM Seed2에서 iOS13 에뮬레이터가 작동하지 않음


    (2019/9/21 추적)
    Xcode11의 GM Seed2 이후 iOS13의 시뮬레이터를 시작하려고 할 때 splitViewController 메시지가 나타나 시작할 수 없습니다.자세한 내용은 navigationController 입니다.당분간은 이유를 알 수 없지만 많이 검색한 결과 다음과 같은 기사가 나왔습니다.
    https://stackoverflow.com/questions/53261256/xcode-10-simulator-runtime-is-not-available-runtime-profile-not-found-error
    $ sudo killall -9 com.apple.CoreSimulator.CoreSimulatorService
    
    이제 시뮬레이터 서비스를 다시 시작해서 문제를 해결했습니다.
    이상, iOS13을 지지하는 사람들을 도울 수 있다면 좋겠습니다.

    좋은 웹페이지 즐겨찾기