2017-06-12 13 views
6

pracuję nad aplikacji iOS, który wykorzystuje rozszerzenie zakładowego zdjęcie, gdzie obraz jest przetwarzany, a nasz główny funkcjonalność jest wyzwalany ..iOS Podziel Extension awarii podczas dzielenia z iOS 11 Screenshot

w symulatorze w sprawie Aplikacja do zdjęć to działa świetnie. Zdecydowałem się uruchomić na urządzeniu z aplikacji Photo i działa również świetnie, ale kiedy zrzuty ekranu i próbuję udostępnić z nowego "Quick screenshot" iOS 11, awarie rozszerzeń, wszelkie pomysły?

Rozszerzenie pobiera obraz, wysyła go do serwera, otrzymuje odpowiedź i wyświetla tę odpowiedź (wszystko w rozszerzeniu). To mnie denerwuje, ponieważ komunikatory Messenger i Snapchat nadal działają, gdy dostęp do nich odbywa się za pomocą szybkiego zrzutu ekranu !!

Xcode 9 również nie daje mi żadnych logów z rozszerzenia udziałów. Warto również zauważyć, że używam konta programisty, które muszę "ufać" za każdym razem, gdy ponownie instaluję aplikację na urządzeniu.

Kod:

// App Group keys 

let suiteName = "group.suite.id" 

override func viewDidLoad() { 
    print("Styling views..") 
    styleViews() 
    print("Styled views") 
    print("Adding notifications..") 
    addNotifications() 
    print("Added notifications") 
    print("Fetching image..") 
    fetchSharedImage() 
} 

func styleViews(){ 
    // Set up main view 
    mainView.layer.cornerRadius = 8 
    mainShadowView.addShadow() 

    // Set up views and buttons 
    // Code hidden, applies shadows etc. 

    // Code hidden, moves constraints of a view 
} 

func addNotifications(){ 
    // Helps views tell their parent (this view controller) to navigate to another form 
    NotificationCenter.default.addObserver(forName: NotificationDisplayFetchedLink, object: nil, queue: nil){ notification in 
     // Handles user info in lambda block 
     guard let userInfo = notification.userInfo, 
      let link = userInfo["link"] as? String 
      else { 
       print("No userInfo found in notification") 
       return 
      } 
     self.displayResult(with: link) 
    } 
} 

func fetchSharedImage(){ 
    // Make sure we have a valid extension item 
    if let content = extensionContext!.inputItems[0] as? NSExtensionItem { 
     let contentType = kUTTypeImage as String 

     // Verify the provider is valid 
     if let contents = content.attachments as? [NSItemProvider] { 
      // look for images 
      for attachment in contents { 
       if attachment.hasItemConformingToTypeIdentifier(contentType) { 
        attachment.loadItem(forTypeIdentifier: contentType, options: nil) { data, error in 
         let url = data as! URL 
         if let imageData = try? Data(contentsOf: url) { 
          self.selectedImage = UIImage(data: imageData) 

          DispatchQueue.main.async { 
           self.selectedImageView.layer.cornerRadius = 8 
           self.selectedImageView.image = self.selectedImage 
          } 
          self.makeWebRequest() 

         } 
        } 
       } 
      } 
     } 
    } 
} 

func makeWebRequest(){ 
    let url = URL(string: "url.json") 
    let task = URLSession.shared.dataTask(with: url!) { data, response, error in 
     guard error == nil else { 
      return 
     } 
     guard let data = data else { 
      // Data is empty 
      return 
     } 

     let json = try! JSONSerialization.jsonObject(with: data, options: []) as! NSDictionary 
     guard let dict = json as? [String:Any] else { return } 
     let item = dict["item"] 
     guard let itemData = item as? [[String:Any]] else { return } 
     let link = itemData[0]["url"] 
     NotificationCenter.default.post(name: NotificationDisplayFetchedLink, object: nil, userInfo: [link: link!]) 
    } 
    task.resume() 
} 

Edit:

więc rozwiązanie (jako Owen powiedział Zhao) jest to, że iOS 11 redaktor screenshot zwraca UIImage, podczas gdy aplikacje takie jak zdjęcia wróci URL.

Moim rozwiązaniem do tego elegancko było zapisanie UIImage LUB URL wyrzucony do UIImage do katalogu tymczasowego iOS (usunięte po 3 dniach), a następnie powrót URL obrazu w tym katalogu do rozszerzenia akcji.

+1

Udostępniaj swój kod wypróbowany – Krunal

+0

Zaktualizowany, aby wyświetlić kod, który zasila rozszerzenie. – bluey31

+1

Czy możesz udostępnić linię błędu .. Jeśli nie drukuje żadnego komunikatu o błędzie w konsoli, użyj trybu debugowania i podaj linię błędu (może być w metodzie makeWebRequest()) – Krunal

Odpowiedz

5

let url = data as! URL if let imageData = try? Data(contentsOf: url) {

Problem jest, bo tutaj dane nie jest adresem URL. Jest to "public.image", spróbuj przekonwertować na UIImage zamiast danych.

+0

Tak, to było rozwiązanie. Opublikuję następującą informację zawierającą więcej informacji .. – bluey31

Powiązane problemy