swift spritekit Facebook share button

前端 未结 2 1807
暖寄归人
暖寄归人 2020-12-10 08:48

Hey there my app is almost ready for release but i want to add a Facebook share button. The thing is i have no idea how the communication between the scene and the viewcontr

相关标签:
2条回答
  • 2020-12-10 09:29
    func lkFaceBookShare() {
        var serviceType: String = SLServiceTypeFacebook
        if !SLComposeViewController.isAvailableForServiceType(serviceType) {
            self.showUnavailableAlertForServiceType(serviceType)
        }
        else {
            var composeViewController: SLComposeViewController = SLComposeViewController.composeViewControllerForServiceType(serviceType)
            var keyWindow: UIWindow = UIApplication.sharedApplication().keyWindow
            var rect: CGRect = keyWindow.bounds
            UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, false, 0.5)
            self.view!.drawViewHierarchyInRect(rect, afterScreenUpdates: true)
            var viewImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            composeViewController.addImage(viewImage)
            var initalTextString: String = String(format: "Let's join together in the form of underground catch word go along with me!! Link: https://itunes.apple.com/us/app/uoi-hinh-bat-chu-gioi-duoi/id907330926?ls=1&mt=8")
            composeViewController.initialText = initalTextString
            var vc: UIViewController = self.view.window.rootViewController
            vc.presentViewController(composeViewController, animated: true, completion: { _ in })
        }
    }
    
    func showUnavailableAlertForServiceType(serviceType: String) {
        var serviceName: String = ""
        if serviceType == SLServiceTypeFacebook {
            serviceName = "Facebook"
        }
        else if serviceType == SLServiceTypeSinaWeibo {
            serviceName = "Sina Weibo"
        }
        else if serviceType == SLServiceTypeTwitter {
            serviceName = "Twitter"
        }
    
        var alertView: UIAlertView = UIAlertView(title: "Account", message: "Please go to the device settings and add a \(serviceName) account in order to share through that service", delegate: nil, cancelButtonTitle: "Dismiss", otherButtonTitles: "")
        alertView.show()
    }
    

    Swift Conversion of Obj-C answer posted by a very helpful user...... original post

    0 讨论(0)
  • 2020-12-10 09:43

    This is some code I did for twitter a while ago which still works in swift. I show you how to convert it to Facebook below. Put this your viewController:

    func showTweetSheet() {
        let tweetSheet = SLComposeViewController(forServiceType: SLServiceTypeTwitter)
        tweetSheet.completionHandler = {
            result in
            switch result {
            case SLComposeViewControllerResult.Cancelled:
                //Add code to deal with it being cancelled
                break
    
            case SLComposeViewControllerResult.Done:
                //Add code here to deal with it being completed
                //Remember that dimissing the view is done for you, and sending the tweet to social media is automatic too. You could use this to give in game rewards?
                break
            }
        }
    
        tweetSheet.setInitialText("Test Twitter") //The default text in the tweet 
        tweetSheet.addImage(UIImage(named: "TestImage.png")) //Add an image if you like?
        tweetSheet.addURL(NSURL(string: "http://twitter.com")) //A url which takes you into safari if tapped on
    
        self.presentViewController(tweetSheet, animated: false, completion: {
            //Optional completion statement
            })
    }
    

    To convert it to Facebook, simply swap SLServiceTypeTwitter to SLServiceTypeFacebook and rename the variables for readability. If you want to call this method from the SKScene, you have to somehow alert the viewController that you want it to call a method.

    My preferred way is to use NSNotificationCenter so that I post an alert from the scene and it is received by the viewController so that it fires a method. This is also incredibly easy to setup. In the scene, you need to put this line of code wherever you want to call the Facebook popup:

    NSNotificationCenter.defaultCenter().postNotificationName("WhateverYouWantToCallTheNotification", object: nil)
    

    This sends out a notification with a name. Now, in the viewController you need to subscribe to this alert by putting the following code in either viewDidLoad, viewDidAppear or something similar.

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "ThisIsTheMethodName", name: "WhateverYouCalledTheAlertInTheOtherLineOfCode", object: nil)
    

    Now the scene will communicate with the viewController and you will be able to show the Facebook sheet. Remember to replace my strings with ones relative to your project. Hope this helps - sorry it was such a long answer!

    0 讨论(0)
提交回复
热议问题