2013-09-03 2 views
1

У нас есть старое приложение, созданное с помощью PhoneGap версии 1.0. Существует абсолютно никаких шансов перейти на последнюю версию PhoneGap/Cordova из-за огромных изменений в обоих кодеках iOS/JS.PhoneGap 1.0 приложение Отправить в AppStore не удается

Попытка загрузить приложение, скомпилированное с iOS SDK 6.1, не удалась с сообщением: «Приложениям не разрешен доступ к UDID и не должен использовать метод uniqueIDdifier для UIDevice. Обновите свои приложения и серверы, чтобы связать пользователей с Поставщиком или рекламные идентификаторы, введенные в iOS 6. ».

Источник PhoneGap 1.0 не доступен публично, он распространяется как скомпилированный фреймворк.

Есть ли у кого-нибудь идеи, как решить эту проблему?

+0

PhoneGap всегда был открытым исходным кодом, даже до приобретения Nitobi путем Adobe. – CommonsWare

+0

@CommonsWare: Любая идея, я могу получить источники? Goooogled много без успеха. Благодарю. –

+0

Hmmmm ... сейчас * это * прекрасный вопрос. Источник Pre-1.0 находится по адресу https://github.com/sintaxi/phonegap/tree/master/iphone. Тем не менее, я не вижу исходные дистрибутивы на GitHub еще до создания Apache Cordova. – CommonsWare

ответ

3

Сумасшедший, но рабочий раствор (хак)

Ну, раз PhoneGap 1.0 предоставляется в качестве скомпилированного Lib, мы можем попытаться изменить саму скомпилированный двоичный файл.

Причина отказа Apple заключается в вызове метода [UIDevice uniqueIdentifier], устаревшего в iOS 6. Если ваше приложение (JS-код) не использует UDID, предоставляемый PhoneGap (на самом деле, понятия не существует, есть способ его получить) , это безопасно (!? см. ПРИМЕЧАНИЕ ниже), чтобы изменить вызов uniqueIdentifier на любой другой метод, возвращающий NSString класса UIDevice.

Я использовал + (NSString *) systemVersion - getter свойства systemVersion.

Таким образом, получить любой редактор HEX и открыть файл: /users/Shared/PhoneGap/Frameworks/PhoneGap.framework/PhoneGap заменить UniqueIdentifier с SystemVersion \ 0 \ 0 \ 0.

\ 0 - это нулевые байты кода, необходимые для выравнивания длины нового имени, которое на 3 байта короче!

Перестройте свое приложение, и ... загрузка альты в AppStore прошла успешно!

ПРИМЕЧАНИЕ. Обязательно проверьте работоспособность своего приложения. Я сделал для своего приложения, и это работает как шарм.

+1

Я выполнил дополнительный поиск в источниках PhoneGap (ссылка на вопрос). UIDevice.uniqueIdentifier используется только для «упаковки» переменной deviceProperties в качестве словаря, который передается на страницу как JSON-вызов [webView stringByEvaluatingJavaScriptFromString: deviceProperties]. Вот что мы видим в журналах: Инициализация устройства: DeviceInfo = {"name": "Simulator", "uuid": "XXX", "платформа": "Simulator", "gap": "1.0.0", "version ":" 5,0" , "соединение": { "Тип": "WiFi"}}; С приведенным выше решением мы будем иметь «uuid»: например, «5.0». Итак, если вы не используете DeviceInfo.uuid в своем JS, мое решение безопасно. –

+0

Ваш хак спас мне часы впустую, я использую PhoneGap 1.3.0 и не хочу обновляться. Получил iHex из хранилища Mac, он позволяет вводить текст или шестнадцатеричный текст и менять «uniqueIdentifier» на «systemVersion», добавляя три пробела в конце, которые переводились в hex 00 00 00, и все работало нормально. Я не использую поле uuid, поэтому не забочусь о его ценности. – omerio

0

Nope. Apple - ваша проблема здесь. Вы должны обновить свой PhoneGap до не менее 2,5, см. Размещение здесь: https://shazronatadobe.wordpress.com/2013/05/01/cordovaphonegap-and-the-new-apple-app-store-requirements/

И вам нужно обновить любой плагин или родной, который вы написали, чтобы не использовать uuid.

+0

Спасибо. Как я уже сказал, нет времени/ресурсов для выполнения обновления. Проект очень сложный, пользовательские плагины имеют 20+ функций, много «магии», выполненных дополнительно с управляемым WebView и т. Д. –

0

Я имел такую ​​же проблему с помощью PhoneGap 1.2.0 но выше «хак» не работало для меня - это дало мне ошибку

ld: file is universal (3 slices) but does not contain a(n) armv7 slice: 

Так вместо этого я нашел гораздо более простое решение - найдите PhoneGapLib.xcodeproj, который устанавливается, когда вы устанавливаете телефонную трубку и открываете ее, затем выполняйте поиск вызова «uniqueIdentifier».

Затем я использовал ниже код, взятый отсюда (https://stackoverflow.com/a/9458313/1851746) для того, чтобы заменить значение UUID -

- (NSString *)getUUID 
{ 
    NSString *UUID = [[NSUserDefaults standardUserDefaults] objectForKey:@"uniqueID"]; 
    if (!UUID) 
    { 
     CFUUIDRef theUUID = CFUUIDCreate(NULL); 
     CFStringRef string = CFUUIDCreateString(NULL, theUUID); 
     CFRelease(theUUID); 
     UUID = [(__bridge NSString*)string stringByReplacingOccurrencesOfString:@"-"withString:@""]; 
     [[NSUserDefaults standardUserDefaults] setValue:UUID forKey:@"uniqueID"]; 
    } 
    return UUID; 
} 

Вызов этого метода с [само getUUID] вместо UniqueIdentifier работает, хотя по какой-то причине это привело к ошибка с последующим значением, добавленным в словарь для версии phonegap. Поэтому я просто закодировал это в том же блоке, что и выше.

Затем измените цель на «PhoneGap», выполните сборку, затем перейдите в папку «Продукты» и откройте папку в finder, скопируйте папку фреймворка и замените ее, найденную в «Пользователи/Общие/PhoneGap/Frameworks».

Проект должен компилировать и быть принят в App Store