Safari无法打开页面-错误是“无法显示URL”-与Deeplinks有关?

时间:2018-10-25 15:30:22

标签: ios swift deep-linking

因此,我试图在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文件吗?

我以前只使用过一次深层链接,所以我不太清楚自己可能会缺少什么。

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

4 个答案:

答案 0 :(得分:4)

如果要使用URL调用应用,则必须在项目信息中设置URLType

enter image description here

注意,您必须选择编辑者作为Role中的URL scheme。 现在,您可以使用domain://来调用您的应用,并且可以在此url后面加上要传递给应用的查询或路径参数,例如:domain://users?id=12

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

这两种方法都有其优点和缺点。 Instagram AppStore 使用其原始域以及关联的apple-app-site-association文件。但是 Google 正在将URL方案用于 google登录之类的任务 enter image description here

答案 1 :(得分:1)

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

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

希望这会有所帮助。

答案 2 :(得分:0)

您好,我正在使用由火力基地生成的深层链接网址。

我可以在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. CSShared对象是具有自定义对象的对象
  2. data.videoSlug是用于构造网址的项目数据
  3. DEEPLINKDOMAIN是Deeplink域的域,由火力基础生成它
  4. CUSTOMURLSCHEME是为该特定应用程序生成的自定义方案

然后可以使用火力基地动态链接的委托在应用程序中打开

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
        }
    }

答案 3 :(得分:0)

答案是,由于App Store中已经存在URL方案标识符,因此将其视为重复项,这导致Apple称之为“奇怪行为”。

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

相关问题