0

我正在尝试将 TikTok 身份验证添加到我的 Flutter 应用程序(目前仅限 iOS)。我的第一个意图是为此使用TikTok 的 Login Kit,然后我开始研究如何从 Flutter 调用原生 iOS 代码

我已经设法设置了必要的管道,以便从 Flutter 调用 iOS 代码,但是当我想要响应结果时,我遇到了问题。

TikTok 身份验证流程启动良好,我被带到手机上的 TikTok 应用程序,在那里我可以进行身份​​验证或取消,最后被重定向回我的应用程序。因此,我希望completion调用闭包,在那里我可以将响应报告给 Flutter。这似乎不会发生。

这是我的 AppDelegate.swift

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        
        let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
        let channel = FlutterMethodChannel(name: "com.flutter.tiktok", binaryMessenger: controller as! FlutterBinaryMessenger)
        
        channel.setMethodCallHandler { (methodCall : FlutterMethodCall, result : @escaping FlutterResult) -> Void in
            if methodCall.method == "OpenTiktok"
            {
                let scopes = ["user.info.basic"]
                let scopesSet = NSOrderedSet(array:scopes)
                let request = TikTokOpenSDKAuthRequest()
                request.permissions = scopesSet
                request.state = "1234567890"
                
                request.send(controller, completion: { (resp : TikTokOpenSDKAuthResponse) -> Void in
                    result(resp.code ?? "NO_CODE") // <-- THIS DOES NOT HAPPEN
                })
            }
        }
        
        GeneratedPluginRegistrant.register(with: self)
        TikTokOpenSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
        
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
    
    override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        guard let sourceApplication = options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
              let annotation = options[UIApplication.OpenURLOptionsKey.annotation] else {
                  return false
              }
        
        if TikTokOpenSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: sourceApplication, annotation: annotation) {
            return true
        }
        return false
    }
    
    override func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        if TikTokOpenSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) {
            return true
        }
        return false
    }
    
    override func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
        if TikTokOpenSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: nil, annotation: "") {
            return true
        }
        return false
    }
}

以下是我触发 Flutter 消息的方式:

Future<void> openTiktok() async {
  try {
    var code = await platform.invokeMethod("OpenTiktok");
    setState(() {
      _code = code;
    });
  } catch (e) {
    print(e);
  }
}

感谢任何形式的反馈,谢谢!

4

1 回答 1

0

终于可以开始工作了,它与 Flutter 完全没有关系,纯粹是 iOS 的东西。从这个 SO question中得到了一些灵​​感。

我必须做的是调整第二个application覆盖。options字典似乎总是空的,导致返回false

这是该应用程序覆盖的最终版本:

override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
    if TikTokOpenSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: nil, annotation: "") {
        return true
    }
    return super.application(app, open: url, options: options)
}

谢谢

于 2022-01-04T10:17:13.323 回答