【问题标题】:Why is my Plaid Link Integration not opening the Link UI为什么我的格子链接集成没有打开链接 UI
【发布时间】:2021-04-02 07:41:49
【问题描述】:

我正在尝试与 Plaid 集成,他们的文档是一个令人困惑的链接,他们的支持团队告诉我他们正在努力。我还联系了他们,看看他们是否可以帮助我完成当前的集成,但他们告诉我他们无法查看我的代码,因为每个集成都是不同的。

根据 Plaid 文档,我将我的 ngrok url 添加到仪表板的重定向 uri 部分(这适用于 Plaid Link 演示应用程序:https://github.com/plaid/plaid-link-ios)。

我还添加了允许任意加载到 info plist。

我能够启动并运行他们的 Plaid Link 演示应用,但是当我尝试将此代码放入我的项目中时,我收到以下错误:

Thread 12: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)


// MARK: Start Plaid Link using a Link token
    // For details please see https://plaid.com/docs/#create-link-token
    func presentPlaidLinkUsingLinkToken() {

        #warning("Replace <#GENERATED_LINK_TOKEN#> below with your link_token")
        // In your production application replace the hardcoded linkToken below with code that fetches an link_token
        // from your backend server which in turn retrieves it securely from Plaid, for details please refer to
        // https://plaid.com/docs/#create-link-token

        let linkToken = "TOKEN HERE"

        // <!-- SMARTDOWN_PRESENT_LINKTOKEN -->
        // With custom configuration using a link_token
        var linkConfiguration = LinkTokenConfiguration(token: linkToken) { success in
            print("public-token: \(success.publicToken) metadata: \(success.metadata)")
        }
        linkConfiguration.onExit = { exit in
            if let error = exit.error {
                print("exit with \(error)\n\(exit.metadata)")
            } else {
                print("exit with \(exit.metadata)")
            }
        }

        let result = Plaid.create(linkConfiguration)
        switch result {
        case .failure(let error):
            print("Unable to create Plaid handler due to: \(error)")
        case .success(let handler):
                // UI Update code here
                handler.open(presentUsing: .viewController(self))
                self.linkHandler = handler
            
        }

        // <!-- SMARTDOWN_PRESENT_LINKTOKEN -->
    }
   
    
    @IBAction func refreshButtonAction(_ sender: Any) {
        
            // UI Update code here
            self.presentPlaidLinkUsingLinkToken()
    
        
        
    }

我尝试将self.presentPlaidLinkUsingLinkToken() 放入以下sn-p:

DispatchQueue.main.async {
        self.presentPlaidLinkUsingLinkToken()
    }

另外,根据 Plaid 文档,我在我的 App 委托 swift 文件中添加了以下方法:

// MARK: Continue Plaid Link for iOS to complete an OAuth authentication flow
// <!-- SMARTDOWN_OAUTH_SUPPORT -->
func application(_ application: UIApplication,
                 continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
) -> Bool {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let webpageURL = userActivity.webpageURL else {
        return false
    }

    // Check that the userActivity.webpageURL is the oauthRedirectUri
    // configured in the Plaid dashboard.
    guard let linkOAuthHandler = window?.rootViewController as? LinkOAuthHandling,
        let handler = linkOAuthHandler.linkHandler,
        webpageURL.host == linkOAuthHandler.oauthRedirectUri?.host &&
        webpageURL.path == linkOAuthHandler.oauthRedirectUri?.path
    else {
        return false
    }

    // Continue the Link flow
    if let error = handler.continueFrom(redirectUri: webpageURL) {
        print("Unable to continue from redirect due to: \(error)")
    }

    return true
}
// <!-- SMARTDOWN_OAUTH_SUPPORT -->

但同样的错误发生了。任何建议将不胜感激。

【问题讨论】:

    标签: swift plaid


    【解决方案1】:

    如果有人对此有疑问,我能够解决。在他们的 cocoapod 中这是不正确的。有一次,我下载并拖动 LinkKit 框架,一切都按预期工作。 Plaid 在他们的演示项目中也没有使用他们自己的 cocoapod,他们进行手动安装。也许他们正在研究这个问题。

    【讨论】:

      【解决方案2】:

      如果没有看到您的应用程序中调用presentPlaidUsingLinkToken() 的代码,很难判断,但您的应用程序在Thread 12 上崩溃了。 UIKit 不是多线程的,因此如果您在后台线程上呈现视图控制器,您可能会遇到崩溃。

      我看到您尝试了DispatchQueue.main.async,但我怀疑您可能遇到了另一个线程问题。

      【讨论】:

        【解决方案3】:

        只是把它放在那里,因为这是这个问题的少数结果之一:我的问题是我没有保留 Handler 对象。结果,Plaid UI 永远不会出现,也不会触发任何事件,给我留下了无尽的旋转器。只需在类中维护引用就可以了(如示例项目中所示,并在文档中提到)。

        【讨论】:

          【解决方案4】:

          Kona Farry 的上述解决方案有效。来自格子文档:

          Create a Handler - A Handler is a one-time use object used to open a Link session. The Handler must be retained for the duration of the Plaid SDK flow.

          【讨论】:

            猜你喜欢
            • 2017-11-13
            • 2014-01-26
            • 1970-01-01
            • 1970-01-01
            • 2020-12-18
            • 2017-12-03
            • 2023-03-24
            • 1970-01-01
            • 2022-01-26
            相关资源
            最近更新 更多