不使用推送通知的Cordova应用程序:"缺少推送通知权利#34;

时间:2014-10-02 20:02:18

标签: android ios cordova

我们有一个基于Cordova的iOS应用,它不使用推送通知。截至Cordova 3.5.0,我们对应用程序商店进行的每次提交都会生成一封电子邮件,通知我们我们的应用程序包含用于向Apple推送通知服务注册的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信息
org.apache.cordova.splashscreen

相关电子邮件摘要,特定信息已替换为[]:

  

来自: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团队

5 个答案:

答案 0 :(得分:49)

如何通过XCODE UI(6.1)进行此操作:

虽然评论Classes\AppDelegate.m中的违规代码会让您的应用获得批准,但您希望继续受益于未来的Cordova升级,因此最好的方法是在编译期间启用DISABLE_PUSH_NOTIFICATIONS符号所以这段代码被遗漏了。

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

结果是魔术词是'预处理器宏'。这就是你如何以图形方式实现这一点(注意这是在XCode 6.1中完成的方式):

enter image description here

希望这可以帮助其他人在同样的情况下。

答案 1 :(得分:21)

Krik是对的!我发现在/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];
}

答案 2 :(得分:4)

你有没有安装Push Plugin?听起来你的应用程序包中有相应的代码。我在项目范围内搜索特定的API调用,例如:

  • didRegisterForRemoteNotificationsWithDeviceToken
  • didFailToRegisterForRemoteNotificationsWithError

需要删除死代码,文件。

下面有&#39;完整文档:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/IPhoneOSClientImp.html#//apple_ref/doc/uid/TP40008194-CH103-SW2

答案 3 :(得分: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

只会让问题消失。

答案 4 :(得分: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才能使钩子脚本起作用。