• 백그라운드 읽기 기능 지원

    • 백그라운드 태그 읽기가 동작하는 조건
      • NDEF 포맷
      • URL 레코드를 가지고 있어야 한다.(여러 개 들어 있으면 첫번째 것만 처리 됨)
      • 앱으로 라우팅하기 위해서는 유효한 유니버셜 링크여야만 한다.
      • 화면이 켜진 상태에서는
        • 태그를 읽으면 노티피케이션이 오며, 이를 탭하면 연관된 앱으로 NSUserActivity를 전달하게 된다.
          • 유니버셜 링크 매커니즘 사용
          • 관련 앱이 없는 경우는 사파리로 fallback
        • 탭하지 않은 노티는 노티피케이션 센터에 남게 된다.
        • 앱이 동작하는 상태에서도 태그를 읽으면 노티가 온다.
      • 화면이 잠긴 상태에서는 읽으면 화면을 풀 것을 요구한다.
      • 기기 최소 요구사항은 iPhone Xs, iPhone Xs Max, iPhone XR
        • 부팅 후 최소 1번은 언락되었어야만 한다.
        • Core NFC 세션이 동작하고 있을 때는 백그라운드 읽기가 멈춘다.
        • Apple Pay Wallet을 사용중일 때는 안된다.
        • 카메라 사용중일 때도 안된다.
        • 비행기 모드 켜져 있어도 안된다.
    • 백그라운드 읽기를 지원하기 위해서는
      • Associated Domain을 등록한다.(유니버셜 링크의 요구 사항)

      • AppDelegate에서 다음 메소드를 구현한다.

        application(_:continue:restorationHandler:)
        
      • NSUserActivity의 ndefMessagePayload 프로퍼티에 접근한다.

  • Example Code

    import CoreNFC
    
    @UIApplication
    class AppDelegate: UIResponder, UIApplicationDelegate {
    	var window: UIWindow?
    
    	func application(_ application: UIApplication,
    										continue userActivity: NSUserActivity, 
                        restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    
    	  // activity 타입 검증
    	  guard userActivity.activityType == NSUserActivityTypeBrowsingWeb else {
    			return false
        }
    
        // ndefMessage 가져오기
        let ndefMessage = userActivity.ndefMessagePayload
        
        // ndefMessage 검증
        // 백그라운드 읽기에서 나온 activity가 아니면, 페이로드가 1개 뿐이고, type이 empty다.
        guard ndefMessage.records.count > 0,
    				ndefMessage.records[0].typeNameFormat != .empty else {
    				return false
         }
    
         return true
    	}
    }
    
  • 만약 URL이 유니버셜 링크가 아닌경우에도, 몇가지 URL은 처리할 수 있다.

    • 웹사이트 URL(http://, https://)
    • SMS(sms:+1234567890)
    • email(user@example.com)
    • 전화번호(tel:+1234567890)
    • facetime/facetime audio(facetime://user@example.com)
    • 홈킷 주변기기 설정(X-HM://)