Pull to refresh

iOS tips and tricks: Динамический Default.png

Reading time 2 min
Views 3.4K
При разработке под iOS время от времени у заказчиков, да и у некоторых программистов возникает закономерный вопрос: «А можно ли каким-нибудь образом при старте приложения подменять картинку?».

Немного порыскав по интернету, и покопавшись в документации, то напрашивается ответ, что сделать это невозможно по следующим причинам:
  • Файл, который показывается при запуске приложения лежит внутри папки приложения, и, ак следовательно переписать его не является возможным
  • По аналогичной причине нельзя изменить файл Info.plist, в котором сохраняется относительный путь к файлу стартовым изображением

Однако, все же, это возможно сделать стандартными способами, без всякого рода Jailbreak'а. Впрочем, как и у каждого решения есть свои плюсы, минусы и особенности.



Решение


Так как менять внутри папки с приложением мы ничего не можем, то и не будем даже пытаться. Вполне возможно, найдутся умельцы, которые смогут это сделать, но речь сейчас не о них.

Итак, разместим Default.png в папке Documents.


Теперь, предполагая, что Default.png размещен в данной папке, поставим в Info.plist относительный путь:
image

Вуаля! Запускаем. Все работает.

Хм. Допустим, если с относительным путем к файлу Default.png все ясно, то как все-таки положить Default.png в папку Documents?
Программно. При первом запуске программы, его необходимо скопировать из того-же Bundle. На самом деле здесь уже есть пару вариантов — скачать Default.png из интернета, сгенерировать его на лету, подложить вместо Default.png только что снятую фотографию. Все зависит от специфики приложения.

Например, это может выглядеть следующим образом:
// получаем путь к папке Documents
NSArray* dirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsPath = [dirs objectAtIndex:0];
NSString * splashDest = [documentsPath stringByAppendingPathComponent:@"Splash.png"];
NSString * splashSrc = [[NSBundle mainBundle] pathForResource:@"Splash" ofType:@"png"];

// Копируем Splash.png
NSFileManager * fm = [NSFileManager defaultManager];
[fm copyItemAtPath:splashSrc toPath:splashDest error:nil];


Особенностью(основным минусом) данного метода является то, что splash не будет виден при первой загрузке, т.к. нет никакой возможности пока не было найдено возможности сразу при установке приложения записать что-то в папку Documents.

P.S. Формально данный метод не нарушает нарушает HIG, а именно: ...All launch images must be PNG files and must reside in the top level of your application’s bundle directory… и… When the system launches an application, it temporarily displays a static launch image on the screen
Так что, использование данного метода в App-Store под большим вопросом.
Кроме этого, не совсем ясно, как данный метод будет работать в случае локализации приложения.

Но, если все вышеперечисленное Вас устраивает, то можете смело использовать данный метод.
Tags:
Hubs:
+1
Comments 10
Comments Comments 10

Articles