Dodawanie Today Extension w 8 krokach
Od wprowadzenia iOS 8 w 2014 programiści mają dostęp do wielu użytecznych funkcjonalności. Jedna z nich – Today Extension pozwala na współdzielenie funkcjonalności aplikacji z iOS i innymi aplikacjami. Today Extension umożliwia wyświetlanie informacji dla użytkownika w centrum powiadomień, wyszukiwarce lub na ekranie blokady. Głównym zadaniem tego rozszerzenia jest zachowanie interakcji między aplikacją i użytkownikiem nawet jeśli aplikacja nie jest otwarta.
Spis treści
- Stwórz nowy projekt aplikacji
- Stwórz nowy target dla Today Extension
- Dodaj nowy label do MainInterface.storyboard
- Dodaj ciało klasy i połącz z plikiem storyboard
- Dodaj kod do nagłówka pliku
- Skopiuj funkcję dodawania danych
- Zastąp metodę viewDidLoad
- Skompiluj i uruchom aplikację
- Dodaj funkcjonalność “Pokaż więcej/mniej” (opcjonalnie)
Poniżej znajdziesz instrukcję w 8 krokach (i jednym opcjonalnym) jak dodać Today Extension do twojego kodu.
Zacznijmy więc!
Krok 1: Stwórz nowy projekt aplikacji
Today Extension działa tylko w powiązaniu z aplikacją. Aby utworzyć nowy projekt aplikacji otwórz XCode, wybierz New -> Project -> iOS -> Single View App. Po naciśnięciu Next, nazwij swój projekt i wybierz folder gdzie ma on być zapisany.
Krok 2: Stwórz nowy target dla Today Extension
Następnie, utwórz nowy target dla Today Extension. Możesz to wykonać przez wybranie Editor -> Add Target -> Today Extension w sekcji iOS \ Application Extension:

W kolejnym widoku należy ustawić Nazwę Produktu np.“Extension”. Po wciśnięciu “Finish” w projekcie, zobaczysz dwa targety:

Utworzone zostają następujące pliki:

Krok 3: Dodaj nowy label do MainInterface.storyboard
Teraz otwórz plik MainInterface.storyboard, zmień wysokość kontrolera widoku na 200, usuń istniejący label i dodaj nowy, o tytule “(No data)” w pozycji wyśrodkowanej:

Krok 4: Dodaj ciało klasy i połącz z plikiem storyboard
Przejdź do pliku TodayViewController.swift i dodaj poniższe do ciała klasy:
@IBOutlet weak var ipLabel: UILabel!i połącz z plikiem storyboard
Krok 5: Dodaj kod do nagłówka pliku
Dodaj poniższe do nagłówka pliku:
struct Response: Codable {
    let ip: String
}Krok 6: Skopiuj funkcję dodawania danych
Następnie, skopiuj następującą funkcję do ciała TodayViewController.swift:
// MARK: - Loading of data
	
	func loadData() {
		DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
			
            guard let url = URL(string: "https://api.ipify.org/?format=json") else { return }
            URLSession.shared.dataTask(with: url) { data, response, error in
                
                guard let data = data else { return }
                do {
                    let res = try JSONDecoder().decode(Response.self, from: data)
                    DispatchQueue.main.async {
                        self.ipLabel.text = res.ip
                    }
                } catch let error {
                    DispatchQueue.main.async {
                        self.ipLabel.text = error.localizedDescription
                    }
                }
            }.resume()
		}
	}Powyższa funkcja podmienia label “(No data)” na label twojego API kiedy połączenie z internetem jest aktywne.
Funkcja jest już zaimplementowana, ale jeszcze nie wywoływana.
Krok 7: Zastąp metodę viewDidLoad
Podmień metodę viewDidLoad na:
 override func viewDidLoad() {
        super.viewDidLoad()
  
        self.preferredContentSize.height = 200
        loadData()
    }Wywołaj funkcję loadData w metodzie widgetPerformUpdate:
func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
        // Perform any setup necessary in order to update the view.
        // If an error is encountered, use NCUpdateResult.Failed
        // If there's no update required, use NCUpdateResult.NoData
        // If there's an update, use NCUpdateResult.NewData
        loadData()
		
        completionHandler(NCUpdateResult.newData)
    }Krok 8: Skompiluj i uruchom aplikację
Naciśnięcie z przytrzymaniem ikony aplikacji wyświetli następujące informacje:

Pokazana wartość to twój adres IP.
Możesz też dodać widget do twojej listy widgetów wyświetlanej na ekranie głównym po przesunięciu ekranu w lewo:

Krok 9 (opcjonalny): Dodaj funkcjonalność “Pokaż więcej/mniej”
Wraz z wprowadzeniem iOS10 Apple dostarczył API obsługujący funkcję „Show More/Show Less”. Rozszerz metodę viewDidLoad:
override func viewDidLoad() {
        super.viewDidLoad()
		
		if #available(iOSApplicationExtension 10.0, *) {
			extensionContext?.widgetLargestAvailableDisplayMode = .expanded
		}
        
		self.preferredContentSize.height = 200
		
		loadData()
    }Dodaj poniższe do ciała TodayViewController:
func widgetMarginInsets(forProposedMarginInsets defaultMarginInsets: UIEdgeInsets) -> (UIEdgeInsets) {
		return UIEdgeInsets.zero
	}
	
	@available(iOSApplicationExtension 10.0, *)
	func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
		if activeDisplayMode == .expanded {
			preferredContentSize = CGSize(width: maxSize.width, height: 300)
		}
		else if activeDisplayMode == .compact {
			preferredContentSize = maxSize
		}
	}wyświetli się:






