应用程序在应用商店中找不到有效的“aps-environment”授权字符串。

138
我有一个叫做Dripper的应用程序,大约一个月前发布了一次更新,最近又添加了推送通知和一些小改进。我在使用开发配置文件的 sandbox-apn 进行测试时运行良好。然后我切换到 production-apn 并将其推送到 test-flight,同样表现出色。但是当我将更新发布到市场并运行它时,我发现服务器不再接收到新的推送注册信息。我查看设备的控制台日志并找到了以下信息:Dec 4 17:55:15 Ina-touch-it coffco[1210] : 注册远程通知
Dec 4 17:55:15 Ina-touch-it SpringBoard[52] :未找到应用程序'Dripper'的有效 'aps-environment' 权限字符串(null)。通知将无法传递。
Dec 4 17:55:15 Ina-touch-it coffco[1210] <Warning>:注册失败错误:NSCocoaErrorDomain Code=3000 "no valid 'aps-environment' entitlement string found for application" UserInfo=0x174270900 {NSLocalizedDescription=no valid 'aps-environment' entitlement string found for application}

我有些困惑,因为我认为生产APN在adhoc和应用商店版本中的功能是相同的。
这是我的应用程序ID及其授权:

enter image description here

这是应用商店的配置文件:

enter image description here


这里正在签名和上传 -> http://i.stack.imgur.com/AziCI.png构建设置 -> http://i.stack.imgur.com/j2TFG.png - Jessiah
11个回答

344

我通过启用推送通知功能解决了这个问题。

点击.xcodeproj -> 能力 -> 启用推送通知


15
在 XCode 8 中,我在这部分看到了一个错误,提示需要添加一个权限文件。我点击它来进行更正,然后它就可以正常工作了。 - Pellet
仅在开始使用Xcode 8进行开发时才出现了这个问题,现已解决。谢谢! - Kody R.
之前在Xcode 7.3上工作,但突然在Xcode 8上无法注册,但通过启用推送通知功能解决了我的问题。 - Vinod Rathod
苹果决定将此选项隐藏在Xcode 8.1的深处。如果有人能找到它,请告诉我。 - Thomas Sebastian
在功能列表中,我没有看到“推送通知”选项。这可能与XCode自动生成我的配置文件有关(我是iOS开发的新手,所以我可能错了...)。在显示“推送通知”选项之前,我必须登录我的开发者帐户并手动为我的应用程序创建一个配置文件。最后,启用它解决了这个问题。 - Max Mumford
2
在XCode 12中,需要同时为Debug和Release添加此内容。 - Jabbar

105

6
那么你应该在构建设置中选择正确的预配文件。 - Hashem Aboonajmi
2
在我的情况下,我需要在开发中心重新生成配置文件。然后通过Xcode > 首选项 > 帐户 > 您的Apple ID > 右上角的查看详细信息按钮下载所有配置文件和证书。之后它应该可以正常工作了。 - blackjacx
2
我觉得在推送和部署的过程中出现这么多故障很令人沮丧。唯一能容忍这些问题的方法就是手动完成100%的工作,并了解Xcode试图做什么,以及通过文件系统和iPhone配置实用程序管理Keychain身份验证和配置文件。 - Tom Pace

60

您必须启用目标->能力->推送通知。我曾经在使用Xcode 8时遇到过这个问题。输入图像描述


45

在较高版本的Xcode中,用于添加推送通知功能的导航方式略有变化。此处使用的是12.2版本。

Xcode 12新增通知功能指南


谢谢,你救了我一命,这个解决方案修复了问题。 - Amjad Omari
这个解决了我在获取错误消息时遇到的问题。我正在支持的应用程序是使用Nativescript构建的。所以当我部署时,我一直在Navtivescript中进行构建,然后在XCode中打开构建并按照常规步骤完成推送到Apple。因此,添加这个配置步骤可能是我每次推送新版本都必须做的事情,但至少它可以工作! - gadildafissh
我正在开发Flutter应用程序,遇到了上述错误,你提供的解决方案起了作用 :) 你救了我的一天,人啊。 - Rakesh Verma

19

这些问题是由于当前的预配文件不包含APNS信息,因为在创建APNS证书之前已经创建了预配文件。

因此,要解决这个问题,需要创建一个新的预配文件并在Xcode中选择该预配文件。然后就可以完成了。

另外,在添加推送时,我相信您也已经在钥匙串中更新了证书。


我正在使用的配置文件是在我创建了生产推送APN证书之后创建的。有什么方法可以确认它是否缺少或包含APNS信息? - Jessiah

10

关于Xcode 9,一些答案已经过时或不完整,无法解决这个特定的问题。

