수색…


비고

  1. 범용 링크를 지원하면 iOS 9 사용자가 Safari를 통하지 않고도 웹 사이트 링크를 탭하여 설치된 앱으로 원활하게 리디렉션됩니다. 앱이 설치되어 있지 않은 경우 웹 사이트 링크를 탭하면 Safari에서 웹 사이트가 열립니다.
  2. 일반적으로 Safari 또는 UIWebView / WKWebView 인스턴스에서 클릭 된 지원되는 링크는 앱을 열어야합니다.
  3. iOS 9.2 이하에서는 기기에서만 작동합니다. iOS 9.3은 시뮬레이터도 지원합니다.
  4. iOS는 Universal Links를 열 때 사용자의 선택을 기억합니다. 오른쪽 상단 이동 경로를 탭하여 Safari에서 링크를 열면 이후의 모든 클릭이 앱이 아닌 Safari로 이동합니다. 그들은 기본적으로 웹 사이트의 앱 배너에서 열기를 선택하여 앱을 다시 열 수 있습니다.

설치 서버

온라인으로 실행되는 서버가 있어야합니다. iOS 응용 프로그램과 서버를 안전하게 연결하려면 Apple apple-app-site-association 이라는 구성 파일을 사용할 수 있어야합니다. 이것은 도메인과 지원되는 경로를 설명하는 JSON 파일입니다.

apple-app-site-association 파일은 https : // {domain} / apple-app-site-association 에서 리디렉션없이 HTTPS 를 통해 액세스 할 수 있어야합니다.

파일은 다음과 같습니다.

{
"applinks": {
    "apps": [ ],
    "details": [
        {
            "appID": "{app_prefix}.{app_identifier}",
            "paths": [ "/path/to/content", "/path/to/other/*", "NOT /path/to/exclude" ]
        },
        {
            "appID": "TeamID.BundleID2",
            "paths": [ "*" ]
        }
    ]
}
}

참고 - apple-app-site-association 파일 이름에 .json 을 추가하지 마십시오.

키는 다음과 같습니다.
apps : 값으로 빈 배열을 가져야하며, 배열이 있어야합니다. 이것이 바로 Apple이 원하는 방식입니다.
details : 웹 사이트에서 지원하는 각 iOS 앱에 대해 하나씩 사전 배열입니다. 각 사전에는 앱, 팀 및 번들 ID에 대한 정보가 포함되어 있습니다.

경로를 정의하는 3 가지 방법이 있습니다.
Static : 지원되는 전체 경로는 특정 링크 (예 : / static / terms)를 식별하기 위해 하드 코드됩니다.
Wildcards : A *를 사용하여 동적 경로와 일치시킬 수 있습니다. 예 : / books / *는 작성자 페이지의 경로와 일치 할 수 있습니다. ? 특정 경로 구성 요소 (예 : books / 1) 내부? ID가 1로 시작하는 모든 도서를 검색하는 데 사용할 수 있습니다.
Exclusions : 경로 앞에 NOT을 사용하면 해당 경로가 제외됩니다.

배열에서 경로가 언급되는 순서가 중요합니다. 이전 지수는 우선 순위가 더 높습니다. 경로가 일치하면 평가가 중지되고 다른 경로는 무시됩니다. 각 경로는 대소 문자를 구분합니다.


# 웹 사이트 코드

웹 사이트 코드는 https://github.com/vineetchoudhary/iOS-Universal-Links/tree/gh-pages 에있는 gh-pages 지점에서 찾을 수 있습니다.

다중 도메인 지원

앱에서 지원되는 각 도메인은 자체 apple-app-site-association 파일을 제공해야합니다. 각 도메인에서 제공하는 콘텐츠가 다른 경우 파일의 내용도 각 경로를 지원하도록 변경됩니다. 그렇지 않으면 동일한 파일을 사용할 수 있지만 지원되는 모든 도메인에서 액세스 할 수 있어야합니다.

App-Site-Association 파일에 서명하기

참고 : 서버가 HTTPS 를 사용하여 컨텐츠를 제공하고 Application Setup 가이드로 이동하면이 부분을 건너 뛸 수 있습니다.

앱이 iOS 9를 타겟팅하고 서버가 HTTPS 를 사용하여 콘텐츠를 제공하는 경우 파일에 서명 할 필요가 없습니다. 그렇지 않은 경우 (예 : iOS 8에서 핸드 오프를 지원할 때) 인정 된 인증 기관의 SSL 인증서를 사용하여 서명해야합니다.

