【问题标题】:Where to save GoogleService-Info.plist in Flutter without Xcode?在没有 Xcode 的情况下在 Flutter 中将 GoogleService-Info.plist 保存在哪里?
【发布时间】:2019-10-17 19:47:13
【问题描述】:

我的应用已经在 Google Play 和 iTunes 中提交、审核并在线,但最近我添加了 firebase_messaging 插件以实现通知功能。

在加入 Firebase Cloud Messaging 时,Google 强迫我下载两个文件:

  • google-services.json - 保存在我的 Flutter App 文件夹中:MyApp\android\app
  • GoogleService-Info.plist - 我不知道在哪里保存它,但尝试了 MyApp\ios\RunnerMyApp\ios\Runner.xcodeworkspace 没有成功

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

有什么方法可以不使用 Xcode 并能够将 GoogleService-Info.plist 附加到我的项目中?

【问题讨论】:

    标签: ios xcode flutter firebase-cloud-messaging


    【解决方案1】:

    如果你想避免使用 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 中

    【讨论】:

    • 你能告诉我97C147011CF9000F007C117D 这个数字是怎么得到的吗?
    • 打开 XCode,将 GoogleService-Info.plist 复制/移动到 Runner 文件夹中。执行此操作时,将打开一个对话框,询问是否将此新文件添加到项目中。选中“如果需要,复制文件”,然后单击“添加”。条目将自动生成并添加到 ios/Runner.xcodeproj/project.pbxproj
    • 所以,如果理解正确,这只是对文件的引用,而不是其内容,对吧?这意味着只要保留“GoogleService-Info.plist”名称和引用,我就可以在暂存文件和生产文件之间切换
    • 拯救了我的一天!对于其他人的疑惑:是的,它确实有效。将您的 GoogleService-Info.plit 放在 ios/Runner 文件夹中并编辑 /ios/Runner.xcodeproj/project.pbxproj,如上所示
    • 感谢 Fabien,它有效!我设法仅使用 Windows 10 来创建带有 Firebase 通知的 ios Flutter 应用程序,无需 MacBook! :)
    【解决方案2】:

    在某个地方,AppUploader 必须使用 XCode 从您的代码构建 iOS 应用程序。虽然我不知道他们是怎么做到的(their documentation 的细节很少),但您最好的希望是在上传应用程序之前将google-services-info.plist 放在正确的位置。

    在我的项目中,我总是将 google-services-info.plist 放在 Flutter 工具自动生成的 myappname/ios/Runner 目录中。这就是构建然后从中获取它的地方。

    【讨论】:

    • 我尝试先输入myappname/ios/Runner,然后再输入myappname\ios\Runner.xcodeworkspace,并使用codemagic 平台创建了两个IPA 文件。在测试这两个版本时,应用程序崩溃了,我知道原因是文件没有被读取(?)。
    • @Linesofcode 你有想过这个吗?我在使用 CodeMagic 时遇到了同样的问题。
    • @NaheleAllan-Moon 否定,我不得不在虚拟机中使用 XCode。
    • 感谢您的回复。我做了同样的事情并将文件添加到 Runner 文件夹,但我仍然收到错误:找不到构建输入文件:'/Users/builder/GoogleService-Info.plist' 你有这个问题吗?跨度>
    • @NaheleAllan-Moon 我没有,你还有问题吗?
    【解决方案3】:

    一段时间后,我也使用新的 XCode 遇到了它,我可以向您保证,正如已经建议的那样,它以这种方式工作。

    在下面输入

    iOS -> Runner(这里)

    PS:我总是从 XCode 中获取文件的引用,它没有将它复制给我。如果即使没有上述过程也有人成功了,我想确切地了解如何从 XCode 中做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-11
      • 2021-07-11
      • 2018-03-06
      • 1970-01-01
      • 2020-11-29
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多