Estoy tratando de hacer que compartir desde mi aplicación a Instagram sea fácil. Y lo que quiero es llegar a la pantalla que se muestra en la captura de pantalla a continuación. Probé instagram-stories://share deeplink y leí todos estos documentos: https://developers.facebook.com/docs/instagram/sharing-to-stories/
Sin embargo, haga lo que haga, cuando se activa la acción del esquema de URL, pasa directamente a compartir la imagen en la historia. ¿Que me estoy perdiendo aqui?
Aquí está mi extracto de código:
if let image = image { guard let urlScheme = URL(string: "instagram-stories://share"), let imageData = image.pngData() else { return } if UIApplication.shared.canOpenURL(urlScheme) { let pasterboardItems = [["com.instagram.sharedSticker.backgroundImage": imageData]] let pasterboardOptions = [UIPasteboard.OptionsKey.expirationDate: Date().addingTimeInterval(60*5)] UIPasteboard.general.setItems(pasterboardItems, options: pasterboardOptions) UIApplication.shared.open(urlScheme, options: [:], completionHandler: nil) } }Lo que debe hacer es abrir la aplicación de Instagram utilizando la siguiente URL:
instagram://library?LocalIdentifier= y páselo como parámetro PHAsset.localIdentifier .
Por alguna razón, este gancho no aparece en ninguna parte de la documentación 🤷♂️
Pero para recibir un identificador local para su imagen/video, primero debe guardar la imagen/video en la biblioteca de fotos del usuario. Así que el código final se vería así
let videoFileUrl: URL = URL(fileURLWithPath: "path/to/my/video")! var localId: String? PHPhotoLibrary.shared().performChanges({ let request = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: videoFileUrl) localId = request?.placeholderForCreatedAsset?.localIdentifier }, completionHandler: { success, error in // completion handler is called on an arbitrary thread // but since you (most likely) will perform some UI stuff // you better move everything to the main thread. DispatchQueue.main.async { guard error == nil else { // handle error return } guard let localId = localId else { // highly unlikely that it'll be nil, // but you should handle this error just in case return } let url = URL(string: "instagram://library?LocalIdentifier=\(localId)")! guard UIApplication.shared.canOpenURL(url) else { // handle this error return } UIApplication.shared.open(url, options: [:], completionHandler: nil) } })image es "png"LSApplicationQueriesSchemes )