在Flutter中,不使用Xcode,在哪里保存GoogleService-Info.plist文件?

29

我的应用程序已经在Google Play和iTunes上提交、审核并上线,但最近我添加了firebase_messaging插件进行通知功能。

加入Firebase Cloud Messaging时,谷歌强制我下载两个文件:

  • google-services.json - 保存在我的Flutter应用程序文件夹中:MyApp\android\app
  • GoogleService-Info.plist - 我不知道该把它保存在哪里,但尝试过将其保存在MyApp\ios\RunnerMyApp\ios\Runner.xcodeworkspace中均未成功。

所有的教程都指向使用Xcode来正确设置GoogleService-Info.plist文件,但我没有一台Mac电脑,我一直在使用Windows应用程序AppUploader成功地提交我的iOS应用。

有没有办法不使用Xcode,也能够将GoogleService-Info.plist文件附加到我的项目中呢?

3个回答

19

如果你想避免使用Xcode,你必须手动编辑此文件:/ios/Runner.xcodeproj/project.pbxproj

在构建过程中,您将需要引用GoogleService-Info.plist以使其包含在内。

以下是您需要添加行的4个不同部分(请参见GoogleService-Info.plist的示例行):

/* Begin PBXBuildFile section */
        1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
        3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
        3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };
        3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
        74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
        9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };
        9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
        97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
        DE4C455E21DE1E4300EA0709 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = DE4C455D21DE1E4300EA0709 /* GoogleService-Info.plist */; };
        97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
        97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */

这里:

/* Begin PBXFileReference section */
        1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
        1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
        3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
        3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = "<group>"; };
        74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
        74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
        7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
        9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
        9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
        9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = "<group>"; };
        97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
        97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
        97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
        97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
        97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
        DE4C455D21DE1E4300EA0709 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };

/* End PBXFileReference section */
这里:
97C146F01CF9000F007C117D /* Runner */ = {
    isa = PBXGroup;
    children = (
        97C146FA1CF9000F007C117D /* Main.storyboard */,
        97C146FD1CF9000F007C117D /* Assets.xcassets */,
        97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
        97C147021CF9000F007C117D /* Info.plist */,
        DE4C455D21DE1E4300EA0709 /* GoogleService-Info.plist */,
        97C146F11CF9000F007C117D /* Supporting Files */,
        1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
        1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
        74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
        74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
    );
    path = Runner;
    sourceTree = "<group>";
};

这里:

/* Begin PBXResourcesBuildPhase section */
        97C146EC1CF9000F007C117D /* Resources */ = {
            isa = PBXResourcesBuildPhase;
            buildActionMask = 2147483647;
            files = (
                97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
                3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
                97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
                97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
                DE4C455E21DE1E4300EA0709 /* GoogleService-Info.plist in Resources */,
            );
            runOnlyForDeploymentPostprocessing = 0;
        };
/* End PBXResourcesBuildPhase section */

使用CodeMagic进行了成功测试,这个修改使得提供的GoogleService-Info.plist被包含在App的IPA中


1
请问这个数字 97C147011CF9000F007C117D 是如何得到的? - Priyanka
打开XCode,将GoogleService-Info.plist复制/移动到Runner文件夹中。这样做时,会弹出一个对话框询问是否将此新文件添加到项目中。勾选“如果需要则复制文件”并单击“添加”。条目将自动生成并添加到ios/Runner.xcodeproj/project.pbxproj中。 - Druhin Bala
所以,如果我理解正确的话,这只是对文件的引用而不是它的内容,对吗?这意味着只要我保持“GoogleService-Info.plist”名称和引用,我就可以在暂存和生产文件之间切换。 - Imed Boumalek
救了我的一天!对于其他人的疑惑:是的,它确实有效。将GoogleService-Info.plist放置在ios/Runner文件夹中,并按上述方式编辑/ios/Runner.xcodeproj/project.pbxproj。 - Bugzilla
谢谢Fabien,它起作用了!我成功地创建了一个使用Firebase通知的iOS Flutter应用程序,只需要Windows 10,不需要MacBook! :) - vladimirp

7
在某个环节,AppUploader 必须使用 XCode 来从你的代码构建 iOS 应用程序。虽然我不知道他们是如何做到这一点的(他们的文档 缺乏详细信息),但你能做的最好的事情就是在上传应用程序之前将 google-services-info.plist 放置在正确的位置。
在我的项目中,我总是将 google-services-info.plist 放置在 Flutter 工具自动生成的 myappname/ios/Runner 目录中。这样构建工具就可以从那里获取它了。

2
我先尝试将文件放在 myappname/ios/Runner 目录下,然后放在 myappname\ios\Runner.xcodeworkspace 目录下,并使用 codemagic 平台创建了两个 IPA 文件。在测试这两个版本时,应用程序崩溃了,我知道原因是文件没有被读取到。 - Linesofcode
2
@Linesofcode 你解决了吗?我在使用 CodeMagic 时也遇到了同样的问题。 - Nahele Allan-Moon
@NaheleAllan-Moon 不好意思,我不得不在虚拟机中使用XCode。 - Linesofcode
1
谢谢你的回复。我已经做了同样的事情并将文件添加到Runner文件夹中,但我仍然得到以下错误:错误: 找不到构建输入文件:'/Users/builder/GoogleService-Info.plist'你也遇到这个问题吗? - Nahele Allan-Moon
@NaheleAllan-Moon,我没有,你还有问题吗? - Linesofcode

5

过了一会儿,我也在使用新的XCode时遇到了它,可以向您保证,正如已经建议的那样,它是这样工作的。

输入它在

iOS -> Runner (这里)

PS:从XCode中,我总是引用文件的参考,它没有将文件复制给我。如果有人成功地完成了上述过程但不需要此过程,我想确切地了解如何从XCode执行它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接