2016-09-16 9 views
0

Ich möchte meiner bestehenden App eine iMessage-Erweiterung hinzufügen, um benutzerdefinierte Aufkleber anzubieten. Zuerst habe ich:Sticker-Erweiterung mit externer Quelle

Xcode> Datei> Ziel hinzufügen> IMessage Erweiterung

Dann habe ich einige URL Bild gefunden, die ich als Prüfplakette nutzen könnten.

Und mein Controller sieht wie folgt aus:

import UIKit 
import Messages 

class MessagesViewController: MSMessagesAppViewController, MSStickerBrowserViewDataSource { 

    var stickers = [MSSticker](); 
    var url = ["http://iconizer.net/files/Brightmix/orig/monotone_close_exit_delete_small.png","https://upload.wikimedia.org/wikipedia/commons/d/d5/Japan_small_icon.png"]; 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 

     print(" ----- HERE"); 

     loadStickers(); 
     createStickerBrowser(); 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK: - Stickers Handling 

    func loadStickers() { 

     print(" ----- loadStickers"); 

     for i in 0...1 { 
      do { 
       let sticker = try MSSticker(contentsOfFileURL: URL(string: url[i])!, localizedDescription: "\(i)") 
       print(" \(i) : \(sticker)"); 
       stickers.append(sticker) 
      } catch { 
       print("error \(error)"); 
      } 
     } 
    } 

    func createStickerBrowser() { 

     print(" ----- createStickerBrowser"); 

     let controller = MSStickerBrowserViewController(stickerSize: .large) 

     addChildViewController(controller) 
     view.addSubview(controller.view) 

     controller.stickerBrowserView.backgroundColor = UIColor.gray 
     controller.stickerBrowserView.dataSource = self; 

     view.topAnchor.constraint(equalTo: controller.view.topAnchor).isActive = true 
     view.bottomAnchor.constraint(equalTo: controller.view.bottomAnchor).isActive = true 
     view.leftAnchor.constraint(equalTo: controller.view.leftAnchor).isActive = true 
     view.rightAnchor.constraint(equalTo: controller.view.rightAnchor).isActive = true 
    } 

    // MARK: - MSStickerBrowserViewDataSource 

    func numberOfStickers(in stickerBrowserView: MSStickerBrowserView) -> Int { 
     return stickers.count 
    } 

    func stickerBrowserView(_ stickerBrowserView: MSStickerBrowserView, stickerAt index: Int) -> MSSticker { 
     return stickers[index] 
    } 

    // MARK: - Conversation Handling 

    override func willBecomeActive(with conversation: MSConversation) { 
     // Called when the extension is about to move from the inactive to active state. 
     // This will happen when the extension is about to present UI. 

     // Use this method to configure the extension and restore previously stored state. 
     print("----- willBecomeActive"); 
    } 

    override func didResignActive(with conversation: MSConversation) { 
     // Called when the extension is about to move from the active to inactive state. 
     // This will happen when the user dissmises the extension, changes to a different 
     // conversation or quits Messages. 

     // Use this method to release shared resources, save user data, invalidate timers, 
     // and store enough state information to restore your extension to its current state 
     // in case it is terminated later. 
     print("----- didResignActive"); 
    } 

    override func didReceive(_ message: MSMessage, conversation: MSConversation) { 
     // Called when a message arrives that was generated by another instance of this 
     // extension on a remote device. 

     // Use this method to trigger UI updates in response to the message. 
    } 

    override func didStartSending(_ message: MSMessage, conversation: MSConversation) { 
     // Called when the user taps the send button. 
    } 

    override func didCancelSending(_ message: MSMessage, conversation: MSConversation) { 
     // Called when the user deletes the message without sending it. 

     // Use this to clean up state related to the deleted message. 
    } 

    override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) { 
     // Called before the extension transitions to a new presentation style. 

     // Use this method to prepare for the change in presentation style. 
    } 

    override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) { 
     // Called after the extension transitions to a new presentation style. 

     // Use this method to finalize any behaviors associated with the change in presentation style. 
    } 

} 

ich keine meiner gedruckt zu sehen und die Hintergrundfarbe ist in Ordnung, aber ich kann nicht meine Aufkleber sehen. Apple Doc sagt Folgendes:

fileURL Eine URL für das Bild, das von diesem Sticker angezeigt wird. Diese URL muss sich auf eine Datei beziehen, die auf dem Gerät gespeichert ist. Die Datei muss eine PNG-, APNG-, GIF- oder JPEG-Datei sein und weniger als 500 KB groß sein. Für die besten Ergebnisse sollte das Bild nicht kleiner als 100 x 100 Punkte oder größer als 206 x 206 Punkte sein. Stellen Sie immer @ 3x Bilder (300 x 300 Pixel bis 618 x 618 Pixel) bereit. Das System generiert die @ 2x- und @ 1x-Versionen, indem es die @ 3x-Bilder zur Laufzeit herunterskaliert.

Also wissen Sie eine Möglichkeit, lokal Bild von einem Server heruntergeladen zu speichern?

Antwort

0

Speichern Sie einfach heruntergeladene Bild mit der Erweiterung (PNG oder JPG). An meinem Beispiel habe ich gespeichert png-Dateien auf dem Standort der discardable Cache-Dateien (Library/Caches)

[...]/Library/Caches/StickerCache/Pack_1188767/image_166176391.png 
0

Sie können ganz einfach normal und animierte Aufkleber an eine bestehende App hinzufügen.

Fügen Sie ein neues Ziel hinzu und wählen Sie "Sticker App Extension". Leider müssen Sie scrollen, um diese Option zu sehen.

"iMessage Extension" ist die richtige Wahl, wenn Sie mehr als nur Aufkleber, z. B. interaktive iMessage-Apps, wünschen.

New Target Dialog

Verwandte Themen