6

我正在做一个在 Vimeo 上分享视频的项目。在这个我的应用程序中打开一个视频,用户需要按下授权按钮在 Vimeo 上授权应用程序并获取访问令牌。因此,为此,我的应用程序会打开 safari 并在那里打开 Vimeo 的网站。用户需要按下允许按钮,然后它必须再次返回到应用程序。但我无法知道让 Safari/Vimeo 回到我的应用程序的回调 url 应该是什么。

请提出您对此的看法。

4

3 回答 3

20

您需要通过编辑应用的 Info.plist 为您的应用设置自定义 URL 方案。Apple 的开发者网站上有大量关于此的文档。这是一篇详细介绍的文章:http: //iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html

然后您的网站只需要打开一个使用您应用的 url 方案的 url(例如:myappscheme://do/something/cool?foo=bar)。如果您的应用关心通过您的网站传入的任何数据,则实现“application:openURL:sourceApplication:annotation:”方法并检查传入的 NSURL。您可以在 Apple 的文档中阅读更多相关信息:http://developer .apple.com/library/ios/#documentation/uikit/reference/UIApplicationDelegate_Protocol/Reference/Reference.html

于 2013-07-09T05:14:06.113 回答
3

您需要为您的应用程序实现称为“URL Scheme”的东西,这意味着将您的应用程序注册到某个 url,以便可以从中打开它。

1)您应该在 info.plist 文件中添加一行。2)您需要在您的应用程序中收听 url,并执行所需的操作。

谷歌了解更多信息...

于 2013-07-09T05:14:24.490 回答
1

要支持自定义 URL 方案:

  1. 定义应用 URL 的格式。
  2. 注册您的方案,以便系统将适当的 URL 定向到您的应用程序。
  3. 处理您的应用收到的 URL。

URL 必须以您的自定义方案名称开头。为您的应用支持的任何选项添加参数。例如,照片库应用程序可能会定义一个 URL 格式,其中包括要显示的相册的名称或索引。

一个例子是:

myphotoapp:albumname?name="foods"
myphotoapp:albumname?index=1

注册您的 URL 方案

在此处输入图像描述

  1. 单击项目目标并转到信息页面
  2. 在信息页面展开 URL 类型部分并点击 + 按钮
  3. 用适当的值填充字段。

处理传入的 URL

系统通过调用您的应用程序委托的应用程序(_:open:options:) method. you can useNSURLComponents` API 来提取组件,将 URL 传递给您的应用程序。从系统提供的选项字典中获取有关 URL 的其他信息,例如哪个应用程序打开了它。

func application(_ application: UIApplication,
                 open url: URL,
                 options: [UIApplicationOpenURLOptionsKey : Any] = [:] ) -> Bool {
    
    // Determine who sent the URL.
    let sendingAppID = options[.sourceApplication]
    print("source application = \(sendingAppID ?? "Unknown")")
    
    // Process the URL.
    guard let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true),
        let albumPath = components.path,
        let params = components.queryItems else {
            print("Invalid URL or album path missing")
            return false
    }
    
    if let photoIndex = params.first(where: { $0.name == "index" })?.value {
        print("albumPath = \(albumPath)")
        print("photoIndex = \(photoIndex)")
        return true
    } else {
        print("Photo index missing")
        return false
    }
}

如果您的应用已选择启用Scenes,并且您的应用未运行,则系统会scene(_:willConnectTo:options:)在启动后将 URL 传递给委托方法,以及scene(_:openURLContexts:)当您的应用在内存中运行或挂起时打开 URL。

func scene(_ scene: UIScene, 
           willConnectTo session: UISceneSession, 
           options connectionOptions: UIScene.ConnectionOptions) {

    // Determine who sent the URL.
    if let urlContext = connectionOptions.urlContexts.first {
            
        let sendingAppID = urlContext.options.sourceApplication
        let url = urlContext.url
        print("source application = \(sendingAppID ?? "Unknown")")
        print("url = \(url)")
            
        // Process the URL similarly to the UIApplicationDelegate example.
    }
}

于 2021-02-27T08:36:53.867 回答