Как перенести приложение для iOS с листа обмена?IOS

Программируем под IOS
Ответить
Anonymous
 Как перенести приложение для iOS с листа обмена?

Сообщение Anonymous »

Я потратил часы, пытаясь сделать что -то очень простое: откройте общий лист iOS с веб -сайта, нажмите на мое приложение, и открыть приложение с URL, на котором я был передан в мое приложение для отображения. Я пробовал все, от схем URL, чтобы делиться расширениями, до расширений действий и т. Д. Я не уверен, что я делаю не так. Например, используя схемы URL -адреса, где моя схема URL -адреса «MyApp» (и я установил это в типах URL), если я перехожу в Safari и Type myApp: // Поделиться? Я подтверждаю, а затем открывается мое приложение, и URL правильно заполняет мое изначально пустое текстовое поле. Однако, если вместо этого я нажимаю на приложение с листа обмена, это просто странная анимация, где она почти как будто пытается открыть другой лист, но не может. Если я открою свое приложение после этого, URL никогда не был передан, а текстовое поле все еще пусто. У кого -нибудь есть предложения? Спасибо!import SwiftUI
import SwiftData

// You can keep NavigationManager here or move it to its own file.
class NavigationManager: ObservableObject {
static let shared = NavigationManager()
@Published var sharedURL: URL? = nil

func navigateToURL(_ url: URL) {
sharedURL = url
}
}

// The AppDelegate that handles deep linking
import UIKit
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
print(URL)
return true
}

}

@main
struct MyApp: App {
// Connect your AppDelegate to the SwiftUI lifecycle.
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
@StateObject private var navManager = NavigationManager.shared

var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(navManager)
.onOpenURL { url in
// Optional fallback if needed; the AppDelegate should already handle it.
handleSharedURL(url)
}
}
}

private func handleSharedURL(_ url: URL) {
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true),
components.scheme == "myapp",
components.host == "share",
let queryItem = components.queryItems?.first(where: { $0.name == "url" }),
let sharedURLString = queryItem.value,
let sharedURL = URL(string: sharedURLString) else {
return
}
navManager.navigateToURL(sharedURL)
}
}

контроллер общего представления
import UIKit
import Social
import UniformTypeIdentifiers

class ShareViewController: SLComposeServiceViewController {
// MARK: - Lifecycle
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
processSharedURL()
}

// MARK: - Logic
private func processSharedURL() {
guard let inputItem = extensionContext?.inputItems.first as? NSExtensionItem else {
dismissWithError()
return
}

extractURL(from: inputItem) { [weak self] url in
guard let self = self, let url = url else {
self?.dismissWithError()
return
}

// Open the app FIRST, then close the Share Sheet
self.openMainApp(with: url)
self.extensionContext?.completeRequest(returningItems: nil)
}
}

// MARK: - URL Handling
private func extractURL(from item: NSExtensionItem, completion: @escaping (URL?) -> Void) {
let contentTypeURL = UTType.url.identifier
let contentTypeText = UTType.text.identifier

guard let attachment = item.attachments?.first else {
completion(nil)
return
}

if attachment.hasItemConformingToTypeIdentifier(contentTypeURL) {
attachment.loadItem(forTypeIdentifier: contentTypeURL) { (url, _) in
completion(url as? URL)
}
} else if attachment.hasItemConformingToTypeIdentifier(contentTypeText) {
attachment.loadItem(forTypeIdentifier: contentTypeText) { (text, _) in
guard let text = text as? String, let url = URL(string: text) else {
completion(nil)
return
}
completion(url)
}
} else {
completion(nil)
}
}

private func openMainApp(with url: URL) {
guard let encodedURL = url.absoluteString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
let deepLink = URL(string: "myapp://share?url=\(encodedURL)") else {
print("BAD")
return
}

print("Encoded URL: \(encodedURL)")
print("Deep Link: \(deepLink)")

// Open the app and handle errors
extensionContext?.open(deepLink) { success in
if !success {
print("ERROR: Failed to open app with URL \(deepLink)")
}
}
}

// MARK: - Error Handling
private func dismissWithError() {
let error = NSError(domain: "com.yourapp.share", code: 0, userInfo: [NSLocalizedDescriptionKey: "Failed to process the link"])
extensionContext?.cancelRequest(withError: error)
}
}


plist plist:




NSExtension

NSExtensionActivationRule

NSExtensionActivationSupportsWebURLWithMaxCount
1

NSExtensionPrincipalClass
ShareViewController
NSExtensionAttributes

NSExtensionActivationRule
TRUEPREDICATE

NSExtensionMainStoryboard
MainInterface
NSExtensionPointIdentifier
com.apple.share-services


LSApplicationQueriesSchemes

myapp





Основное приложение PLIST:




CFBundleURLTypes


CFBundleTypeRole
Editor
CFBundleURLName
com.elislothower.URLDisplayApp
CFBundleURLSchemes

myapp



LSApplicationQueriesSchemes






Подробнее здесь: https://stackoverflow.com/questions/795 ... hare-sheet
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»