Giter Site home page Giter Site logo

gabek / gityourfeedback Goto Github PK

View Code? Open in Web Editor NEW
59.0 59.0 18.0 8.66 MB

Let users submit feedback, with screenshots, directly from your iOS app to Github Issues

License: MIT License

Swift 96.82% Ruby 3.18%
feedback-interface github-issues ios screenshot

gityourfeedback's Introduction

Hello, I'm Gabe.

Check out some of what I'm working on

Latest releases I've contributed to

My recent blog posts

Movies I've recently watched

Contact me

gityourfeedback's People

Contributors

davidebest avatar dcaunt avatar deltaheavy avatar funky-monkey avatar gabek avatar pchelnikov avatar readmecritic avatar sbshah97 avatar tanishgupta16 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

gityourfeedback's Issues

Add some simple field validation

So a completely empty piece of feedback cannot be submitted. I guess the title and email should be required, but the body and screenshot are optional.

Crash in FeedbackInterfaceViewController

Stacktrace

-;function signature specialization  of GitYourFeedback.FeedbackInterfaceViewController.((handleScreenshot in _761961F56A18DE3F18D6C8C18AA32A2D) () -> ()).(closure #1);FeedbackViewController.swift;0
-;partial apply forwarder for GitYourFeedback.FeedbackInterfaceViewController.((handleScreenshot in _761961F56A18DE3F18D6C8C18AA32A2D) () -> ()).(closure #1);FeedbackViewController.swift;0

Reason

objc_msgSend() selector name: configureAnimation:forLayer:forKey:

Application Specific Information:
objc_msgSend() selector name: configureAnimation:forLayer:forKey:

Thread 0:
0   libsystem_kernel.dylib               0x000000018af0e8e8 __ulock_wait + 8
1   QuartzCore                           0x000000018f2461f8 -[CALayer frame] + 40
2   UIKit                                0x0000000191d80e74 -[UIView(Geometry) frame] + 120
3   UIKit                                0x0000000191d81db0 -[UIView(Geometry) setFrame:] + 656
4   UIKit                                0x0000000191d95acc -[UIImageView _setViewGeometry:forMetric:] + 176
5   UIKit                                0x0000000191dddba0 -[UIButton layoutSubviews] + 204
6   UIKit                                0x0000000191e49308 -[UINavigationButton layoutSubviews] + 64
7   UIKit                                0x0000000191d85738 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1192
8   QuartzCore                           0x000000018f24e40c -[CALayer layoutSublayers] + 144
9   QuartzCore                           0x000000018f2430e8 CA::Layer::layout_if_needed(CA::Transaction*) + 288
10  UIKit                                0x0000000191d9a1a8 -[UIView(Hierarchy) layoutBelowIfNeeded] + 1016
11  UIKit                                0x0000000191e1d8c4 -[UINavigationBar setCenter:] + 108
12  UIKit                                0x0000000191e1d4bc -[UINavigationController _positionTopBar:hidden:edge:center:offset:] + 236
13  UIKit                                0x0000000191e1d0ac -[UINavigationController _positionNavigationBarHidden:edge:initialOffset:] + 572
14  UIKit                                0x0000000191e1cddc -[UINavigationController _positionNavigationBarHidden:edge:] + 392
15  UIKit                                0x0000000191e3eb58 -[UINavigationController _updateBarsForCurrentInterfaceOrientation] + 40
16  UIKit                                0x0000000191e04f44 -[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:] + 936
17  UIKit                                0x0000000191e3e928 -[UINavigationController viewDidMoveToWindow:shouldAppearOrDisappear:] + 92
18  UIKit                                0x0000000191d84d48 -[UIView(Internal) _didMoveFromWindow:toWindow:] + 1348
19  UIKit                                0x0000000191d83f7c __45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke + 152
20  Foundation                           0x000000018c96c510 -[NSISEngine withBehaviors:performModifications:] + 164
21  UIKit                                0x0000000191d83df0 -[UIView(Hierarchy) _postMovedFromSuperview:] + 816
22  UIKit                                0x0000000191d8fcbc -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1784
23  UIKit                                0x0000000191d8f5a8 -[UIView(Hierarchy) addSubview:] + 824
24  UIKit                                0x0000000191e81a80 -[UITransitionView transition:fromView:toView:removeFromView:] + 1468
25  UIKit                                0x0000000191e80fa4 -[UIViewControllerBuiltinTransitionViewAnimator animateTransition:] + 1628
26  UIKit                                0x00000001920d6ed0 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 2468
27  UIKit                                0x000000019201a264 _runAfterCACommitDeferredBlocks + 288
28  UIKit                                0x000000019200c018 _cleanUpAfterCAFlushAndRunDeferredBlocks + 556
29  UIKit                                0x0000000191d7ad6c _afterCACommitHandler + 164
30  CoreFoundation                       0x000000018beed7dc __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 28
31  CoreFoundation                       0x000000018beeb40c __CFRunLoopDoObservers + 368
32  CoreFoundation                       0x000000018beeb89c __CFRunLoopRun + 1020
33  CoreFoundation                       0x000000018be1a048 CFRunLoopRunSpecific + 440
34  GraphicsServices                     0x000000018d89d198 GSEventRunModal + 176

Text field resizing: Make it less janky

Feedback from user:

after I added an attachment, and was typing a longer report, it wrapped and unwrapped text awkwardly trying to resize the text box.

it resized as I typed, growing and shrinking. erratically.

Release v0.1.1

  • Update Readme to reflect any changes. Including badge version number and no longer having to create your own struct.
  • Update web site.
  • Update screenshots + animated gif.
  • Detail the use of the new dependancies for the templating and image editing.
  • Release to cocoapods

Add S3 storage support.

We should be able to use S3 or Google Cloud for storage.

We could just make it completely storage agnostic, but that would remove some of the convenience of this tool.

Add additional hardware specs to the email metadata template

Used Luminous as an inspiration for some additional data points that would be useful to send along with an issue. Pointed to their implementations where it makes sense.

https://github.com/gabek/GitYourFeedback/blob/master/GitYourFeedback/Classes/Helpers.swift#L29

Before release: Update Readme + Web site

The Readme and web page (docs directory) needs to reflect the current state of v0.1.0 just before release. This is mostly to make sure the installation/usage instructions are correct.

Additional metadata to add in the submitted issue

Here's what Apple's TestFlight supplies:

App Information:
App Name: Appname
App Version: 1.0 (105)
Installed App Version: 1.0 (105)

Device Information:
Device: iPhone9,3
iOS Version: 10.0.1
Language: en-US (English (United States))
Carrier: AT&T
Timezone: PDT
Architecture: N/A
Connection Status: WiFi
Paired Apple Watch: Apple Watch - Watch OS 3.0 (14S326)

Update the issue template to be more maintainable

https://github.com/gabek/GitYourFeedback/blob/master/GitYourFeedback/Classes/Helpers.swift#L29

Maybe using an external markdown text file or something? There is some options for templating in Swift, but I don't know if it's worth being that heavy handed about it. https://github.com/kylef/Stencil

This should include moving the metadata pieces of the template to a markdown formatted table so it's easier to read.

Something along the lines of:

Thing Value
Thing 1 It's value
Thing 2 Some other value
Screen Resolution 867 x 309

Error handling: Failed upload to storage

This should bubble up an error in some way. Probably a simple popup stating that the upload could not complete, but the feedback was still sent successfully, just without a screenshot.

Request: Submit feedback in the background

This makes error handling a little more shaky. If we dismiss the UI and something fails we could alert the user that it failed, but the interface would be gone. Do we re-show it? Or maybe ask them if they want to re-submit?

Easy!: Create animated GIF of the project in use

Before cutting our first release I'd love to see a couple people try it in their own apps! This way any issues can be surfaced and the Readme can be polished up with real integration steps.

How can you help?

  • Add this to a project of yours, or if you have nothing to add it to, use the example project.
  • Use something like Licecap to create an animated GIF of you using it in the simulator or a real device.
  • Create a PR adding the file to the repo. Feel free to add it to the web site (docs folder) or the Readme as well.

To install it, simply add the following line to your Podfile:

pod 'GitYourFeedback', :git => 'https://github.com/gabek/GitYourFeedback'

Or, if you’re using Carthage, add GitYourFeedback to your Cartfile:

github "gabek/GitYourFeedback"

  1. Generate a Personal Access Token for the GitHub user who will be saving the issues in your repo.
  2. In your project's Info.plist add a key of NSPhotoLibraryUsageDescription with a string explaining that your use of the photo library is for submitting screenshots. This is user-facing so use your own judgement.
  3. In your AppDelegate, or some other long-lived controller:

Create a struct that adheres to the FeedbackOptions protocol. You can put whatever you want in here, but really it should be as simple as:

struct MyFeedbackReportingOptions: FeedbackOptions {
    // The GitHub personal access token for the below user 
    var token: String = "abc123"
    /// The user that generated the above Personal Access Token and has access to the repository.
    var user: String = "repoMan"
    /// The Github repository in username/repo format where the issue will be saved.
    var repo: String = "repoman/myRepository"
}

And then you can use it in the FeedbackReporter

let feedbackReporter = FeedbackReporter(options: MyFeedbackReportingOptions())

You also need to implement FeedbackManagerDatasource in order to tell the FeedbackManager where to upload screenshots. The simplest implementation would be something like:

func uploadUrl(_ completionHandler: (String) -> Void) {
    let filename = String(Date().timeIntervalSince1970) + ".jpg"
    let url = "https://www.googleapis.com/upload/storage/v1/b/mybucketname.appspot.com/o?name=\(filename)"
    completionHandler(url)
}

Opinions on the API naming/structure

Anybody have any API suggestions before it gets locked in? Currently there's a FeedbackManagerDatasource protocol that has

func uploadUrl(_ completionHandler: (String) -> Void)
func additionalData() -> String?

The init for FeedbackManager is
init(githubApiToken: String, githubUser: String, repo: String, feedbackRemoteStorageDelegate: FeedbackManagerDatasource, issueLabels: [String]?)

And to manually display the feedback interface it's
feedbackManager.display() with an optional view controller to display it from.

Is this clear and optimal?

Easy!: Create animated GIF of the project in use

  • Add this to a project of yours, or if you have nothing to add it to, use the example project.
  • Use something like Licecap to create an animated GIF of you using it.
  • Create a PR adding the file to the repo. Feel free to add it to the web site (docs folder) or the Readme as well.

Presenting the Feedback UI from any UIAlertController repositions the alert

This seems to be an iOS bug. If you present a VC from a UIAlertController it actually repositions the alert controller, breaking it. When you leave the feedback UI you find the last screen you were on in a broken state.

Why are we presenting from a UIAlertController at all, you ask? We present from whatever the topmost view controller is, in order for the Feedback UI to get displayed. It doesn't know, nor care, that it's an alert controller specifically.

I wonder if there's a presentation context tweak that can be done to fix this, or something?

image

iOS 11: Investigate the new screenshot functionality

With iOS 11 when you take a screenshot, a thumbnail of the image pops up in the lower left corner. Tap it to open the editor. (You can also swipe it away to save the image directly to your camera roll.)

Can the built in editor replace our bundled instance of CLImageEditor? What about < iOS 11? Just not support editing?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.