我们有一个基于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团队
答案 0 :(得分:49)
如何通过XCODE UI(6.1)进行此操作:
虽然评论Classes\AppDelegate.m
中的违规代码会让您的应用获得批准,但您希望继续受益于未来的Cordova升级,因此最好的方法是在编译期间启用DISABLE_PUSH_NOTIFICATIONS
符号所以这段代码被遗漏了。
我来自C#背景,所以我理解条件编译,但我是XCode的新手,所以我不得不做一些研究,找出如何通过UI定义编译符号。
结果是魔术词是'预处理器宏'。这就是你如何以图形方式实现这一点(注意这是在XCode 6.1中完成的方式):
希望这可以帮助其他人在同样的情况下。
答案 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调用,例如:
需要删除死代码,文件。
答案 3 :(得分:4)
在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 ios
,platform uninstall ios
和platform install ios
来获取AppDelegate.m中的新内容。 (也许有比吹走文件夹更好的方法?)
我找到了一个Cordova on_platform_add hook script,它将在您安装iOS平台时为您编辑带有该标志的project.pbxproj。我需要npm install xcode
才能使钩子脚本起作用。