firebase踩坑被折磨的一周

最近一周基本都是被firebase的各种坑折磨得不行不行的。

firebase命令走不了代理的问题

为了方便管理项目,firebase提供了firebase cli,官方是提供了standalone binary,其实就是把各种nodejs的依赖库全打包到了一个200多M的文件里。众所周知的原因,国内使用firebase需要走代理,结果这个工具不支持别的代理方式,只支持https_proxy,但是使用https_proxy又一直报错:


Proxy connection ended before receiving "CONNECT response"

一开始以为代理有问题,后来换了各种,发现还是不行,网上说要修改firebase其中读取代理地址的代码,于是又改用brew进行安装firebase,这样就不是standalone binary了,改了一通之后发现还是不行,又有说这是nodejs本身的问题,nodejs不能很好的处理代理与https2.0的CONNECT请求。那么就只能使用全局vpn了。

先是搭建了pptp,使用的是accel-ppp这个开源软件,学习了一番后就跑起来了,有趣的是建立ppp连接后,只能访问server端的内网,不能通过server机器访问外网,配置各种ip route后无果。网上有文章说是要换一台机器试试,说可能跟linux内核有关,于是换了个aws的海外机器,结果直接报l2tp kernal module不存在,aws机器的linux内核不可能那么老,只能说是被定制过的。

搭vpn还是太麻烦,换个简单的吧,于是尝试proxychain-ng,这个软件是通过替换系统的底层lib库,将网络请求转到socks5上,这样可以实现强制代理,而不是靠目标软件自己是否识别https_proxy之类的环境变量。不过proxychain-ng有两大问题,一个是需要关闭mac系统的完整性保护才行,毕竟是要替换系统底层库,一不小心可能会把系统搞崩了;另一个是有些复杂软件底层网络是自己通过tcp/udp实现的通信协议,proxychain-ng也是不起作用的,比如可以用于wget curl之类的命令,但是别想着用在chrome或者ios simulator上。

关于mac系统的完整性保护(System Integrity Protection),过去安装软件时,需要sudo临时获取root权限,一旦root之后,那么任何操作都是可选的,包括删除系统文件,苹果为了防止这种情况,就又加了一层保护。所以完整性保护时,就算是root权限,有些文件也是动不了的。检查系统完整性设置状态:


csrutil status

关闭系统完整性保护,需要重启电脑,按command+r,进入mac系统恢复界面的terminal,然后执行如下命令再重启:


csrutil disable

经过这一波折腾,firebase login终于是成功了。

firebase_core初始化一直失败

接着发现在android上,初始化flutter firebase插件,一切正常,而到iOS上却一直报错,其实就很简单的代码:


await Firebase.initializeApp(
    ....
);

如果用最新版本的firebase,就报:


'[ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: 
PlatformException(channel-error, Unable to establish connection on channel., null, null)'

以为是新版本才有的问题,就回退到老版本,则报:


Unhandled Exception: MissingPluginException(No implementation found for method Firebase#initializeCore on channel 
plugins.flutter.io/firebase_core

网上番了大量的文章,基本都是说依赖没有更新,只要flutter clean,或者pod update一下就好了,但我反复更新,都无济于事。好不容易找到一个人提了一嘴,是不是因为使用了flutter_apns导致的,我一想,确实基于这个插件做了个新的推送插件,仔细一查才发现:


+ (void)load {
    if ([self getFlag:@"disable_swizzling" defaultValue: NO]) {
        return;
    }

    if ([self getFlag:@"disable_firebase_core" defaultValue: YES]) {
        [self disablePluginNamed:@"FLTFirebaseCorePlugin"];
    }

    [self disablePluginNamed:@"FLTFirebaseMessagingPlugin"];
}

 flutter里一个插件可以为了避免功能冲突(使用firebase的fcm代理apns推送,还是直接使用apns推送),而直接禁用掉别的插件。因为firebase_core被禁用了,所以会报channel找不到。

如果要使用firebase,但又不使用firebase的apns代理推送功能,就需要在plist里添加:


<key>FirebaseAppDelegateProxyEnabled</key>
<false/>

如果使用flutter_apns,但又避免firebase被disable,又需要在plist里添加:


<key>flutter_apns.disable_firebase_core</key>
<false/>

最近真是各种踩坑的一周!

发表于 2023年11月18日 18:03   修改于 2023年11月18日 22:27   评论:0   阅读:434  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo