Я потратил часы, пытаясь сделать что -то очень простое: откройте общий лист 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
Как перенести приложение для iOS с листа обмена? ⇐ IOS
Программируем под IOS
-
Anonymous
1741813235
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)
}
}
[b] контроллер общего представления [/b]
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)
}
}
[b] plist plist: [/b]
NSExtension
NSExtensionActivationRule
NSExtensionActivationSupportsWebURLWithMaxCount
1
NSExtensionPrincipalClass
ShareViewController
NSExtensionAttributes
NSExtensionActivationRule
TRUEPREDICATE
NSExtensionMainStoryboard
MainInterface
NSExtensionPointIdentifier
com.apple.share-services
LSApplicationQueriesSchemes
myapp
[b] Основное приложение PLIST: [/b]
CFBundleURLTypes
CFBundleTypeRole
Editor
CFBundleURLName
com.elislothower.URLDisplayApp
CFBundleURLSchemes
myapp
LSApplicationQueriesSchemes
Подробнее здесь: [url]https://stackoverflow.com/questions/79503124/how-to-pass-a-url-to-ios-app-from-share-sheet[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия