приложение за будка за вестници
Напоследък разработвам iOS версията на хартиено списание. Всъщност това е опит да се разкрие точно тази тема.
Ще започна с въведение. Какво е Newsstand? Откъде се е появил такъв субект и в какво се е превърнал? Мислейки, стигнах до следното: тази версия на списанието, обвита в програма за iOS, се различава от pdf в просто безумен размер. Една от причините е огромната купчина снимки. Тази купчина обаче създава блясъка на списанието за iOS. Причината за възникването на идеята за Newsstand, както разбирам, беше позицията на Apple по отношение на собствеността върху определено съдържание. Тези. имаше задача за честно (често срещу заплащане) разпространение на периодични издания, толкова много, че беше трудно копи-пейст. Тези момчета свършиха работата - предполагам, че няма електронно издателство с по-голям паричен поток от Newsstand (ако мога така да се изразя).
След като се запознахме на потребителско ниво с няколко списания, е време да потърсим техническо решение. Първо се появи комплектът Newsstand.
Newsstand Kit се състои от следните gizmos: специален механизъм за управление на библиотеката (NKLibrary) от отделни броеве на списание (NKIssue) и тяхното изтегляне (NKAssetDownload), което включва фоново изтегляне. Ами яко! Тогава обаче ми беше напълно неясно как да превърна тези неща в списание.
Още. Очевидно програмата-списание се състои от две части: управление на броя на списанията и показване на отделно списание. Тези. Newsstand Kit се фокусира върху първия компонент – управлението. Вторият компонент - показването на един брой на списанието - Apple не натовари с никакви шаблони. Ще започна с нея, втората.
Както споменах по-горе, Apple не ограничава много разработчиците, когато става въпрос за показване на определено списание. Вероятно обаче се приема в добър тон,превъртете списанието с плъзгане. За това използвах UIScrollView и идеята за безкрайно превъртане (dev apple -> WWDC -> ScrollView Techniques -> Безкрайно превъртане). С две думи, тогава трябва да поставите UIScrollView върху целия основен изглед. Накарайте UIScrollView да зададе contentSize на три широки екрана и да постави три UIView последователно (всеки с един широк екран) върху него. Има още няколко настройки и имаме красиво превъртане с плъзгане. Накрая остава да имплементираме метода на делегиране на UIScrollView - scrollViewDidEndDecelerating: - и според него да актуализираме вътрешния UIView. Усложнението на безкрайното превъртане - ако поставите друг подобен UIScrollView във видимия UIVeiw - води до хоризонтално и вертикално превъртане.
ДОБРЕ. Остава въпросът: къде да получите UIViews, от които се нуждаете в момента? Да започнем с „сега“. Можем да кажем, че неговата характеристика е номерът на отворената страница на журнала. Оказва се, че ние, в приложението, се нуждаем от нещо, което ще съхранява индекса на текущата страница. Нуждаем се от едно такова нещо за цялото приложение и то трябва да е лесно достъпно - имаме нужда от сингълтън. Имайки индекс, въпросът се свежда до нов: къде да получите подходящ за индекса UIView? Вероятно конфигурацията го знае. Е, тогава: защо не помолим нашия сингълтон да прочете конфигурацията и, знаейки индекса, да издаде желания изглед? Ще дам единичния интерфейс и ще отида до конфигурацията
Обичайно или удобно е да видите .plist файл като конфигурация в Objective-C. Всъщност трябва да съставите plist, който ще показва страниците на списанието, някои настройки за тези страници и връзки към суровини. Мисля, че примерите ще го направят по-ясно.
Мисля, че сте забелязали първото свойство на всяка страница, клас. Да, колко удобно! Написах името на класа в конфигурацията и създадох необходимата страница, използвайки го. Фрагмент от горнотоединичен
Какво остава за споменаване? Ще покажа интерфейса SimplePage. Останалите класове страници, по един или друг начин, го наследяват
Тези. създаваме набор от класове, които наследяват UIView, и според тези класове пишем конфигурацията на едно списание.
Променливата imageDirectory също се появи. Въпросът тук е, че по-късно ще трябва да съберем снимките от брошурата, да поставим plist към тях и да изпратим тези неща да живеят на сървъра. Затова вместо да добавям снимки към проекта, ги събрах в папката на симулатора - DocumentsDirectory. А ето и неговата инициализация
Това е всичко, което исках да ви кажа за реализацията на показване на един дневник. Да отидем по-нататък?
Самата дума подсказва, че нещо трябва да се управлява. Колекция от нещо, изтеглено от сървър. Така стигаме до друга структура. За да го разберете, трябва повърхностно да разгледате NKLibrary и NKIssue.
Просто казано, NKLibrary е колекция за NKIssue-s. NLibrary има редица екстри, т.е. това е колекция, пригодена за Newsstand. Освен това е сингълтън и може би на този етап това е всичко.
NKIssue съхранява информация за един журнал. Емисията трябва да има най-малко име и дата. Ако не греша, името ще бъде ключът и датата ще бъде сортирана.
И така, нещо някъде наднича, имаме проблеми.plist
Изтеглете plist от сървъра, итерирайте го, създайте NKIssue и ги добавете към NKLibrary
Нека обясня. Естествено тук вече сме импортирали NewsstandKit. В противен случай, как бихме могли да знаем за NKLibrary и NKIssue? С лекота в ред получаваме екземпляр на NLibrary - nkLib. Преминавайки през масива, ние молим nkLib да ни даде конкретен журнал по неговото име. Ако библиотеката пише ''fig you'', ще стане ясно, че има лог в конфигурацията, но не и в библиотеката -> трябва да добавите.
В списъка има и ред „ако“.(IS_RETINA)'. Накратко, въпросът тук е, че всички снимки на списанието са на сървъра. Тук вече знаем какъв дисплей имаме. Е, защо да изтегляте снимки за нечий друг дисплей. Гледайки напред, ще кажа, че Apple препоръчва комплектът за изтегляне за всяко списание да бъде издаден като архив. В крайна сметка е логично да се направят два архива за едно списание: прост и @2x.
Разполагаме с актуална NLibrary. Скромно, но вече е възможно да се показва потребителският интерфейс на съществуващите списания.
Трябва да изтеглите комплекта, който е подготвен на етапа на създаване на брошурата. NKAssetDownload е третият NK gizmo - специализиран инструмент за изтегляне за Newsstand (вероятно е така). Процедура: С помощта на NKIssue и NSURLRequest (извлечен от NSURL, който от своя страна е извлечен от URL низа за избрания журнал), инстанцирайте NKAssetDownload. Трябва да извика метода downloadWithDelegate:(id )delegate
Функцията NKAssetDownload е изтегляне във фонов режим. Изисква се за Павилион. Това означава, че изтеглянето ще продължи във фонов режим. Все още има екстри там. Зареждането на bg обаче представлява интерес за нас, тъй като налага задължение при връщане да се извика методът downloadWithDelegate на всички екземпляри на NKAssetDownload:
Всичко изглежда тук. Реанимираме изтеглянето с някакъв вид лента за напредък и изчакайте да приключи. Когато изтеглянето приключи, заменете правилно иконата на приложението: [[UIApplication sharedApplication] setNewsstandIconImage: [publisher coverImageForIssue:nkIssue]]. Ако използваме архив, разархивирайте го. О, да, приложението, след като изтегли лога, трябва да запише файловете си в пътя на свойството NKIssue contentURL (не знам дали е задължително. Може би нещо е оптимизирано там).
Освен това NKIssue получава статус „наличен“ - можете да покажете „брошурата“.
Следващ въпрос:актуализиране на библиотеката - се свежда до презареждане на issues.plist и обработката му със съществуващия метод. Не забравяйте, че там проверихме дали дневникът е добавен към библиотеката или не. Вярно, има съществен проблем. За редица списания потребителят може да забрави за него, докато бъде пуснато ново. И тук, както неуместно, APNS е под ръка. Все същата тема. Признавам, първия път не го овладях. И така или иначе, не съм правил тези бележки в дневника си. Основният препъни камък беше сертификатът или по-скоро необходимостта от конвертирането му.
По-късно UIApplicationDelegate Protocol има метод application:didRegisterForRemoteNotificationsWithDeviceToken:, в който имаме DeviceToken (id) и от който можете да обедините информация към вашия сървър. Наблизо е методът application:didReceiveRemoteNotification:, в който можете да направите нещо при получаване на известие.
От страната на сървъра трябва да приемате заявки (HTTP), които носят DeviceTokens и да ги съхранявате в базата данни. Освен това, според закупените билети или по-скоро според това, което е разположено на сървъра, трябва да потърсите или изпращане на съобщения до APNS. Според неговия API, чрез прикачване на сертификат и парола, ние се свързваме и изпращаме съобщения, които съдържат както полезния товар, така и DeviceTokens. Все още има нюанси, но това е отделен въпрос.
Освен всичко друго, на списанието iOS се налагат още две ограничения. Първият е URL адресът на правилата за поверителност. От техническа страна е изключително просто. Второто ограничение е необходимостта от разпространение на съдържание чрез покупки в приложението iTunesConnect. Доколкото разбирам, това означава, че потребителят е длъжен да купи моето безплатно списание за 0 пари.
В обобщение, iTunesConnect In-App Purchases означава използване на Store Kit. В UserDefaults стартирах свойството isFreeSubscribed. По тапу го проверявам, и при НЕ показвамтревога. По споразумение подписвам
Освен това трябва да внедрите методи за делегиране и да зададете isFreeSubscribed на YES, за да забравите за покупките в приложението. ProductId за SKProductsRequest трябва да бъде получен на уебсайта iTunesConnect, в секцията Управление на покупките в приложението.
В края на историята смятам, че няма дори половината от нуждите на списанието, но искам да вярвам, че успях да очертая най-необходимите технически въпроси за най-простото списание.