Этот ответ, возможно, не решит вашу проблему, но даст вам несколько вещей, которые вы можете попробовать, и вы научитесь на этом пути. К сожалению, я не смог заставить вызываемый https работать с эмулятором. Я, вероятно, скоро сообщу о проблеме на github. Приложение флаттера продолжает получать разные типы нешифруемых ошибок в зависимости от локального URL-адреса, который я пробую.
Хорошо, что вы исправили одну из проблем: вы использовали триггер документа (onCreate
) вместо вызываемого HTTPS. Но теперь вы используете протокол HTTPS, и приложения Flutter должны напрямую взаимодействовать с вашими функциями. В будущем вы могли бы запускать эмулятор функций локально и много console.log
'понять, запускается ли он на самом деле.
У меня есть несколько вопросов / вещей, которые вы можете попробовать:
- Ваш пользователь вошел в приложение флаттера?
FirebaseAuth.instance.currentUser()
скажет вам. - Эта проблема возникает как на iOS, так и на android?
- Добавьте несколько журналов в вашу функцию машинописи и повторите развертывание. Читайте последние журналы через StackDriver или в терминале,
firebase functions:log --only sendToDevice
. (sendToDevice - это название вашей вызываемой функции) - Развертываете ли вы в облаке и тестируете с последним развертыванием ваших функций? На самом деле вы можете протестировать с локальным эмулятором . На Android URL-адрес
10.0.2.2:5001
, как показано выше. Вам также нужно запустить adb reverse tcp:5001 tcp:5001
в терминале. Если вы находитесь в облаке, то firebase login
не имеет значения, Я думаю, ваши функции уже должны иметь учетные данные.
Чтобы вызвать эмулятор, вызываемый по протоколу https:
HttpsCallable callable = CloudFunctions.instance
.useFunctionsEmulator(origin: "http://10.0.2.2:5001")
.getHttpsCallable(functionName: "sendToDevice");
и iOS вам нужно следовать решению здесь .
Одна ошибка, которую я обнаружил. Вы должны, по крайней мере, сделать return await fcm.sendToDevice()
там, где вы ожидаете разрешения обещания, потому что в противном случае среда выполнения облачной функции прекратит работу вашей функции, прежде чем она разрешится. В качестве альтернативы, для отладки, вместо возврата sendToDevice
в облачную функцию, вы могли бы сохранить ее в переменную и console.log
. Вы увидите его обещание (или будущее в терминологии дротика), которое на самом деле не решено.
const messagingDevicesResponse: admin.messaging.MessagingDevicesResponse = await fcm.sendToDevice(
token,
payload
);
console.log({ messagingDevicesResponse });
return;