application openURL in Swift - swift

I am having an issue with the Appdelegate method OpenURL.
I have setup my Imported UTI's and Document Type. But when opening my app from a mail attachment, the app crashes immediately when I have the method implemented.
The depreciated handleOpenURL works, but not OpenURL?
At the moment I have no code in the implementation, and am just returning true.
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject?) -> Bool {
return true
}
The crash says Thread 1: EXC_BAD_ACCESS (code-1, address-0x0)
I don't really want to have to use the deprecated method.

I have my head blow for a week with this issue.
My app keep crashing after Login Using Social Media Such as Wechat / LinkedIn.But Facebook and Google Sign in Works Fine.
I have notice my app will keep crash after confirm sign in on Wechat Apps and will enter foreground.and Getting BAD EXCESS error. I have try to remove my application open url method on AppDelegate and the app wont crash but the action for Social Media Login are not functioning. so I detect that my issue was on the specific method. after search the web I found that im using an deprecated method of ApplicationOpenUrl as reference from https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
return true
} // this method is deprecated in iOS 9 https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application
notice that the deprecated version are using annotation:Any which will cause issue if you had bridging to an Obj-c framework such as wechat.
So what I do was, I swap my code into a the new format
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
let sourceApplication = options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String
let annotation = options[UIApplicationOpenURLOptionsKey.annotation]
let application = app
return true
}
Hope this help. it will became my reference in feature also. thanks StackOverflow

This is fairly typical of a signature mismatch between the method signatures automatically generated by the Swift compiler and the actual signature. It happens when you try to pass nil from Objective-C into a Swift explicitly unwrapped optional. Change the annotation parameter to be implicitly unwrapped and you should be gtg.

Swift 5 version of Muhammad Asyraf's answer:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let sourceApplication = options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String
let annotation = options[UIApplication.OpenURLOptionsKey.annotation]
return true
}

Related

snapkit login kit not working Swift Xcode 11.3.1

I am using Xcode 11.3.1 and try to login with snapchat with loginkit I add the add information in info.plist and my code is
SCSDKLoginClient.login(from: self, completion: { success, error in
if let error = error {
print(error.localizedDescription)
return
}
if success {
self.fetchSnapUserInfo() //example code
}
})
this code show me the login ui of snapchat and I am login into snapchat with my account.
but I am stuck on this ui
when I am click on continue nothing is happing . SCSDKLoginClient completion block not called.
Please ensure your URL scheme is configured correctly.
URL Schemes
hello everyOne soo finally i found the solution
i am using 11.3.1 and when i create new project the add
AppDelegate and SceneDelegate default class.
so according to snapchat logkit documentation i add
func application(_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
return SCSDKLoginClient.application(app, open: url, options: options)
}
method in my Appdelegate class. but this method never get called in xocode 11.3.1
so the solution of my problem is this
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let url = URLContexts.first?.url else {
return
}
SCSDKLoginClient.application( UIApplication.shared, open: url, options: nil)
}
you need to add this method into your sceneDelegate file. then everything work fine.
synpchat need to update there doc for new xcode 11.3.1. i hope this answer help you guy's because i also wast my 3 day's on this issue.
happy Coding :)

Oauth2 URL callback Mac Swift 4

I am using OAuth 2 into my macOS swift 4 app.
I have successfully implemented the setup of the redirect URI and when the user grants permission, the redirect URI open my mac app using the URL Schemes.
However, there is information in the URL call back that I have been unable to get a method working to catch the redirect.
I've tried these methods in the App Delegate but they don't work:
func application(_ application: NSApplication,
open url: URL,
sourceApplication: String?,
annotation: Any) -> Bool {
//Extract information from URL here
}
and:
func application(_ app: NSApplication, open url: URL) -> Bool {
//Extract information from URL here
}
What is wrong with these methods?
What method should be used in Swift 4 for a Mac app to catch the call back?
Thanks in advance
Found the answer to the question:
func application(_ application: NSApplication,
open urls: [URL]) {
}
Source: https://developer.apple.com/documentation/appkit/nsapplicationdelegate/2887193-application

Unable to open a file using Open in... since Xcode 9.3

Prior to Xcode 9.3 I had no issues importing a file, now when attempting to open a file using open in the app crashes with
Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
It doesn't even reach my
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
let urlName = url.lastPathComponent
print("Gotten a file \(urlName)")
}
So before my app even gets the file it crashes which I dont understand
In the AppDelegate
I also created a new empty project and getting the same issue
These are the necessary document settings
The crash location
Just by luck I came across this method
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
// read in your file
}
So replaced the method above with this and it worked.

LinkedIn Swift session creation completion handler not being called

I'm trying to make a basic LinkedIn login for my app and obtain the user's profile url. I installed the LinkedIn SDK in my project. A couple of notes: In the info.plist, I have put the linkedin URL Scheme, the LSApplicationQueriesScheme and the ExceptionDomains attributes appropriately. In my app delegate, I have
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
if LISDKCallbackHandler.shouldHandle(url) {
return LISDKCallbackHandler.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
}
}
So, in one of my views I am trying to have the user login with linkedin. I put this code in to do that:
LISDKSessionManager.createSession(withAuth: [LISDK_BASIC_PROFILE_PERMISSION], state: nil, showGoToAppStoreDialog: true, successBlock: { (returnState) -> Void in
print("success called!")
print(LISDKSessionManager.sharedInstance().session)
}) { (error) -> Void in
print("Error: \(error)")
}
This code will bring the user to the linkedin app, prompt them to authorize the permissions for my app, and then returns back to my app. However, the success and error blocks never get called. I put breakpoints on both of them to make sure they just weren't printing empty strings, but they are just never called. I have tried waiting several minutes, and still nothing. What am I doing wrong?
I too had this issue. Finally solved by doing this :-
In the app delegate part you need to implement this part of code
if LISDKCallbackHandler.shouldHandle(url) {
return LISDKCallbackHandler.application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplicationOpenURLOptionsKey.annotation])
}
return true
}
in the following delegate method
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
}
insted of
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
It should be like this
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
if LISDKCallbackHandler.shouldHandle(url) {
return LISDKCallbackHandler.application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplicationOpenURLOptionsKey.annotation])
}
return true
}
I maybe have a solution for you. Do you maybe have multiple apps on your phone that use the same Linkedin Application ID? If you do, you should just delete the other ones.

FB login using Swift

I was following this tutorial
https://developers.facebook.com/docs/facebook-login/ios.
I am in step 5. I'm trying to convert
BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation
to swift, Here's what i did
let handled = FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: [UIApplicationOpenURLOptionsKey.sourceApplication], annotation: options[UIApplicationOpenURLOptionsKey.annotation])
return handled
I tried another
let handled = FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication://no idea what to put here , annotation: //and here)
How to resolve this issue?
P.S. I am a newbie in swift, just want to share a site where it could help https://objectivec2swift.com converting from obj-C to Swift.
I was working on Facebook login too. And the problem is here there are two very similar methods. The correct one for Facebook login is your second method which should look like this;
FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
annotation: [:])
By the way if you're a beginner like me i suggest you to subscribe and watch LetsBuildThatApp channel on Youtube. There is a tuttorial for Facebook Log-in too.
Have nice coding.
Just write this -
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool
{
return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}