참고 : 이것은 App Store에 앱을 제출하기 위해 Apple에서 제공 한 인증서가 아닙니다. 타사에서 제공해야하며 필수는 아니지만 HTTPS 서버에 사용하는 것과 동일한 인증서를 사용하는 것이 좋습니다.

파일에 서명하려면 먼저 간단한 .txt 버전을 만들어 저장하십시오. 그런 다음 터미널에서 다음 명령을 실행합니다.

cat <unsigned_file>.txt | openssl smime -sign -inkey example.com.key -signer example.com.pem -certfile intermediate.pem -noattr -nodetach -outform DER > apple-app-site-association

그러면 현재 디렉토리에 서명 된 파일이 출력됩니다. example.com.key , example.com.pemintermediate.pem 은 인증 기관에서 사용할 수있는 파일입니다.

: 파일의 서명이없는 경우, Content-Typeapplication/json 이어야합니다. 그렇지 않으면 application/pkcs7-mime 이어야합니다.

Apple App 검색 검증 도구를 사용하여 서버 유효성 검사
웹 페이지에서 iOS 9 검색 API를 테스트하십시오. URL을 입력하면 Applebot이 웹 페이지를 크롤링하고 최상의 결과를 위해 최적화 할 수있는 방법을 보여줍니다. https://search.developer.apple.com/appsearch-validation-tool/

앱 측 설치에는 다음 두 가지 작업이 필요합니다.

  1. 응용 프로그램의 자격을 구성하고 프로젝트의 Associated Domains 기능을 켜서 범용 링크를 활성화합니다.
  2. AppDelegate 에서 들어오는 링크 처리.

1. 앱의 인 타이틀먼트 구성 및 유니버설 링크 사용.

앱의 인 타이틀먼트를 구성하는 첫 번째 단계는 앱 ID에 앱의 인 타이틀먼트를 사용하도록 설정하는 것입니다. Apple Developer Member Center에서이 작업을 수행하십시오. 인증서, 식별자 및 프로필을 클릭 한 다음 식별자를 클릭하십시오. 앱 ID를 선택하고 (필요한 경우 먼저 생성) Edit (편집)을 클릭하고 Associated Domains 인 타이틀먼트를 활성화합니다.

그런 다음 각 앱 ID를 클릭하여 앱 ID 접두어와 접미사를 가져옵니다.

앱 ID 접두어와 접미사는 apple-app-site-association 파일에있는 접미사와 일치해야합니다.

Xcode 에서 앱 타겟을 선택하고 기능을 클릭 한 다음 연결된 도메인을 켜기로 전환합니다. 앱에서 접두어가 붙은 앱에서 지원하는 각 도메인에 대한 항목을 추가합니다 .

예 : applinks : YourCustomDomainName.com

샘플 앱에서 다음과 같이 표시됩니다.

참고 : 동일한 팀을 선택하고 회원 센터에 등록 된 응용 프로그램 ID와 동일한 번들 ID를 입력했는지 확인하십시오. 또한 파일을 선택하여 Xcode에서 권한 부여 파일을 포함하고 있는지 확인하고 파일 관리자에서 대상이 선택되어 있는지 확인하십시오.


2. AppDelegate에서 들어오는 링크 처리하기

Safari에서 범용 링크 용 앱으로의 모든 리디렉션은 애플리케이션의 AppDelegate 클래스에서 아래 메소드를 통해 수행됩니다. 이 URL을 구문 분석하여 앱에서 올바른 작업을 결정합니다.

[UIApplicationDelegate application: continueUserActivity: restorationHandler:]

목표 -C

-(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
    ///Checking whether the activity was from a web page redirect to the app.
    if ([userActivity.activityType isEqualToString: NSUserActivityTypeBrowsingWeb]) {
        ///Getting the URL from the UserActivty Object.
        NSURL *url = userActivity.webpageURL;
        UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        UINavigationController *navigationController = (UINavigationController *)_window.rootViewController;
        if ([url.pathComponents containsObject:@"home"]) {
            [navigationController pushViewController:[storyBoard instantiateViewControllerWithIdentifier:@"HomeScreenId"] animated:YES];
        }else if ([url.pathComponents containsObject:@"about"]){
            [navigationController pushViewController:[storyBoard instantiateViewControllerWithIdentifier:@"AboutScreenId"] animated:YES];
        }
    }
    return YES;
}  

빠른 :

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
      if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
          let url = userActivity.webpageURL!
          //handle url
      }
      return true
  }

iOS 애플리케이션 코드

앱 코드는 여기 에서 master branch로 찾을 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow