Skip to content

Instantly share code, notes, and snippets.

@kgleong
kgleong / GoogleSignInAppDelegate.swift
Last active December 31, 2018 04:22
Google Sign In App Delegate - Client ID
import GoogleSignIn
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
GIDSignIn.sharedInstance()?.clientID = "769307225775-llbr5f6avrd35u7rpto9p700p2g900qr.apps.googleusercontent.com"
return true
}
}
@kgleong
kgleong / UIViewControllerAnimatedTransitioning.swift
Last active December 29, 2018 05:16
UIViewControllerAnimatedTransitioning
extension MyViewController: UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 2.0
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
// Retrieve the view controllers participating in the current transition from the context.
let fromView = transitionContext.viewController(forKey: .from)!.view!
let toView = transitionContext.viewController(forKey: .to)!.view!
@kgleong
kgleong / UIViewControllerTransitioningDelegate.swift
Last active December 29, 2018 03:22
UIViewControllerTransitioningDelegate
extension MyViewController: UIViewControllerTransitioningDelegate {
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return self
}
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return self
}
}
@kgleong
kgleong / ViewController.swift
Last active December 29, 2018 05:31
ViewController
class MyViewController: UIViewController {
let button = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
button.addTarget(self, action: #selector(onButtonTap), for: .touchUpInside)
// ...
}
@objc private func onButtonTap() {
@kgleong
kgleong / DrawerViewController.swift
Last active December 29, 2018 05:32
DrawerViewController
class DrawerViewController: UIViewController {
var button = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
button.addTarget(self, action: #selector(onButtonTap), for: .touchUpInside)
// ...
}
@objc private func onButtonTap() {
@kgleong
kgleong / test.md
Last active August 20, 2018 02:44
Test Markdown file

Foo Title

Foo Title 4

Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?

Foo Title 2

Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, to

@kgleong
kgleong / sec_item_cpp_snippet.md
Created February 9, 2018 22:45
SecItemUpdate
OSStatus
SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate)
{
    ...
	OSStatus status_osx = errSecItemNotFound, status_ios = errSecItemNotFound;
	bool can_target_ios, can_target_osx;
	OSStatus status = SecItemCategorizeQuery(query, can_target_ios, can_target_osx);
    ...
@kgleong
kgleong / valet_migrate_objects_test.md
Last active February 9, 2018 22:09
Valet Test for migrateObjectsMatchingQuery:removeOnCompletion:
- (void)test_migrateObjectsMatchingQueryRemoveOnCompletion_withNSDataAsAccount_doesNotRaiseException;
{
    NSString *identifier = @"my_identifier";
    NSData *dataBlob = [@"foo" dataUsingEncoding:NSUTF8StringEncoding];

    // kSecAttrAccount entry is expected to be a CFString, but a CFDataRef can also be stored as a value.
    NSDictionary *keychainData = @{ 
        (__bridge id)kSecAttrService : identifier, 
        (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword, 
@kgleong
kgleong / valet_reproduce_error.md
Created February 9, 2018 21:53
Reproducing the Error
/** Create a Data object **/
let dataBlob = "foo".data(using: .utf8)

let existingEntryData: [String: Any] = [
    kSecAttrService as String!: Bundle.main.bundleIdentifier as Any,
    // Use Data object for kSecAttrAccount, which expects a String
    kSecAttrAccount as String!: dataBlob as Any, 
    kSecClass as String!: kSecClassGenericPassword as Any,
    kSecValueData as String!: dataBlob as Any
@kgleong
kgleong / valet_migrate_objects_error_location_expanded.md
Last active February 9, 2018 20:28
Error location in [VALValet migrateObjectsMatchingQuery:removeOnCompletion:]
...
// Sanity check that we are capable of migrating the data.
NSMutableSet *const keysToMigrate = [NSMutableSet new];

for (NSDictionary *const keychainEntry in queryResultWithData) {
    NSString *const key = keychainEntry[(__bridge id)kSecAttrAccount];
    if ([key isEqualToString:VALCanAccessKeychainCanaryKey]) /** ERROR OCCURS HERE **/ {
        // We don't care about this key. Move along.
 continue;