以下是我所遵循的步骤:

1. 创建配置文件

(FCM不是推送通知的先决条件,但他们的指南非常清晰,这是链接)

在开发过程中测试您的应用程序,您需要为开发创建一个配置文件,以授权您的设备运行尚未发布到App Store的应用程序。

  1. 进入苹果开发人员成员中心并登录。
  2. 导航到“证书,标识符和配置文件”。
  3. 如果尚未选择,则在左上角的下拉菜单中选择iOS、tvOS、watchOS,然后导航到“Provisioning Profiles > All”。
  4. 点击“+”按钮创建新的配置文件。
  5. 选择“iOS App Development”作为配置文件类型,然后点击“继续”。
  6. 在下拉菜单中选择要使用的应用程序ID,然后点击“继续”。
  7. 选择前面步骤中选择的应用程序ID的iOS开发证书,然后点击“继续”。
  8. 选择要包括在配置文件中的iOS设备,然后点击“继续”。确保选择所有您想用于测试的设备。
  • 输入此配置文件的名称(例如Firebase示例应用程序开发配置文件),然后单击“生成”。
  • 单击“下载”,将配置文件保存到您的Mac上。
  • 双击配置文件安装它。
  • 2. 激活推送通知功能

    1. 转到项目编辑器,从官方手册中查看 enter image description here
    2. 在功能部分,激活推送通知 enter image description here

    5

    我在使用iOS 8.0及以上版本时遇到了同样的问题;我没有收到设备令牌,并出现错误:“应用程序中找不到有效的‘aps-environment’授权字符串”

    我通过以下步骤解决了这个问题:

    • 为应用程序ID创建新的配置文件
    • 将其添加到Xcode中
    • 进入Xcode“首选项”
    • 进入“账户”选项卡,选择我的Apple ID并单击“查看详细信息”
    • 选择您的配置文件
    • 单击左下角的箭头以刷新
    • 单击“完成”

    现在运行项目,它一定会正常工作。


    3
    由于某些原因,Wei的解决方案对我不起作用。当点击“修复权限”时,Xcode生成了两个文件,但仍然无法正常工作,生成的权限文件实际上是空的。
    这似乎是由于项目的PRODUCT_NAME名称过长,包含空格和“ä”和“ö”字母。将其更改为只包含英文字母的简短版本后,Wei的修复方法可以正确地工作。

    2
    我花了一段时间才弄清楚是什么导致了“没有有效的aps-environment权限”错误。 问题在于XCode项目中有两个.entitlements文件。一个是platform/ios//.entitlements,另一个是platform/ios//Resources/.entitlements,而适当的权限只存在于前者中,而XCode配置为使用后者。我手动更新了后者文件,然后一切都开始正常工作了。 解决此问题的另一个方法是更改XCode使用的.entitlements文件。这可以在Build Settings-->Signing-->Code Signing Entitlements配置参数中完成。
    我不确定为什么XCode中会有两个.entitlements文件。可能是cordova推送插件创建了第二个文件(我正在开发混合cordova移动应用程序)?那么.entitlements文件的正确位置是什么?

    0
    使用firebase-ios-sdk(v10.4.0+)时,APNS令牌是获取FCM令牌的先决条件。 SDK会尝试通过在AppDelegate方法中注册APNS令牌来处理此问题,但如果禁用了swizzling,或者在调用getToken之前没有注册远程通知,您将永远无法获取令牌。
    • 请不要禁用swizzling。
    • 确保在Xcode中启用推送通知。
    • 在Xcode中启用后台模式,并勾选远程通知。
    • 完全删除apk并重新构建。

    我相信您已经添加了这些内容,

     override func application(_ application: UIApplication, 
      didRegisterForRemoteNotificationsWithDeviceToken deviceToken:Data){
    
        
        Messaging.messaging().apnsToken = deviceToken
        super.application(application, didRegisterForRemoteNotificationsWithDeviceToken:deviceToken)
      }
    

    将以下内容添加到你的AppDelegate.swift文件中。
    你的AppDelegate.swift文件应该如下所示。
    import UIKit
    import Flutter
    import FirebaseCore
    import FirebaseMessaging
    
    
    
    @UIApplicationMain
    @objc class AppDelegate: FlutterAppDelegate {
      override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
      ) -> Bool {
       
        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
      }
       override func application(_ application: UIApplication, 
      didRegisterForRemoteNotificationsWithDeviceToken deviceToken:Data){
    
        
        Messaging.messaging().apnsToken = deviceToken
        super.application(application, didRegisterForRemoteNotificationsWithDeviceToken:deviceToken)
      }
    }
    

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