【问题标题】:Cordova app that doesn't use push notifications: "Missing push notification entitlement"不使用推送通知的 Cordova 应用程序:“缺少推送通知权利”
【发布时间】:2014-11-27 21:47:24
【问题描述】:

我们有一个基于 Cordova 的 iOS 应用程序,它不使用推送通知。从 Cordova 3.5.0 开始,我们向应用商店提交的每个内容都会生成一封电子邮件,通知我们我们的应用包含用于注册 Apple 推送通知服务的 API,但没有推送通知权利。

该应用程序每次都被接受,因为我们实际上并没有将推送通知用于任何事情。但是,如果 Apple 决定更改其关于这些 API 引用是否可接受的政策,我想避免触发此警告。

我们在 Cordova 的早期版本中没有遇到过这个问题,并且我们自己也没有在 Objective-C 中做过任何工作。这是 Cordova 3.5 的已知问题吗?搜索已经产生了一些有类似问题的人,但我只为想要添加推送权利的人找到了解决方案(而不是找出引用推送 API 的位置并删除它)。我查看了 Cordova issues ML,但没有找到任何东西。人们知道的任何其他线索将不胜感激!

使用的插件:
org.apache.cordova.console
org.apache.cordova.device
org.apache.cordova.file
org.apache.cordova.inappbrowser
org.apache.cordova.media
org.apache.cordova.network-信息
org.apache.cordova.splashscreen

相关邮件sn-p,具体信息替换为[ ]:

来自:iTunes Store
日期:2014 年 9 月 17 日,星期三,下午 3:49
主题:iTunes Connect:您的应用“[appName]”(Apple ID:[id])存在一个或多个问题
致:[开发者]

尊敬的开发者,

我们发现您最近为“[app]”交付的一个或多个问题。您的交付成功,但您可能希望在下次交付时更正以下问题:

缺少推送通知权利 - 您的应用似乎包含用于注册 Apple 推送通知服务的 API,但应用签名的权利不包括“aps-environment”权利。如果您的应用程序使用 Apple 推送通知服务,请确保您的应用程序 ID 在配置门户中启用推送通知,并在使用包含“aps-environment”权利的分发配置文件签署您的应用程序后重新提交。有关详细信息,请参阅本地和推送通知编程指南中的“供应和开发”。如果您的应用程序不使用 Apple 推送通知服务,则无需执行任何操作。您可以从以后的提交中删除 API 以停止此警告。如果您使用第三方框架,您可能需要联系开发者以获取有关移除 API 的信息。

纠正问题后,您可以使用 Xcode 或 Application Loader 将新的二进制文件上传到 iTunes Connect。

问候,

App Store 团队

【问题讨论】:

  • 您能找到解决此问题的方法吗?
  • 我也收到了同样的警告,虽然我没有在任何地方使用推送通知。
  • 更新:抱歉回复慢。我们还没有找到一个简单的解决方案,因为涉及推送注册的代码似乎包含在默认的 Cordova 包中(截至 4.0 仍然是这种情况)。我们尚未解决此问题,因为它尚未导致应用被拒绝。 R21 的代码 sn-p 和位置似乎确实是问题的根源,因此我将其标记为已接受。也感谢 Krik 提供 API 调用和文档。

标签: android ios cordova


【解决方案1】:

kirkr121 都是正确的。

在最新版本的 Cordova 中,这个有问题的代码现在可以在 #ifndef DISABLE_PUSH_NOTIFICATIONS 的包装器中生成。您需要做的就是将-DISABLE_PUSH_NOTIFICATIONS 添加到您的编译器标志中。这是在 target/Build Settings/Custom Compiler Flags/(both C and C++ release) 中为那些在 XCode 中构建的人设置的。

在我们的构建过程中,我们一直在吹散和重建 AppDelegate.m 文件。我使用的 hack 是:

 sed -i "" -e "s/ifndef DISABLE_PUSH_NOTIFICATIONS/if 0/" build/cordova/platforms/ios/gThrive/Classes/AppDelegate.m
 # That uses the os/x sed to not have push notifications in the app

这只会让问题消失。

【讨论】:

  • 我已将 -DDISABLE_PUSH_NOTIFICATIONS 添加到自定义编译器标志,但我仍然收到这些警告。我需要做其他事情吗? (我正在使用 ionic 的最新版本之一)
  • 抱歉,我已经离开 SO 泡沫一段时间了,但想说“谢谢!”加入一个更接近理智的程序。我们一直在解决这个问题,但很高兴知道一种更接近正确的方法。
  • @smotru 我认为您在该标志中有一个额外的“D”。应该是DISABLE_PUSH_NOTIFICATIONS
【解决方案2】:

克里克是对的!我在 /Classes/AppDelegate.m 中发现这个 API 调用肯定是由 Cordova 3.5 生成的。

我暂时没有尝试过,但是这些行当然可以在 xCode 中进行注释以避免 Apple 的警告。

