【问题标题】:Safari cannot open the page - The error was, "The URL can't be shown" - related to Deeplinks?Safari 无法打开页面 - 错误是“无法显示 URL” - 与 Deeplinks 相关?
【发布时间】:2018-10-25 15:30:22
【问题描述】:

所以我试图在这样的 iOS 应用中使用深层链接(注意,这里的域是一个虚拟值):

static let redirectUrlStr = "domain://domain:success"

private let redirectUrl = URL(string: .redirectUrlStr)!

我将此作为重定向传递给 AppAuth 请求:

let request = OIDTokenRequest(configuration: config!,
                              grantType: .refreshGrantType,
                              authorizationCode: nil,
                              redirectURL: self.redirectUrl,
                              clientID: .clientId,
                              clientSecret: nil,
                              scopes: [OIDScopeOpenID, OIDScopeProfile, OIDScopeEmail],
                              refreshToken: userCredentials.refreshToken,
                              codeVerifier: nil,
                              additionalParameters: nil)

这部分似乎一切正常,如果我传入像 google.com 这样的重定向 URL,重定向到 google 就可以了。

但是,当尝试使用深度链接时,出现上述错误。

现在我认为这应该可行 -

我已经在 Xcode 的功能部分中启用了相关域:

applinks:domain.com

我在 Apple Developer 的 App ID 中启用了关联域

这里缺少什么?我需要一个 apple-app-site-association 文件吗?

我之前只使用过一次深度链接,所以我不太清楚我可能会丢失什么。

还有一个包含相关域信息的权利文件。

【问题讨论】:

  • 我从不在这个主题上编码,但这可能会有所帮助:-stackoverflow.com/questions/8887086/…
  • 您是否尝试过使用“domain://domain?success”,因为 domain:success 意味着您的端口是“成功的”,它应该是一个 Int,而不是一个字符串
  • @CZ54 - 这会导致应用崩溃。
  • 什么是崩溃信息?

标签: ios swift deep-linking


【解决方案1】:

如果你想用 URL 调用你的应用,你必须在你的项目信息中设置URLType

注意,您必须选择编辑器作为RoleURL scheme。 现在您可以使用domain:// 调用您的应用程序,您可以在此url 后面加上任何查询或路径参数,您可以将其传递给您的应用程序,例如:domain://users?id=12

如果您需要将原始域转发到您的应用,例如:www.domain.com/users 而不是 domain://usersYES 您需要 apple-app-site-association 上传到您主机的根目录。因此 iOS 可以检测到它并且如果用户喜欢,您的应用将打开并将相应的 url 传递给您的应用。

这两种方法各有优缺点。 InstagramAppStore 使用其原始域和关联的 apple-app-site-association 文件。但是 Google 正在为 google 登录 等任务使用 URL 方案

【讨论】:

  • Hrm,这是目前在应用程序中设置的。它有一个标识符,设置了 url 方案,并且角色设置为编辑器。我将不得不调查这个过程是否有问题是问题的一部分
  • 你可以测试一下。尝试在 safari 中打开 domain:// 看看是否有效。如果没有,如果你能得到一些屏幕截图,让我看看我是否能找到问题,那就太好了;)(在上传之前覆盖敏感数据)
  • 进展如何@AndrewAlexander?找到问题了吗?
  • 在我发布问题之前,URL 方案已经存在,所以我不太确定在这里测试什么。是的,当我输入“domain://”时,它会将我链接到身份验证页面。但是,当我尝试使用上述 OIDTokenRequest 进行身份验证时,我会收到相同的错误消息。所以我认为 URL 方案本身不是问题。
  • 你想要什么截图?
【解决方案2】:

我认为这可能与您应用的 URL 方案处理有关。如果您没有更新您的 plist 以通知操作系统您对 domain URL 方案的处理,那么它将被视为输入错误的 URL。尝试将domain 添加到URL Types -> URL SchemesInfo.plist 文件中。您可以通过以下方式执行此操作:

  <key>CFBundleURLTypes</key>
  <array>
    <dict>
        <key>CFBundleURLName</key>
        <string>com.domain</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>domain</string>
        </array>
    </dict>
  </array>

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    您好,我正在使用由 fire base 生成的深层链接 url。

    我可以在 google 和 safari 中打开这个网址,我的代码是

    /// Deepl link Shared Link
        func deepLinkShare(_ data: CSSharedObject, sender: Any, isVideoDetail: Bool = false) {
            let button = sender as? UIButton
            button?.startAnimating()
            let videoLink = SHAREURL + "video/" + data.videoSlug + "?videoId=" + String(data.videoId)
            guard let link = URL(string: videoLink) else { return }
            let dynamicLinksDomain = DEEPLINKDOMAIN
            let linkBuilder = DynamicLinkComponents(link: link, domain: dynamicLinksDomain)
            linkBuilder.iOSParameters = DynamicLinkIOSParameters.init(bundleID: Bundle.main.bundleIdentifier!)
            linkBuilder.iOSParameters?.customScheme = CUSTOMURLSCHEME
            linkBuilder.iOSParameters?.minimumAppVersion = "1.0"
            linkBuilder.navigationInfoParameters?.isForcedRedirectEnabled = false
            linkBuilder.iOSParameters?.appStoreID = "123456789"
            linkBuilder.analyticsParameters = DynamicLinkGoogleAnalyticsParameters(source: "asfdsf",
                                                                                   medium: "video",
                                                                                   campaign: "Share")
            linkBuilder.socialMetaTagParameters = DynamicLinkSocialMetaTagParameters()
            linkBuilder.socialMetaTagParameters?.title = data.videoTitle
            linkBuilder.socialMetaTagParameters?.descriptionText = data.videoShortDescription
            linkBuilder.socialMetaTagParameters?.imageURL = data.thumbNailimage
            linkBuilder.androidParameters = DynamicLinkAndroidParameters(packageName: ANDROIDAPPBUNDLE)
            linkBuilder.options = DynamicLinkComponentsOptions()
            linkBuilder.options?.pathLength = .short
            guard let longDynamicLink = linkBuilder.url else { return }
            DynamicLinkComponents.shortenURL(longDynamicLink, options: nil) { url, _, error in
                button?.stopAnimating()
                guard let url = url, error == nil else { return }
                /// item to be shared
                let shareItems: Array = [url.absoluteString] as [Any]
                self.openSharePopUp(sender, sharedItems: shareItems, isVideoDetail: isVideoDetail)
            }
        }
    
    1. CSSShared 对象是一个具有自定义对象的对象
    2. data.videoSlug是用来构建url的item数据
    3. DEEPLINKDOMAIN 是由 Firebase 生成的 deeplink Domain 的域
    4. CUSTOMURLSCHEME 是为该特定应用程序生成的自定义方案

    然后可以使用fire base动态链接的委托在应用程序中打开它

    func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
                         annotation: Any) -> Bool {
            if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
                /// Open the dynamic link url in your application
    
                return true
            }
        }
    

    【讨论】:

      【解决方案4】:

      答案是,由于 App Store 中已经存在 URL 方案标识符,它被认为是重复的,这导致了 Apple 所描述的“奇怪行为”。

      切换到更唯一的 URL 方案标识符立即解决了问题。

      【讨论】:

        猜你喜欢
        • 2013-03-19
        • 1970-01-01
        • 2012-03-07
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多