我正在研究处理自定义URL方案的应用程序的Swift版本。
您需要实施的方法在iOS 9中已更改。
该方法的Objective-C版本在Objective-C应用程序中正常工作:
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<NSString *,
id> *)options
{
//my code here
}
但是,在我的Swift应用程序中,等效功能:
func application(application: UIApplication,
openURL: NSURL,
options: [String : AnyObject]) -> Bool
{
//My code here
}
我在iOS 9设备上运行应用时从未调用过。当我在Safari中调用我的自定义URL方案时,系统会提示“打开”appname“?”,当我点击打开时,它会将我的应用程序带回前台,但上述方法不会被调用。
我的方法签名中必定存在一些微妙的不匹配,但我看不到它。我究竟做错了什么?我尝试过各种各样的变化,但都没有。
答案 0 :(得分:1)
我的问题似乎是由于项目损坏导致的红鲱鱼。我创建了一个新项目文件并在新项目中复制了相同的代码,application:openURL:options:
被正确调用。
这是一个非常奇怪的问题。如果我在故障项目中删除“AppDelegate.swift”并将其替换为AppDelegate.m / AppDelegate.h,则在Objective-C版本中正确调用application:openURL:options:
。
我怀疑Xcode中存在一个间歇性错误导致某些项目在应用程序委托给Swift时无法调整您的应用程序委托application:openURL:options:
。
如果您遇到同样的问题,可能需要创建一个新项目,设置info.plist,然后复制application:openURL:options:
方法以查看新项目是否调用您的方法。
答案 1 :(得分:0)
功能签名(iOS9)是:
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool
如果你想测试它的工作原理,只需将其复制到你的app delegate:
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool
{
print("Scheme: \(url.scheme)")
print("Host: \(url.host)")
print("Path: \(url.path)")
print("Query String: \(url.query)")
// DEBUG: get all key-value pairs in options also
for (key, value) in options {
print("Key: \(key), Value: \(value)")
}
return true
}
还要记住将“scheme”(应用程序名称)添加到info.plist文件中。像这样在手机上通过Safari拨打电话
方案://主机/路径查询