- (void) application:(UIApplication *)application
   didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // re-post ( broadcast )
    NSString* token = [[[[deviceToken description]
                         stringByReplacingOccurrencesOfString: @"<" withString: @""]
                        stringByReplacingOccurrencesOfString: @">" withString: @""]
                       stringByReplacingOccurrencesOfString: @" " withString: @""];

    [[NSNotificationCenter defaultCenter] postNotificationName:CDVRemoteNotification object:token];
}

- (void)  application:(UIApplication *)application
    didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    // re-post ( broadcast )
    [[NSNotificationCenter defaultCenter] postNotificationName:CDVRemoteNotificationError object:error];
}

【讨论】:

  • 只是确认这个 sn-p 也在我们的 Cordova 4.0 项目中。由于其他构建考虑等原因,还没有机会尝试删除它。
  • 似乎对我的问题和最有可能的原因是准确的,但尚未测试完整的删除/代码 - 提交周期。无论如何都标记为已接受,因为它似乎是正确的切入点,并且可能需要一段时间才能完全确定。谢谢大家。
  • @Sterling - 只是想知道您是否发现注释掉这个单一方法可以解决问题(即,没有产生任何错误,允许您在没有收到警告的情况下提交您的应用程序?)谢谢前进!
  • @matt:我们实际上还没有尝试过,因为警告在应用程序接受方面并没有成为问题,并且更改 Cordova 代码需要弄乱我们构建过程的其他部分。很抱歉没有更多信息给您。
  • 我遇到了同样的问题,从 AppDelegate 中删除了这个 sn-p,此后没有任何警告。它有效!
【解决方案3】:

如何通过 XCODE UI (6.1) 做到这一点:

虽然注释掉 Classes\AppDelegate.m 中的违规代码将使您的应用获得批准,但您希望继续从未来的 Cordova 升级中受益,因此最好的方法是在编译期间打开 DISABLE_PUSH_NOTIFICATIONS 符号,这样就可以代码被遗漏了。

我来自 C# 背景,所以我了解条件编译,但我是 XCode 的新手,所以我不得不做一些研究以了解如何通过 UI 定义编译符号。

原来神奇的词是“预处理器宏”。这就是您如何以图形方式完成此操作(请注意,这是在 XCode 6.1 中完成的方式):

希望这可以帮助其他处于相同情况的人。

【讨论】:

  • 加一个以获得详细的图像!
  • 我按照第一个答案,找到#ifndef,去添加我自己的评论,然后看到这个,很好的答案。
  • 这张图片让您无需阅读即可轻松按照步骤操作 :-)
  • 一个非常有用的答案。谢谢史蒂文,这是一个令人头疼的减轻器。
  • 这仅适用于基于 Cordova 的应用程序,还是我可以在任何 iOS 应用程序上使用它?
【解决方案4】:

正如 Charles Merriam 所指出的,较新版本的 cordova-ios 通过设置预处理器标志 DISABLE_PUSH_NOTIFICATIONS 可以轻松禁用触摸推送通知。 (See bug history.)

您需要cordova platform update iosplatform uninstall iosplatform install ios 才能获得 AppDelegate.m 中的新功能。 (也许有比吹走文件夹更好的方法?)

我找到了Cordova on_platform_add hook script,当您安装 iOS 平台时,它将使用该标志为您编辑 project.pbxproj。我需要npm install xcode 才能让钩子脚本工作。

【讨论】:

  • 我遇到了这个问题,但是当我在 Xcode 中单击“验证”时,我的应用程序仍在验证 - 是否有可能让应用程序被拒绝(即使预构建出现并且在 iTunes 中运行良好)连接)我尝试了上面的解决方案,但它们似乎对我不起作用,除非我做错了什么
  • Xcode 的“验证”从未警告过我该标志。只有在将应用程序提交到 iTunesConnect 后,我​​才会收到警告电子邮件。
【解决方案5】:

您是否在某个时候安装了 Push 插件?听起来您的应用程序包中有相应的代码。我会在项目范围内搜索特定的 API 调用,例如:

  • didRegisterForRemoteNotificationsWithDeviceToken
  • didFailToRegisterForRemoteNotificationsWithError

死代码,需要删除文件。

这是完整的文档:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/IPhoneOSClientImp.html#//apple_ref/doc/uid/TP40008194-CH103-SW2

【讨论】:

  • 这里相同 - 我们在 config.xml 中都有 API 调用,并且在新的“cordova 平台添加 ios”之后......显然 Cordova(4.0)的默认 iOS 项目模板默认包含这些 #wtf
  • 我们刚刚也发现了这个问题。
  • 感谢您跟踪此问题。与 Rocco 相同的问题,我们现在使用 Cordova 4.0,(为 iOS 构建 3.7),据我所知,从未包含推送功能或推送相关插件(我们实际上重建了 cordova 项目作为我们构建的一部分,所以当前包含应该是……)。似乎该代码作为 Cordova 默认包含在内。
猜你喜欢
  • 1970-01-01
  • 2015-11-28
  • 2015-11-21
  • 2015-11-23
  • 2018-02-08
  • 2016-07-09
  • 2018-09-27
相关资源
最近更新 更多