it-roy-ru.com

iOS9: не работает Universal Links

Поэтому я следовал за учебником https://blog.branch.io/how-to-setup-universal-links-to-deep-link-on-Apple-ios-9 и точно использовал те же значения, что и один предоставлен.

Файл Apple Association также готов в каталоге ссылок: WEB_PAGE: PORT_NUMBER/Apple-app-site-association

Кажется, все настроено на этой стороне.

Я добавил права, обновил профиль обеспечения и все настроил.

Когда я запускаю приложение на своем устройстве и открываю ссылку http: // WEB_PAGE: PORT_NUMBER , это всегда открывает Safari.

У меня даже есть точки останова в следующих методах:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray * __nullable restorableObjects))restorationHandler

Но пшик.

Кто-нибудь усовершенствовал это? Я что-то упустил? 

92
Legolas

Есть несколько возможных проблем.

  1. Попробуйте вставить свой домен в этот валидатор ссылок и убедитесь, что проблем нет: https://limitless-sierra-4673.herokuapp.com/ (кредит на ShortStuffSushi - см. repo )

  2. iOS регистрирует сообщение об ошибке в системных журналах, если у вас не настроен TLS в домене, указанном в ваших правах. Он похоронен в журналах ОС, а не в журналах приложений. Сообщение об ошибке будет выглядеть как Sep 21 14:27:01 Derricks-iPhone swcd[2044] <Notice>: 2015-09-21 02:27:01.878907 PM [SWC] ### Rejecting URL 'https://examplecustomdomain.com/Apple-app-site-association' for auth method 'NSURLAuthenticationMethodServerTrust': -6754/0xFFFFE59E kAuthenticationErr. Сообщение об ошибке извлечено из здесь , быстрых (неполных) инструкций по использованию CloudFlare для TLS здесь .

  3. В моем личном тестировании нажатие/ввод ссылки в Safari ни разу не открывало приложение напрямую. Нажатие из других приложений (iMessage, Mail, Slack и т.д.) Сработало. Другие сообщают, что нажатие на ссылки в результатах поиска Google открыло приложение напрямую.

  4. Обратите внимание, что если Universal Link удается открыть ваше приложение, а затем вы переходите в Safari (нажав свой сайт в верхнем правом углу панели навигации в приложении), то iOS перестает открывать приложение, когда вы посещаете этот URL-адрес. Затем в Safari вы можете раскрыть баннер вверху страницы с надписью «Открыть». Я потратил много времени на это. Обратите внимание, что переход на сайт => отключение UL кажется характерным для пути, в зависимости от путей, указанных в файле Apple-app-site-assocation. Так что, если у вас есть отдельные маршруты, yoursite.com/a/* и yoursite.com/b/*, если вы нажмете yoursite.com/a/* и он откроет ваше приложение напрямую, у вас будет возможность в правом верхнем углу приложения перейти на yoursite.com/a/*. Если вы сделаете это, последующие посещения yoursite.com/a/* будут открываться в браузере, а не в приложении. Тем не менее, yoursite.com/b/* должен быть незатронутым и все же открыть ваше приложение напрямую.

Дайте мне знать, если вы обнаружите, в чем проблема. Мне лично очень любопытно, как работают Universal Links и какие существуют случаи с Edge. Удачи.

167
st.derrick

Есть много способов, которыми это может пойти не так. Два момента доставили мне неприятности:

  • В Xcode, когда вы добавляете разрешение Associated Domains, каждая запись должна начинаться с applinks:, а затем с вашего доменного имени. Например. applinks:www.Apple.com.

  • Хотя XCode создал файл разрешений для меня, он не включался в мою сборку: я должен был нажать на это поле вручную.

И да, после этого не было необходимости подписывать файл Apple-app-site-association: он представляет собой простой текст и работает, если он обслуживается по HTTPS. (Вам все равно нужно будет подписать его, если вы поддерживаете iOS 8.)

52
DFedor

Очевидно, что в документации по созданию файла ассоциации для Universal Links .

Где это говорит:

Значением ключа appID является идентификатор команды приложения и идентификатор пакета

это должно сказать

Значением ключа appID является префикс приложения и идентификатор пакета

Кажется, что для большинства приложений идентификаторы Team ID и префиксы приложений совпадают, но если ваше приложение находилось в магазине в течение многих лет, эти значения могут отличаться. 

Чтобы найти это значение, откройте Member Center на https://developer.Apple.com и посмотрите «Сертификаты, идентификаторы и профили», нажмите «Идентификаторы», затем «Идентификаторы приложений» в таблице под «Идентификаторы». ». Найдите свое приложение и используйте там значение Prefix и Bundle ID, чтобы создать свой AppID для файла ассоциации.

26
Curtis Brian Halbrook

St.derrick's Ответ является информативным. 

Но чтобы снова открыть универсальные ссылки в приложении вместо сафари, нам нужно сделать следующее.

  • Длительное нажатие на Универсальную ссылку в Mail или iMessage, затем вы увидите варианты, открывать ли в сафари или в приложении. 
23
Praveen

Чтобы проверить Apple-app-site-association на стороне сервера, вы можете Использовать официальный валидатор Apple.

https://search.developer.Apple.com/appsearch-validation-tool/

21
Devy

Чтобы помочь отладить эту проблему, найдите «swcd» в выходных данных консоли вашего устройства при установке приложения, чтобы узнать, сработала или не удалась регистрация универсальной ссылки.

  1. Используйте реальное устройство, а не симулятор.
  2. Удалите приложение с вашего устройства.
  3. Подключите устройство к компьютеру и просмотрите выходные данные консоли устройства в xcode. (окно -> устройства -> [ваше устройство] -> просмотреть журналы устройства). Держите это окно открытым.
  4. Установите приложение и дайте ему запуститься.
  5. Фильтруйте вывод консоли на «swcd». Если это удачно, вы увидите что-то вроде следующего скриншота. Если это не удастся, вы увидите что-то еще. Если вы ничего не видите, вы пропустили что-то фундаментальное, например, добавление права Associated Domains.

 Applink added successfully

16
mpoisot

Я понял, что проблемой для меня было то, что ссылки на корневой каталог a (например, http://example.com/) не открывали мое приложение, но если я добавил путь (например, http://example.com/mypath), он работал. Добавление "/" к списку путей совпало с этим:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "TEAM_ID.BundleIdentifier",
                "paths": [ "*", "/" ]
            }
        ]
    }
}

Как ответил slutsker в this ветке форума разработчиков Apple.

15
tidbeck

Быстрые шаги, чтобы проверить, правильно ли вы внедрили Universal Link.

  • Нажмите и удерживайте ссылку, которую вы ожидаете запустить приложение. Вы должны увидеть «Открыть в [имя вашего приложения]» в контекстном меню.

  • Откройте приложение Notes, введите ссылку, которую вы ожидаете открыть приложение. Нажмите Готово. Ссылка станет желтой, и нажатие на нее должно открыть ваше приложение, а не Safari.

  • Если ссылка http://yourDomain.com не запускает приложение, попробуйте http://yourDomain.com/yourFolder/

  • В Safari, если в контекстном меню в Safari отображается «Открыть в [имя вашего приложения]», но при нажатии на ссылку открывается ссылка в самом Safari вместо запуска приложения,

    а. Попробуйте раскрыть страницу сафари, которая открывалась при нажатии на ссылку, как вы пытаетесь обновить. Должен появиться баннер, который может открыть ваше приложение. Нажмите на баннер, чтобы открыть приложение, закройте приложение, нажав кнопку «Домой», вернитесь в Safari и попробуйте запустить приложение, снова нажав ссылку. На этот раз приложение должно быть запущено, потому что нажатие на баннер должно было сохранить предпочтение открыть ссылку в приложении.

    б. Если приложение по-прежнему не запускается после шага a., Попробуйте отправить ссылку на веб-почту, такую ​​как gmail, откройте сайт веб-почты в Safari и попробуйте щелкнуть ссылку. Если это работает, возможно, вы пытались запустить приложение из того же домена, что и ссылка. Из того, что я видел, запуск приложения из того же домена в основном завершается неудачей. Вероятно, safari не захочет проверять, является ли целевой URL универсальной ссылкой, когда ссылка находится в том же домене, что и пользователь. Поэтому попробуйте запустить приложение из другого домена.

14
Nikhil Mathew

Также очень важно увеличить версию проекта или номер сборки после интеграции универсальных ссылок. Даже если вы удалите/переустановите, iOS не получит ссылки, если вы не измените версию. 

10
Kyle Truscott
  • Универсальные ссылки не будут работать, если вы вставите ссылку в поле URL браузера.

  • Универсальные ссылки работают с управляемым пользователем щелчком элемента <a href="...">через домены. Пример: если на google.com есть универсальная ссылка, указывающая на bnc.lt, приложение откроется.

  • Universal Links не будет работать с пользовательским элементом <a href="...">, щелкающим в том же домене. Пример: если на google.com есть универсальная ссылка, указывающая на другую универсальную ссылку на google.com, приложение не откроется.

  • Универсальные ссылки не могут быть запущены через Javascript (в window.onload или с помощью вызова .click () для элемента <a>), если это не является частью действия пользователя.

источник: https://dev.branch.io/getting-started/universal-app-links/support/ios/#appsbrowsers-that-support-universal-links

Третья пуля обошлась мне примерно в один день.

7
guido

Если здесь люди ищут другие решения, мы пошагово собрали пошаговую отладку Universal Links, так как мы увидели множество проблем, вызывающих МНОГО головных болей.

Проверьте это:

Руководство по отладке Universal Links

 Debugging Guide preview

Если вы просто хотите настроить Universal Links заново, это руководство действительно полезно:

Руководство по настройке iOS Deep Linking

Надеюсь, они полезны!

6
Chris Maddern

Наиболее распространенная причина - когда пользователь нажимает на верхний правый угол, что говорит iOS не открывать приложение (в данном случае Uber) в будущем.

 

Чтобы исправить, потяните вниз, чтобы открыть умный баннер, и нажмите ОТКРЫТЬ:

 Pull down in Safari, and OPEN again

Это будет впоследствии «помнить», чтобы открыть приложение.

5
samwize

Я просто подумал, что добавлю кое-что, что обнаружу на случай, если в будущем все больше людей столкнутся с теми же проблемами, что и я. В основном это связано с ошибками аутентификации.

Хотя Apple явно не заявляет об этом, файл Apple-app-site-association должен передаваться по протоколу https, даже если он подписан. Сертификат, используемый для https, также должен быть доверенным Apple. Таким образом, хотя сертификат, добавленный на устройство в меню «Настройки» -> «Основные» -> «Профили», разрешает использование https в сафари, он не позволяет работать универсальным ссылкам.

В журналах устройства при ошибке аутентификации между устройством и сервером будет напечатано значение, например "TrustResultValue" : 4. Значение TrustResultValue 5 означает, что сертификат относится к неправильному домену (например, test.com обслуживается с сайта www.test.com). Значение TrustResultValue 4 означает, что сертификат не является доверенным для этого использования.

Там может быть несколько полезных шагов для отладки здесь . Раздел «Проверка доступа к Apple-app-site-association» представляет собой пошаговое руководство, позволяющее убедиться, что устройство получает файл Apple-app-site-association. Шаги сводятся к:

  1. Удалите приложение. Это необходимо, поскольку файл загружается при установке.

  2. Остановить сервер от правильного обслуживания Apple-app-site-association.

  3. В xcode откройте Window -> Devices и выберите ваше устройство.

  4. Откройте журналы устройства, щелкнув треугольник внизу окна.

  5. Очистите журналы, нажав на корзину, чтобы очистить все предыдущие журналы, которые могут быть связаны.

  6. Переустановите приложение с помощью xcode, нажав кнопку воспроизведения.

  7. После запуска приложения, если устройство правильно запрашивает файл, в журналах устройства должна быть ошибка, которую можно найти, выполнив поиск «Apple-app-site-association».

Если файл Apple-app-site-association обслуживается правильно (шаг 2 пропущен), то ошибки не должно быть. Вместо этого может отображаться ошибка аутентификации, если это проблема.

5
Sam

Для тех, кому нужно легко проверить открытие (универсальных) ссылок, вы также можете открыть ссылку в своем симуляторе из терминала с помощью этой команды:

xcrun simctl openurl booted yourapp_or_http://yourlink

например:

xcrun simctl openurl booted https://www.google.com

4
morksinaanab

Мне понадобился день, чтобы понять это…. У меня возникла проблема не с загрузкой обновленных профилей обеспечения в XCode (я также перезапустил XCode после этого).

(Настройки> Аккаунты> Просмотр сведений> Загрузить все)

3
ken

Мне удалось заставить это работать, но это заняло довольно много времени и борьбы. Обратите внимание, что если вы не подпишитеApple-app-site-associationfile (подпись не обязательна!) Нажатие на ссылку в Safari not откроет ваше приложение (это вызвало у меня много головной боли ).

3
Attila Bardos

Вы можете проверить универсальные ссылки в симуляторе

Из Руководство по программированию поиска приложений: Поддержка универсальных ссылок

3
holmesal

Перейдите на сайт developer.Apple.com и отредактируйте один из своих профилей распространения. На странице редактирования вы можете открыть всплывающее окно для идентификаторов приложений , которое будет отображать список имен вашего приложения и в () круглых скобках после названия приложения оно показывает все ваши реальные идентификаторы приложения . Некоторые приложения могут иметь идентификатор вашей команды в качестве префикса, но некоторые делают not. Убедитесь, что вы используете именно то, что видите во всплывающем меню внутри (), и поместите его в поле appID сведений о связях Apple-app-site-site. У меня была именно эта проблема с приложением и его универсальными ссылками.

2
MacMark

На самом деле я не видел ту же самую комбинацию проблем/решений, которая заставила его работать на меня, поэтому мог бы также добавить мою, если у кого-то есть такая же проблема!

Для своего приложения я использую собственную схему URL (заданную в APP_TARGET > Info > URL Types) и задаю схему URL отсюда в консоли Firebase, чтобы она соответствовала, но все еще не работала. 

Моя проблема была на самом деле две проблемы:

Остерегайтесь, если проверка Автоматически управлять подписанием

Если вы проверяете настройку «Автоматически управлять подписью» в Xcode, как я, поскольку я просто пытался создать быстрое демо-приложение, вам нужно убедиться, что используемый TeamID совпадает с идентификатором в вашей консоли Firebase. Первоначально я зашел в свою учетную запись разработчика Apple и скопировал идентификатор команды со своей страницы членства, но позже увидел, что фактический идентификатор, используемый XCode, отличается. (Вы можете найти это в APP_TARGET > General > Signing > Signing Certificate. для меня это выглядело как iPhone Developer: My Name (TEAM_ID)).

Префикс вашего TeamID к идентификатору пакета в ваших типах URL  

После того, как я убедился, что они совпадают в моей консоли Firebase и Xcode, моей следующей проблемой стал идентификатор моей схемы URL. Обычно здесь используется ваш идентификатор пакета, но Firebase на самом деле префиксует его с идентификатором команды, который вы указали в консоли Firebase, поэтому мне пришлось добавить его к идентификатору в разделе типов URL в XCode. 

После этих двух исправлений и повторной загрузки файла GoogleService-Info.plist я без проблем открыл свои динамические ссылки.

2
Kyle H

Мы добавили Apple-app-site-association файл в это место:

https://example.com/Apple-app-site-association

На iOS 9 все работало нормально, но на iOS 10 не работало.

Оказалось, что проблема связана с .well-known path:

https://example.com/.well-known/Apple-app-site-association

Из-за https://example.com/.well-known/Apple-app-site-association путь перенаправлен на https://example.com

<Notice>: Allowing redirect 'https://example.com/.well-known/Apple-app-site-association' -> 'https://example.com/'
<Notice>: ### Rejecting AASA file size 154466 for URL https://example.com/.well-known/Apple-app-site-association

По моему мнению, если каким-то образом хорошо известный путь не работает правильно, он нарушает универсальные ссылки. 

2
Andrey Banshchikov

Для меня моя ошибка заключалась в том, что наш сайт перенаправлял www.domain.com на domain.com, поэтому все www.domain.com/* не будут работать из-за этого. Надеюсь, это поможет.

1
wzhang84

После двух дней полного отчаяния я думаю, что наконец-то все исправил. Вот мое решение:

Кажется, что старые приложения используют другой префикс приложения, чем новые приложения. В новых приложениях для этой цели используется только Team ID. Если префикс приложения и идентификатор команды не идентичны, то вам необходимо указать поле продолжения активности в файле ассоциации сайта приложения Apple:

{
    "activitycontinuation": {
        "apps": [
            "YOUR_APP_PREFIX.de.company.app"
        ]
   },
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "YOUR_APP_PREFIX.de.company.app",
        "paths": ["/*"]
      }
    ]
  }
} 

Еще одна вещь, которую я испытал во время своей адской поездки, заключалась в том, что удаление приложения и перезапуск устройства, по-видимому, являются единственным способом принудительного обновления этого файла.

1
Sebastian Boldt

Через два дня у меня выяснилось, что такого рода ссылки (из ветки) 

applinks: xxxx.app.link

работать только после архивации (также Ad-hoc) приложения и установки его на телефон.

1
Bence Pattogato

Проблемой для меня оказался файл Apple-app-site-association. Согласно документации Apple, требуется только параметр applinks. Я добавил параметр activitycontinuation, и это сработало.

{
  "activitycontinuation": {
    "apps": [
      "9JA89QQLNQ.com.Apple.wwdc"
    ]
  },
  "applinks": {
    "apps": [],
    "details": [{
        "appID": "9JA89QQLNQ.com.Apple.wwdc",
        "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*" ]
      }]
  }
}
1
Chris

Я смог протестировать Universal Links в iOS Simulator с помощью приложения Календарь. 

Я только что создал событие и добавил URL-адрес, который хотел проверить, в поле URL события. Затем, при просмотре созданного события, вы можете просто нажать на ссылку URL, и ваше приложение должно открыться.

1
Tiago Alves

Для будущих читателей, которые найдут эту страницу ...

У меня была похожая ситуация. Однако в моей ситуации iOS10 работала AOK, и, что бы я ни делал (поднять номера сборки, удалить/переустановить и т.д.), IOS9, похоже, отказывался работать.

Я пришел к этому с iOS10, и мне нужно было поддерживать iOS9. В то время в документации здесь - https://developer.Apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html - четко указано, что файл может быть помещен в корень веб-сервер (например, /Apple-app-site-association) или в хорошо известной папке (например, /.well-known/Apple-app-site-association). Поскольку я также поддерживаю Android, который также использует папку .well-known для аналогичного файла, я решил добавить туда оба.

При новой установке на iOS10 он явно запрашивает корневой файл, завершается ошибкой, затем запрашивает хорошо известный файл и успешно завершается.

Для iOS9 он явно запрашивал корневой файл, не работает и больше ничего не делает.

Решение: если вы поддерживаете iOS9, поместите файл в /Apple-app-site-association.

0
greymouser

В моем случае запрос на файл AASA по адресу: https://example.com/Apple-app-site-association

Перенаправляется на: https://www.example.com/Apple-app-site-association

Кикер - это прекрасно работает на iOS 11, но не работает на iOS 9.3.5. Пойди разберись.

Решение: файл Apple-app-site-association НЕ ДОЛЖЕН быть за редиректом 302 или 301 для iOS 9. (Справедливости ради, это отмечено на странице устранения неполадок UL .)

0
Jeff Ward

В моем случае моей ошибкой было поместить параметры запроса в пути:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "TEAM_ID.BundleIdentifier",
                "paths": [ "/auth-ui/hub?target=confirm&*" ]
            }
        ]
    }
}

когда я удаляю '? target = verify & *' из путей, он начинает работать

0
Vins

Для меня, после реализации всех ответов сверху и проверки того, что файл AASA действительно загружался с ответом mpoisot, моя проблема заключалась в том, что в Xcode я добавил связанный домен как:

applinks:example.com

и в моем приложении заметок я пытался использовать:

Https://example.com

потому что мой AASA не подписан, и я хотел убедиться, что я обслуживаю его через HTTPS. Это сработало, когда в моем приложении заметок я попытался использовать:

 example.com

Это работает для меня на физическом устройстве, используя iOS 12.1.2 с компоновкой разработки из Xcode или компоновкой дистрибутива из Testflight

0
Jorge Duque