不使用推送通知的 Cordova 应用程序: "缺少推送通知授权"

45

我们有一个基于Cordova的iOS应用程序,不使用推送通知。从Cordova 3.5.0开始,每次我们向应用商店提交应用程序,都会收到一封电子邮件,告知我们的应用包含用于注册苹果推送通知服务的API,但没有推送通知授权。

由于我们实际上并未使用推送通知,因此每次应用程序都被接受了。但是,我希望避免触发此警告,以防万一Apple决定改变其有关这些API引用是否可接受的政策。

我们在之前的Cordova版本中没有遇到过这个问题,并且自己没有在Objective-C方面做任何工作。Cordova 3.5是否存在已知问题?搜索结果显示一些人遇到了类似的问题,但我只找到了为想要添加推送授权的人提供解决方案(而不是找出Push API被引用的位置并将其移除)。我查看了Cordova的问题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-information
org.apache.cordova.splashscreen

相关电子邮件片段,具体信息用 [ ] 替换:

从:iTunes Store
日期:2014年9月17日,下午3:49
主题:iTunes Connect:您的应用程序“[appName]”(Apple ID:[id])存在一个或多个问题
收件人:[developer]

亲爱的开发者,

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

缺少推送通知授权 - 您的应用似乎包含用于注册苹果推送通知服务的API,但是应用程序签名的授权不包括“aps-environment”授权。如果您的应用程序使用了苹果推送通知服务,请确保在预配门户中启用了Push Notification的App ID,并在使用包含“aps-environment”授权的分发预配文件签署应用程序后重新提交。有关更多信息,请参阅“本地和推送通知编程指南”中的“预配和开发”。如果您的应用程序不使用苹果推送通知服务,则无需采取任何措施。您可以从未来的提交中删除API以停止此警告。如果您使用第三方框架,则可能需要联系开发人员以获取有关删除API的信息。

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

敬礼,

App Store团队


你能找到这个问题的解决方案吗? - BuddhiP
我也收到了同样的警告,尽管我没有在任何地方使用推送通知。 - lucafik
1
更新:抱歉回复较慢。我们还没有找到简单的解决方案,因为涉及推送注册的代码似乎包含在默认的Cordova软件包中(截至4.0仍然如此)。由于这个问题尚未导致应用程序被拒绝,所以我们还没有修复它。R21的代码片段和位置似乎是问题的根源,因此我将其标记为已接受。同样感谢Krik提供的API调用和文档。 - Sterling Nelson
5个回答

49

如何通过Xcode UI(6.1)实现此目标:

虽然在Classes\AppDelegate.m中注释掉有问题的代码可以使您的应用程序获得批准,但您希望继续受益于未来的Cordova升级,因此最好的方法是在编译期间开启DISABLE_PUSH_NOTIFICATIONS符号,这样就会省略掉这段代码。

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

事实证明,神奇的词语是“预处理器宏”。这就是您可以通过图形方式完成此操作的方法(请注意,这是在XCode 6.1中完成的方法):

输入图像描述

希望这可以帮助其他处于同一境地的人。


5
感谢提供详细的图片! - Josh
我按照第一个答案,找到了#ifndef,想要添加自己的评论,然后看到了这个很好的答案。 - Schamp
这个图像使得即使不需要阅读也能轻松地按照步骤进行 :-) - otmezger
非常有用的答案。谢谢 Steven,这减轻了我的头痛。 - user373396
这只适用于基于 Cordova 的应用程序,还是我可以在任何 iOS 应用程序上使用它? - Arjun Kalidas

22

Krik是正确的!我在/Classes/AppDelegate.m中找到了这些API调用,它们肯定是由Cordova 3.5生成的。

我暂时没有尝试过,但这些行可以在xCode中注释掉,以避免苹果的警告。

- (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];
}

1
只是确认这段代码也在我们的Cordova 4.0项目中。由于其他构建考虑等原因,我还没有尝试将其删除。 - Sterling Nelson
似乎准确地解决了我的问题并且很可能是原因,但我还没有测试完全的删除/代码-提交周期。无论如何,我将其标记为已接受,因为它似乎是正确的入口点,并且可能需要一段时间才能确定。谢谢大家。 - Sterling Nelson
@Sterling - 只是想知道你是否发现注释掉这个单独的方法可以解决问题(即,不会产生任何错误,允许您提交应用程序而不接收警告?)提前致谢! - mattstuehler
@matt:我们实际上还没有尝试过,因为警告在应用程序接受方面并不成问题,而更改Cordova代码需要干扰我们构建过程的其他部分。很抱歉没有更多信息提供给你。 - Sterling Nelson
4
我曾经遇到同样的问题,从AppDelegate中删除了这段代码后,自那以后就没有警告了。它有效! - Marcos Lima

4

同样的问题在这里 - 我们有一些没有在config.xml中配置的API调用,而在执行“cordova platform add ios”命令后... 显然Cordova(4.0)默认的iOS项目模板默认包含这些# wtf。 - Rocco
我们也刚发现这个问题。 - Doug Donohoe
1
感谢您追踪此问题。我们遇到了与Rocco相同的问题,我们现在使用的是Cordova 4.0(构建3.7用于iOS),据我所知从未包含推送功能或推送相关插件(实际上,我们在构建过程中重新构建了Cordova项目,因此当前的包含应该就是它...)。看起来代码已经作为Cordova默认包含了。 - Sterling Nelson

4

两位用户kirkr121都是正确的。

在较新版本的Cordova中,这个有问题的代码现在已经被放在了#ifndef DISABLE_PUSH_NOTIFICATIONS的包装器内。你只需要在编译标志中添加-DISABLE_PUSH_NOTIFICATIONS即可。对于那些在XCode中构建的人来说,可以在target/Build Settings/Custom Compiler Flags/(both C and C++ release)中进行设置。

在我们的构建过程中,我们一直在频繁地删除并重建AppDelegate.m文件。我使用的技巧是:

 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) - smotru
抱歉,我已经有一段时间没有涉足SO社区了,但是还想说“谢谢!”你提供了一个更靠谱的解决方案。我们一直处于问题中,但很高兴现在知道了一个更接近正确的方法。 - Sterling Nelson
@smotru,我认为你在那个标志中多了一个“D”。它应该是DISABLE_PUSH_NOTIFICATIONS - danjarvis

4
正如Charles Merriam所指出的,较新版本的cordova-ios通过设置预处理器标志DISABLE_PUSH_NOTIFICATIONS可以轻松禁用点击推送通知。 (请查看bug历史记录)
你需要运行以下命令cordova platform update iosplatform uninstall iosplatform install ios 来得到在AppDelegate.m中的新内容。(也许有比删除文件夹更好的方法吗?)
我发现Cordova on_platform_add hook script将在安装iOS平台时通过编辑project.pbxproj文件为您添加该标志。我需要运行npm install xcode以使hook脚本正常工作。

我有这个问题,但当我在Xcode中点击“验证”时,我的应用程序仍在进行验证 - 即使预构建在iTunes Connect中显示和正常工作,是否有可能因此拒绝应用程序?我尝试了上面的解决方案,但除非我做错了什么,否则它们似乎对我没有起作用。 - Zabs
Xcode的“验证”从未警告我关于该标志。只有在将应用程序提交到iTunesConnect之后,我才会收到警告电子邮件。 - mpoisot

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