Приложение Кордовы, которое не использует push-уведомления: "Отсутствие права на уведомление push-уведомления"

У нас есть приложение на базе iOS на базе Cordova, которое не использует push-уведомления. Начиная с версии Cordova 3.5.0, каждое представление, которое мы сделали в магазине приложений, приводит к сообщению, в котором сообщается, что наше приложение включает в себя API, используемый для регистрации в службе уведомлений Apple Push Notification Service, но не имеет права на получение уведомлений.

Приложение было принято каждый раз, так как мы фактически не используем push-уведомления для чего-либо. Тем не менее, я хотел бы избежать запуска этого предупреждения в случае, если Apple решит изменить свою политику относительно приемлемости этих ссылок API.

Мы не испытывали проблемы с предыдущими версиями Кордовы и сами не работали в Objective-C. Это известная проблема с Cordova 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 Store
Дата: ср, 17 сен 2014 в 15:49
Тема: iTunes Connect: ваше приложение "[appName]" (Apple ID: [id]) имеет один или несколько вопросов
Кому: [разработчик]

Уважаемый разработчик,

Мы обнаружили одну или несколько проблем с вашей недавней доставкой для "[app]". Ваша поставка прошла успешно, но вы можете исправить следующие проблемы при следующей поставке:

Отсутствие права на уведомление о передаче Push - ваше приложение, как представляется, включает API, используемый для регистрации в службе Apple Push Notification, но права на подпись приложения не включают права "aps-environment". Если ваше приложение использует службу уведомления Apple Push, убедитесь, что ваш идентификатор приложения включен для Push Notification в Portal Provisioning Portal и повторно отправлен после подписания вашего приложения с профилем распределения, который включает в себя право доступа "aps-environment". Дополнительную информацию см. В разделе "Профилактика и разработка" в Руководстве по программированию локального и Push Notification. Если ваше приложение не использует службу Apple Push Notification, никаких действий не требуется. Вы можете удалить API из будущих представлений, чтобы остановить это предупреждение. Если вы используете стороннюю структуру, вам может потребоваться обратиться к разработчику за информацией об удалении API.

После устранения проблем вы можете использовать Xcode или Application Loader для загрузки нового бинарного файла в iTunes Connect.

Привет,

Команда App Store

Ответ 1

Крик прав! Я нашел эти вызовы API в /Classes/AppDelegate.m, конечно, созданный 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

КАК ДЕЛАТЬ ДАННОЕ ПОЛЬЗОВАТЕЛЯ XCODE UI (6.1):

Комментируя код нарушения в Classes\AppDelegate.m, вы получите одобрение вашего приложения, вы хотите продолжать получать прибыль от будущих обновлений Кордовы, поэтому лучший способ сделать это - включить символ DISABLE_PUSH_NOTIFICATIONS во время компиляции, чтобы этот бит код не учитывается.

Я исхожу из фона С#, поэтому я понимаю условную компиляцию, но я новичок в XCode, поэтому мне пришлось немного разобраться, как определить символы компиляции через пользовательский интерфейс.

Вызывает магические слова: "Макропроцессорный макрос". Вот как вы можете это сделать графически (обратите внимание, что это так сделано в XCode 6.1):

введите описание изображения здесь

Надеюсь, что это поможет другим людям в той же ситуации.

Ответ 3

У вас был установлен Push Plugin в какой-то момент? Похоже, что у вас есть соответствующий код где-то в вашем пакете приложений. Я бы выполнил поиск по всему проекту для конкретных вызовов API, например:

  • didRegisterForRemoteNotificationsWithDeviceToken
  • didFailToRegisterForRemoteNotificationsWithError

Мертвый код, файлы необходимо удалить.

Heres 'полная документация: https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/IPhoneOSClientImp.html#//apple_ref/doc/uid/TP40008194-CH103-SW2

Ответ 4

Оба kirk и r121 верны.

В более поздних версиях Кордовы этот оскорбительный код теперь полезен в оболочке #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

который просто заставляет проблему уйти.

Ответ 5

Как отмечает Чарльз Мерриам, более новые версии cordova-ios упрощают отключение сенсорных push-уведомлений, установив флаг preproceror DISABLE_PUSH_NOTIFICATIONS. (См. историю ошибок.)

Вам нужно будет cordova platform update ios, platform uninstall ios и platform install ios, чтобы получить новое в AppDelegate.m. (Может быть, есть лучший способ, чем сдуть папку?)

Я нашел Cordova on_platform_add hook script, который будет редактировать project.pbxproj с этим флагом для вас, когда вы устанавливаете платформу iOS. Мне нужно было npm install xcode, чтобы заставить hook script работать.