【问题标题】:iOS - Open certain view controller with URL schemeiOS - 使用 URL 方案打开某些视图控制器
【发布时间】:2012-06-11 03:23:49
【问题描述】:

我正在我的应用程序中使用 URL 方案。我轻松地制作了一个来打开我的应用程序,只需将必要的项目添加到 info.plist。当前 URL“myappname://”将用户带到初始视图控制器 FirstTableViewController,但我想知道是否可以修改该 URL 方案,以便我可以拥有一个将用户带到某个视图控制器的方案,比如 ThirdTableViewController。我会将此作为启动中心之类的便利功能使用。

【问题讨论】:

    标签: ios url uiviewcontroller url-scheme


    【解决方案1】:

    您好,这是我的解决方案。

    如果您可以调用在“application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool”事件中调用的导航功能(有延迟),您可以在应用程序中导航特定页面,即使在调用之前没有运行。

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            // Actived keyboard avoider
            changeAppereance()
            delay(1) {
                deeplink = Deeplink()
                self.manageNavigation(launchOptions: launchOptions)
                self.navigate()
            }
    
            return true
    
        }
    
    
        private func manageNavigation(launchOptions: [UIApplicationLaunchOptionsKey: Any]?) {
            if let url = launchOptions?[UIApplicationLaunchOptionsKey.url] as? URL { //Deeplink
                print(url.absoluteString)
                deeplink = Deeplink()
                deeplink?.url = url
            }
            else if let activityDictionary = launchOptions?[UIApplicationLaunchOptionsKey.userActivityDictionary] as? [AnyHashable: Any] { //Universal link
                for key in activityDictionary.keys {
                    if let userActivity = activityDictionary[key] as? NSUserActivity {
                        if let url = userActivity.webpageURL {
                            deeplink = Deeplink()
                            deeplink?.url = url
                        }
                    }
                }
            }
    
        }
    
    open func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
            print(url.absoluteString)
            deeplink = Deeplink()
            deeplink?.url = url
            navigate()
            return true
        }
    

    【讨论】:

      【解决方案2】:

      是的,可以修改 URL 方案,以便您可以将用户跳转到任何视图控制器。我使用并实现了普通以及 https://hokolinks.com/ 深层链接。通过 hoko 链接深层链接,您可以修改您的 URL 方案,您也可以使用该 URL 发送数据。

      使用 Hoko Link 集成 iOS SDK - 将 URL 方案添加到您的应用程序 - SDK 设置 要将 HOKO 开源 SDK 集成到您的应用中(仅限 iOS 5 及更高版本),您只需遵循 3 个简单的步骤(使用 cocoapods 或手动执行)。

      使用 CocoaPods

      1- 在系统中安装 CocoaPods

      2- 打开您的 Xcode 项目文件夹并创建一个名为 Podfile 的文件,其内容如下:

      pod 'Hoko', '~> 2.3.0' 3- 运行 pod install 并等待 CocoaPods 安装 HOKO SDK。从现在开始,您应该开始使用 .xcworkspace,而不是使用 .xcodeproj 文件。

      手动集成

      1- 下载 Hoko SDK。

      2- 将 Hoko 文件夹拖到您的项目中。

      3- 确保还添加 SystemConfiguration.framework 和 zlib.dylib,以防您的项目尚未包含它。

      将 SDK 与您的 Swift 项目集成

      因为 HOKO SDK 是用 Objective-C 编写的,所以您必须手动将桥接头文件添加到您的项目中,以便在您的 Swift 代码中使用它:

      1- 文件 > 新建 > 文件... > iOS > 源代码 > 头文件

      2- 将该头文件命名为 YourAppName-Bridging-Header.h

      3- 在该头文件中,导入#import

      4- 转到您的项目 > 构建设置 > 搜索 Objective-C 桥接头 > 从您的根文件夹(例如 MyApp/MyApp-Bridging-Header.h)添加到桥接头文件的路径

      为您的应用添加 URL 方案

      接下来,我们需要定义您应用的自定义 URL 类型(如果您还没有的话)。打开您的 Xcode 项目设置并在“信息”选项卡下展开“URL 类型”部分。如果您已经配置了 URL 类型,则可以跳过此步骤。

      如果此部分为空,请单击“+”图标以添加新的 URL 类型。假设我们想通过“hoko://”打开应用程序。因此,我们需要在 URL Schemes 中输入“hoko”。

      我们还应该为这个 URL 类型分配一个唯一的标识符。 Apple 建议您使用反向 DNS 表示法来确保类型之间没有名称冲突。在本例中,我们将使用“com.hoko.app”。

      记下您的 URL Scheme,因为当您通过仪表板创建应用程序时,我们会要求您提供它,例如“hoko”。

      网址方案

      设置关联域(通用链接) - iOS 9.0+

      要让您的应用程序完全支持 Apple 新推出的通用链接,您必须在应用程序目标的“功能”选项卡内的“关联域”部分启用并添加一个新条目。单击“+”按钮并添加一个具有以下值的新条目:applinks:myapp.hoko.link,myapp 是您为应用程序的 Hoko 链接选择的 Hoko 子域。您还可以拥有自己的链接域(在子域部分了解更多信息)。

      网址方案

      SDK 设置

      将以下行添加到您的 AppDelegate 类中的 applicationDidFinishLaunching 方法中(如果您使用的是 Objective-C,请不要忘记使用 #import 导入 HOKO 类)。

      Objective-C 迅速 #导入

      - (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [Hoko setupWithToken:@"YOUR-APP-TOKEN"];
       // The rest of your code goes here...
      
        return YES;
      }
      

      如果您在智能链接中使用自定义域,则必须使用 setupWithToken:customDomain: 设置 iOS SDK,如下所示:

      Objective-C 迅速 #导入

      - (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        [Hoko setupWithToken:@"YOUR-APP-TOKEN"
           customDomain:@"your.custom.domain.com"];
        // The rest of your code goes here...
      
       return YES;
      

      } 注意:确保在 application:didFinishLaunchingWithOptions: 委托方法中返回 YES,以允许处理打开您的应用程序的传入深层链接。返回 NO 将阻止请求。

      使用 Hoko Link SDK 设置您的移动深度链接

      【讨论】:

        【解决方案3】:

        这篇文章有点旧,但可能对 iOS 5 + 有用,因为检查的答案不正确。

        AppDelegate 没有任何 navigationController 属性。

        相反,您可以在 AppDelegate.m 中执行:

        enter code here
        
        - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
            MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
            UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
            [navController presentModalViewController:controller animated:YES];
        
            return YES;        
        }
        

        【讨论】:

          【解决方案4】:

          试试看这个:Custom Url Schemes

          希望对你有用

          【讨论】:

            【解决方案5】:

            在 ...AppDelegate.m

            - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
            MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
            [self.viewController presentModalViewController:controller animated:YES];
            [controller release];
            
            return YES;        
            }
            

            【讨论】:

            • 正是我所需要的。非常感谢您的帮助!
            • 我收到 self.viewcontroller 不是 AppDelegate 中的属性的错误。那是您创建的自定义属性吗?你用它做什么?
            • 是的,我也遇到了这个问题,似乎没有人回答这个问题。
            • 如上AppDelegate 没有viewContoller 属性
            • 这很快会怎样?
            猜你喜欢
            • 2012-02-20
            • 2019-10-07
            • 1970-01-01
            • 1970-01-01
            • 2014-11-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多