Flutter DeepLink работает на Android, но не на iOSAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Flutter DeepLink работает на Android, но не на iOS

Сообщение Anonymous »

У меня возникла проблема с глубокими ссылками в iOS Flutter. Я присоединяюсь к команде, которой нужны глубокие ссылки на iOS, а они работают только на Android. У меня есть 3 класса:
Блок глубоких ссылок Flutter

Код: Выделить всё

import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:fertil_wallet/models/deep_link_route.dart';
import 'package:fertil_wallet/pages/pagar/pago_con_link/pago_con_link.dart';
import 'package:flutter/services.dart';
import 'package:meta/meta.dart';
import 'package:url_launcher/url_launcher_string.dart';
part 'deeplink_event.dart';
part 'deeplink_state.dart';

class DeeplinkBloc extends Bloc {
//Event Channel creation
static const streamObj = const EventChannel('wallet/events');

final String webDomain;
final TargetPlatform _targetPlatform;

//Method channel creation
static const platform = const MethodChannel('wallet/channel');

DeeplinkBloc(this.webDomain, this._targetPlatform)
: super(DeeplinkState(null, false)) {
startUri();
streamObj.receiveBroadcastStream().listen((d) => _onRedirected(d));

on((event, emit) => emit(DeeplinkState(event.route, false)));
on(
(event, emit) => emit(DeeplinkState(null, true)));
}

_onRedirected(String uri) {
// Here can be any uri analysis, checking tokens etc, if it’s necessary
// Throw deep link URI into the BloC's stream

var uriSections = uri.split("/");
var i = uriSections.indexOf(webDomain);
if (i == -1) return; //no es un link de el dominio de la app
uriSections = uriSections.sublist(i + 1, uriSections.length);
if (uriSections[0] != "app") return;

DeepLinkRoute? route;
switch (uriSections[1]) {
case "lc":
route = DeepLinkRoute(
route: PagoConLinkPage.route,
arguments: uriSections.length >= 2 ? uriSections[2] : "",
);
this.add(LinkRecieved(route));
return;
case "ob":
this.add(OnboardingCompletedExternally());
return;
case "recover_password":
case "account_activation":
launchUrlString(uri, mode: LaunchMode.externalApplication);
return;
default:
return;
}
}

Future startUri() async {
try {
//if (_targetPlatform != TargetPlatform.iOS) {
var url = await platform.invokeMethod('nani');

_onRedirected(url);

// return url;
} on PlatformException catch (e) {
return "Failed to Invoke: '${e.message}'." as Future;
} catch (e) {
return "Failed to Invoke: '$e'."  as Future;
}
}
}
после этого у меня есть собственный класс Android:

Код: Выделить всё

package com.ayj.wallet

import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterFragmentActivity
// import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine

import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant

import io.flutter.plugin.common.EventChannel
import io.flutter.plugin.common.EventChannel.EventSink

import android.content.Intent
import android.content.Context

import android.content.BroadcastReceiver

class MainActivity: FlutterFragmentActivity () {

private val CHANNEL = "wallet/channel"
private val EVENTS = "wallet/events"
private var startString: String? = null
private var linksReceiver: BroadcastReceiver? = null

override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
val intent2 = getIntent()
startString = intent2.data?.toString()
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
if (call.method == "nani") {
if (startString != null) {
result.success(startString)
}
}
}
EventChannel(flutterEngine.dartExecutor.binaryMessenger, EVENTS).setStreamHandler(
object : EventChannel.StreamHandler {
override fun onListen(args: Any?, events: EventSink) {
linksReceiver = createChangeReceiver(events)
}

override fun onCancel(args: Any?) {
linksReceiver = null
}
}
)
}

override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
if (intent.action === Intent.ACTION_VIEW) {
linksReceiver?.onReceive(this.applicationContext, intent)
}
}

fun createChangeReceiver(events: EventSink): BroadcastReceiver? {
return object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { // NOTE: assuming intent.getAction() is Intent.ACTION_VIEW
val dataString = intent.dataString ?:
events.error("UNAVAILABLE", "Link unavailable", null)
events.success(dataString)
}
}
}
}
и последнее — это класс appdelegate, внутри которого я поместил код:

Код: Выделить всё

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
private let CHANNEL = "wallet/channel"
private let EVENTS = "wallet/events"
private var startString: String?

override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
let flutterViewController: FlutterViewController = window?.rootViewController as! FlutterViewController

let methodChannel = FlutterMethodChannel(name: CHANNEL, binaryMessenger: flutterViewController.binaryMessenger)
methodChannel.setMethodCallHandler { [weak self] (call: FlutterMethodCall, result: FlutterResult) in
if call.method == "nani" {
if let startString = self?.startString {
result(startString)
}
}
}

let eventChannel = FlutterEventChannel(name: EVENTS, binaryMessenger: flutterViewController.binaryMessenger)
eventChannel.setStreamHandler(StreamHandler())

// Handling deep link if the app is opened via a deep link
if let url = launchOptions?[.url] as? URL {
processDeepLink(url)
}

return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}

override func application(_ app: UIApplication, open url: URL,
options: [UIApplication.OpenURLOptionsKey : Any] = [:]) ->  Bool {
processDeepLink(url)
return true
}

private func processDeepLink(_ url: URL) {
startString = url.absoluteString
if let flutterViewController = window?.rootViewController as? FlutterViewController {
let methodChannel = FlutterMethodChannel(name: CHANNEL, binaryMessenger: flutterViewController.binaryMessenger)
methodChannel.invokeMethod("nani", arguments: nil) { (result) in
print("Deep link processed: \(String(describing: result))")
}
}
}
}

class StreamHandler: NSObject, FlutterStreamHandler {
var eventSink: FlutterEventSink?

func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
eventSink = events
return nil
}

func onCancel(withArguments arguments: Any?) -> FlutterError? {
eventSink = nil
return nil
}
}

Проблема в том, что приложение iOS не перенаправляет меня в представление, appdelegate не может получить глубокую ссылку и отправить флаттер.
Когда я отлаживаю строки в блоке идут хорошо, но метод _onRedirect iOS никогда не заходит.
Если я отправляю глубокую ссылку из приложения, меня всегда отправляет домой, и я не могу перенаправить, когда я пробую то же самое на Android, все работает хорошо.
/>У меня есть все конфигурации (apple-app-site-association, связанные домены, EnableFlutterLink включено «Да»)

Подробнее здесь: https://stackoverflow.com/questions/783 ... not-in-ios
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • В случае Deeplink при повторном открытии приложения оно неожиданно возобновляется на экране DeepLink вместо начального э
    Anonymous » » в форуме Android
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Приложение Flutter Deeplink открывает приложение для Android, но не может открыть приложение для iOS
    Гость » » в форуме IOS
    0 Ответы
    100 Просмотры
    Последнее сообщение Гость
  • Приложение Flutter Deeplink открывает приложение для Android, но не может открыть приложение для iOS
    Anonymous » » в форуме IOS
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous
  • Flutter DeepLink — GoRouter
    Anonymous » » в форуме Android
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Flutter DeepLink — GoRouter
    Anonymous » » в форуме Android
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»