不使用推送通知的Cordova应用程序:“丢失推送通知授权”

问题描述:

我们有一个不使用推送通知的基于Cordova的iOS应用程序。从Cordova 3.5.0开始,我们向应用商店提交的每个提交都会通过电子邮件通知我们,我们的应用包括用于向Apple推送通知服务注册的API,但不具有推送通知权利。不使用推送通知的Cordova应用程序:“丢失推送通知授权”

该应用每次都被接受,因为我们实际上并未使用任何推送通知。但是,如果Apple决定更改其政策,以确定这些API参考是否可以接受,我想避免触发此警告。

我们没有遇到以前版本的Cordova的问题,并且自己也没有在Objective-C中做过任何工作。这是科尔多瓦3.5的一个已知问题吗?搜索已经让一些人有类似的问题,但我只找到想要添加推送权利的人的解决方案,(而不是找出Push API被引用的地方并将其删除)。我看了科尔多瓦问题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

相关的电子邮件片断,具体信息替换为[]:

来源:iTunes商店
日期:星期三,2014年9月17日在下午3时49分
主题:iTunes Connect中:您的应用 “[APPNAME]”(苹果ID:[ID])具有一个或多个问题
要:[开发商]

尊敬的开发商,

我们已经发现了一个或多个问题与您最近的交付“[应用]”。您的送货成功,但您可能希望在下次送达时更正以下问题:

缺少推送通知授权 - 您的应用程序似乎包含用于注册Apple Push Notification服务的API,但应用程序签名的授权不包括“APS环境”权利。如果您的应用使用Apple推送通知服务,请确保在Provisioning Portal中为您的App ID启用推送通知,并在使用包含“aps-environment”权利的Distribution provisioning配置文件签署应用后重新提交。有关更多信息,请参阅本地和推送通知编程指南中的“供应和开发”。如果您的应用不使用Apple推送通知服务,则不需要执行任何操作。您可以从将来的提交中删除API以停止此警告。如果您使用第三方框架,则可能需要联系开发人员以获取有关删除API的信息。

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

问候,

的App Store的团队

+0

您是否能找到解决此问题的解决方案? – BuddhiP 2014-11-20 08:02:35

+0

我也得到了同样的警告,虽然我不使用推送通知任何地方。 – lucafik 2014-12-01 09:52:35

+1

更新:抱歉响应缓慢。我们还没有找到一个简单的解决方案,因为涉及推送注册的代码似乎包含在默认的Cordova包中(仍然是4.0版本的情况)。我们尚未解决问题,因为它尚未导致应用拒绝。 R21的代码片段和位置似乎确实是问题的根源,所以我会将其标记为已接受。感谢Krik提供API调用和文档。 – 2014-12-02 16:37:44

Krik是正确的!我发现Cordova 3.5确实生成了/Classes/AppDelegate.m这个API调用。

我暂时没有尝试过,但这些行当然可以在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]; 
} 
+1

只需确认此代码段也在我们的Cordova 4.0项目中。由于其他编译考虑因素等原因,还没有机会尝试删除它。 – 2014-12-02 16:26:18

+0

似乎对我的问题和最有可能的原因是准确的,但未测试完整的删除/代码提交周期。无论如何标记为接受,因为它似乎是正确的切入点,它可能是一段时间,直到我能够绝对肯定。谢谢大家。 – 2014-12-02 16:39:41

+0

@Sterling - 只是想知道如果你发现评论这个单一的方法解决了这个问题(即,没有创建任何错误,允许你提交你的应用程序没有收到警告?)先谢谢了! – mattstuehler 2015-02-23 04:41:30

你吃过的push插件安装在某些时候?听起来你在应用程序包中有相应的代码。我做了特定的API项目范围内搜索呼叫e.g:

  • didRegisterForRemoteNotificationsWithDeviceToken
  • didFailToRegisterForRemoteNotificationsWithError

死代码,文件需要被删除。

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

+0

同样在这里 - 我们在config.xml和全新的“cordova平台添加ios”之后都有API调用...显然,Cordova的(4.0)默认iOS项目模板默认包含了这些模板#wtf – Rocco 2014-11-18 10:24:59

+0

我们刚发现问题如下好。 – 2014-12-01 22:49:11

+1

感谢您跟踪此信息。我们现在使用科尔多瓦4.0(对于iOS为3.7版本),从未包含推送功能或推送相关插件(据我们实际重建cordova项目是我们构建的一部分,因此目前的内含物应该是......)。似乎代码是作为Cordova默认值包含的。 – 2014-12-02 16:24:53

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 

这只是让问题消失。

+0

我已将-DDISABLE_PUSH_NOTIFICATIONS添加到自定义编译器标志,但仍然收到这些警告。 我需要做点别的吗? (我正在使用最新版本的离子版本) – smotru 2015-07-08 13:59:26

+0

对不起,我已经离开了SO泡沫了一下,但想说“谢谢!”用更接近理智的程序来进行。我们刚刚解决了这个问题,但知道更接近正确的方式是很好的。 – 2015-08-02 00:51:09

+0

@smotru我想你在那个旗子里有一个额外的'D'。它应该是'DISABLE_PUSH_NOTIFICATIONS' – danjarvis 2015-08-04 19:06:30

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

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

我发现了一个Cordova on_platform_add hook script,当你安装iOS平台时,它会为你编辑project.pbxproj标志。我需要npm install xcode才能使钩子脚本正常工作。

+0

我有这个问题,但我的应用程序仍然验证,当我点击Xcode中的“验证” - 是否有可能有一个应用程序被拒绝,即使预构建出现并在iTunes Connect中正常工作) 我尝试了上述解决方案,除非我做错了什么,否则它们似乎不适用于我。 – Zabs 2015-05-28 15:56:45

+0

Xcode的“验证”从未警告过我有关该标志的问题。只有在将应用程序提交给iTunesConnect后,我才会收到警告电子邮件。 – mpoisot 2015-05-28 19:34:54

如何做到这一点VIA Xcode的UI(6.1):

虽然Classes\AppDelegate.m注释掉有问题的代码将让你的应用程序获得批准,要继续从未来的科尔多瓦受益升级,从而以最好的方式这样做是为了在编译过程中打开DISABLE_PUSH_NOTIFICATIONS符号,所以这部分代码被省略了。

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

原来的单词是'Preprocessor Macro'。这就是你怎么可以用图形做到这一点(注意这个方式的XCode中6.1完成):

enter image description here

希望这有助于其他人在那里在同样的情况。

+5

加一个详细图片! – Josh 2015-09-04 09:35:02

+0

我跟着第一个答案,找到#ifndef,去添加我自己的评论,然后看到这个,很好的答案。 – Schamp 2015-10-19 12:17:42

+0

该图像可以很容易地按照步骤,甚至不需要阅读:-) – otmezger 2016-01-15 14:51:23