[iOS13] scene(u:willConnectTo:options:)에 대한 옵션과 세션에 대한 NSUserActivity의 차이

13078 단어 Xcode11iOS
[iOS13] scene(u:willConnectTo:options:)에 대한 옵션과 세션에 대한 NSUserActivity의 차이

입문

scene(_:willConnectTo:options:)에서 NSUserActivity장면을 회복하는 과정에 대해 많은 애플의 템플릿은 다음과 같다.
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        if let userActivity = connectionOptions.userActivities.first ?? session.stateRestorationActivity {
            // UIの復元処理を行う
        }
    }
이때 sessionconnectionOptions에서 얻은 NSUserActivity의 차이를 잘 알고 있기 때문에 조사 내용을 총괄하고 싶습니다.
길어졌으니 먼저 총결산을 쓰시오.

총결산

  • scene(_:willConnectTo:options:)connectionOptions는 시스템 측면의 장면을 제작할 때 전송문에 대한 매개 변수 교환에 사용된다.
  • 그러나 connectionOptions.userActivities Handoff와 관련된 사용자 활동은 포함되지 않습니다.handoffUserActivityType 유형 정보만 제공합니다.
  • Handoff의 사용자 활동은 scene(_:willContinueUserActivityWithType:)라는 전용 위임 방법에 들어갑니다.
  • 애플의 템플릿에 따라 실시된다면 connectionOptions.userActivities.firstsession.stateRestorationActivity 모두 같은 사용자 활동이 있을 것이다.
  • WWDC2019-212


    먼저 WWDC 2019-212의 미드레인지에서 언급한 부분ConnectionOptions#userActivities을 뽑아낸다.
  • connectionOptions.userActivities
  • Now, in this template that I pulled out, we're already looking for any user activities that we have gotten through Handoff or any other system facilities that vend us user activities. We want to prefer those user activities because that's what the user actually did.
    WWDC2019-212 Transcript
  • session.stateRestorationActivity
  • But the stateRestorationActivity is special and it's on the session. So if you don't have one of those activities, we want to use our stateRestorationActivity.
    WWDC2019-212
    , "Handoff 또는 기타 시스템 기능을 통한 사용자 활동"입장 connectionOptions.userActivities그 다음으로 세션이 예약된 stateRestorationActivity 에서 사용자 활동을 가져옵니다.나는 문서로 더욱 상세한 곳을 찾았다.

    API 문서에서 어떻게


    먼저 UIScene.ConnectionOptions부터 보자.
  • UIScene.ConnectionOptions
  • A data object containing information about the reasons why UIKit created the scene.
    UIKit creates scenes for many reasons. It might do so in response to a Handoff request or a request to open a URL. When there is a specific reason for creating a scene, UIKit fills a UIScene.ConnectionOptions object with the associated data and passes it to your delegate at connection time.
    시스템 측면에서 장면을 만들 때, 예를 들어 "Handoff"또는 "URL 열기 요청"등은 UIScene.ConnectionOptions 에 파라미터를 채워서 삭제문에 전달합니다.
    단, 이 옵션userActivities 속성에 대한 설명에서

  • UIScene.ConnectionOptions#userActivities
  • This property does not contain user activity objects related to Handoff.
    , Handoff의 사용자 활동은 포함되지 않습니다.다음
    UIKit delivers only the type of a Handoff interaction in the handoffUserActivityType property. Later, it calls additional methods of the delegate to deliver the NSUserActivity object itself.
    , 장면 시작 시 NSUserActivityactivityType 유형 정보만 제공합니다.
    이후 Handoff의 사용자 활동은 다른 위임 방법에 전달됩니다."additional methods of the delegate"와 같은 곳을 찾아보세요.
  • UIScene.ConnectionOptions#handoffUserActivityType
  • Tells the delegate that it is about to receive Handoff-related data.
    및 장면 기반 Handoff 사용자 활동에 대한 전용 위임 방법WWDC의 애니메이션에서만 언급된 내용이라면 오해의 소지가 있다.
    참고로 응용 단위로 Handoff의 사용자 활동 인수인계를 하는 데는 scene(_:willContinueUserActivityWithType:) 같은 API가 있다.
    그러면 결과connectionOptions.userActivities 속성에는 어떤 사용자 활동이 포함되어 있습니까?
    You create user activity objects at key moments in your scene's lifetime and register them with the system.
    이후 시스템에 대해 명확하게 등록된 사용자 활동인 것 같습니다.이 등록에 사용할 API는 무엇입니까?이것은 UISceneDelegate#stateRestorationActivity(for:)에 기재되어 있다.
  • application(_:continue:restorationHandler:)
  • When reconnecting the scene later, UIKit includes the NSUserActivity object in the UIScene.ConnectionOptions passed to your scene delegate's scene(_:willConnectTo:options:) method.
    그리고 이 stateRestorationActivity(for:)를 통해 전달된 사용자 활동은 위임된 scene(_:willConnectTo:options:)connectionOptions 매개 변수에 들어갑니다.
    나는 반드시 stateRestorationActivity(for:) 저장된 사용자 활동이 API의 명칭에 있어서 쌍을 이루는 것이라고 생각한다. 그러면 session.stateRestorationActivity 안에 무엇을 넣을까?
  • stateRestorationActivity(for:)
  • Before disconnecting a scene, the system asks your delegate for an NSUserActivity object containing state information for that scene. If you provide that object, the system puts a copy of it in this property.
    문서에서 응용 프로그램이 끊어질 때 시스템에서 제공하는 NSUserActivity를 삭제하여 다시 연결할 때 이 속성으로 복사합니다.
    UISceneDelegate는 NSUserActivity를 시스템에 제공
  • UISceneSession#stateRestorationActivity
  • stateRestorationActivity(for:)
    Returns a user activity object encapsulating the current state of the specified scene.session.stateRestorationActivity.애플의 템플릿 설치 중
        func stateRestorationActivity(for scene: UIScene) -> NSUserActivity? {
            return scene.userActivity
        }
    
    의 양곡 탄젠트 값입니다.이 경우 stateRestorationActivity(for:)connectionOptions.userActivities.first 모두 같은 사용자 활동을 할 수 있다는 것이다.
    확실히 다음 프로젝트에서 소개된 애플의 샘플 코드에서 검증된 느낌은 이렇다.
    UISceneDelegate

    장면의 사용자 활동을 저장하는 방법


    예시 코드에 저장된 사용자 활동의 패턴을 설명합니다.
    모드1

    특정 ViewController에서
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            view.window?.windowScene?.userActivity = photo?.openDetailUserActivity
        }
    
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            view.window?.windowScene?.userActivity = nil
        }
    
    모드2
    Sample Code - Supporting Multiple Windows on iPad
    UISceneDelegate에서
        // シーンが非アクティブになる時に呼ばれます
        func sceneWillResignActive(_ scene: UIScene) {
            if let navController = window!.rootViewController as? UINavigationController {
                if let detailViewController = navController.viewControllers.last as? DetailViewController {
                    // Fetch the user activity from our detail view controller so restore for later.
                    scene.userActivity = detailViewController.detailUserActivity
                }
            }
        }
    
    언제든지session.stateRestorationActivity 대상의 scene 속성에 사용자 활동을 추가합니다.배치된 사용자 활동의 치수는 다음 라우터를 통해 시스템 측에 전달되는 치수입니다.
        func stateRestorationActivity(for scene: UIScene) -> NSUserActivity? {
            return scene.userActivity
        }
    
    이상, 반환SampleCode - Restoring Your App’s State

    좋은 웹페이지 즐겨찾기