我正在尝试将 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);
}
}
感谢任何形式的反馈,谢谢!