Development

DEVELOPMENT  |  visionOS • iOS

Apple’s Vision of Our Digital Future

Bridging reality and imagination in the digital age through spatial computing and innovative software.

DEVELOPMENT  |  iOS • Insights • Debugging • Tips

Debugging in iOS: Resolving UITextView Flickering Issues

A debugging story that includes some tips and tricks

DEVELOPMENT  |  iOS • Swift • Tips

Using Asset Catalogs for Images

We discuss the various features of asset catalogs relating to images.

DEVELOPMENT  |  .NET

Extracting Key-Value Pairs Using GdPicture.NET SDK

A comprehensive introduction to extracting key-value pairs with GdPicture.NET SDK.

DEVELOPMENT  |  Kotlin • Android • Development

Kotlin Non-Nullable Pitfall

Under what circumstances a non-nullable value might be null.

DEVELOPMENT  |  iOS • Swift • Insights

Adopting UITextInteraction

Learn how to add UITextInteraction to a custom text input element on iOS, iPadOS, and macOS.

DEVELOPMENT  |  WinUI 3 • Windows Application SDK • WebView2 • Interop • How To

How to Access Native Code from WebView2 with WinAppSDK/WinUI 3

A step-by-step guide on how to access native code in JavaScript within a WinUI 3 application.

DEVELOPMENT  |  SwiftUI • iOS • Swift • Development • Debugging

A Tryst with SwiftUI, Or: How I Learned to Stop Worrying and Enjoy Building UIs

A blog post about one of our engineers and his experience using SwiftUI.

DEVELOPMENT  |  iOS • Insights

Vision Is an Exciting Addition to Apple’s Lineup

Considering how Apple’s newly announced Vision platform could fit in with its existing platforms.

DEVELOPMENT  |  .NET • MAUI

Choosing Your .NET MAUI Document Strategy

Exploring options for leveraging PSPDFKit in your .NET MAUI applications.

DEVELOPMENT  |  iOS

Customizable UI Components on iOS Using UIKit

Providing UI components in UIKit that allow user customization while also providing a default style that works in most cases.

DEVELOPMENT  |  iOS • Insights • Xcode

Conditional Compilation for Apple’s Yearly Updates

How to smoothly transition an iOS and Mac Catalyst app for Apple’s yearly updates between June and October.

DEVELOPMENT  |  iOS • Swift • Objective-C • Tips

Developing Mixed-Source Swift Packages

Tips for publishing Swift packages that include both Swift and Objective-C source files.

DEVELOPMENT  |  Web • TypeScript

Understanding Generics in TypeScript: Part 1

Learn the basics of generics in TypeScript.

DEVELOPMENT  |  JavaScript • Elixir

Elixir Idioms for JavaScript Developers

A comparison of the features of JavaScript and Elixir.

DEVELOPMENT  |  PDF • Text • Internationalization • Layout

The Challenges of PDF Text Layout

The process and difficulties involved in laying out text in PDF documents.

DEVELOPMENT  |  Culture • Insights

My Engineering Transition from Mobile to Backend

A peek into the process of an engineer switching teams at PSPDFKit.

DEVELOPMENT  |  iOS • How To • PDF Viewer

Swift's Approach to SPI

A closer look at how to design a System Programming Interface (SPI) in Swift.

DEVELOPMENT  |  React Native • Expo • How To

How to Use PSPDFKit for React Native with Expo

How to use PSPDFKit for React Native with Expo.

DEVELOPMENT  |  iOS • Swift • Tips

Optimizing Annotation Drawing Performance

How we optimized ink annotations and improved performance of several SDK components.

DEVELOPMENT  |  Android • Flutter • How To

Run a Flutter App on an Emulator inside Docker

How to run a Flutter application on a dockerized Android emulator.

DEVELOPMENT  |  Web • C++

My Experience with Web Development from a Systems Programming Perspective

The personal view of web development from a person with experience in systems programming.

DEVELOPMENT  |  Web • Testing

Migrating from Puppeteer to Playwright

How we migrated from Puppeteer to Playwright in our test suite.

DEVELOPMENT  |  iOS • Swift • Objective-C • Insights

Uncovering SourceKit Limitations While Updating Our API Documentation

A post that goes into detail on how moving to Swift-first API documentation uncovered issues in SourceKit.

DEVELOPMENT  |  Android • Kotlin

Pairs and Triples in Kotlin (And Why You Shouldn't Use Them)

An under the hood overview of pairs and triples in Kotlin.

DEVELOPMENT  |  Flutter • How To

Setting Up Your Flutter Environment, the Right Way — Part 1

A simpler, more convenient way to set up your development environment with support for multiple versions of Flutter.

DEVELOPMENT  |  Java • Kotlin • PDF • How To

Java PDF Editor: How to Programmatically Edit PDFs Using Java

Learn how to edit PDFs with PSPDFKit's Java PDF editor library.

DEVELOPMENT  |  Android • Web • Development • Culture

Road to Polyglot Development

A blog post outlining my transition to polyglot development for the web.

DEVELOPMENT  |  Android • Support • NDK

How to Handle NDK Crashes

Handling NDK crashes when using PSPDFKit for Android.

DEVELOPMENT  |  Web • .NET • JavaScript

Calling .NET Code from Your JavaScript Project

Ever wanted to run .NET code on the web without running a backend? Now it's possible!

DEVELOPMENT  |  Kotlin • Android • How To

Kotlin Context Receivers — A Preview

A short summary about the upcoming Kotlin feature, context receivers.

DEVELOPMENT  |  Elixir • Deployment

Using the JSON Configuration Format with a Schema Definition in an Elixir Release

This blog explains an alternative approach for providing a configuration in JSON for Elixir releases.

DEVELOPMENT  |  Android • Server • How To

How to Convert a Word Document to PDF on Android

How to convert a Word document to PDF on Android.

DEVELOPMENT  |  Machine Learning

Edit Documents in Plain English Using PSPDFKit API and Machine Learning Language Models

How to use machine learning language models like GPT-3 or Jurassic-1 and natural language to use PSPDFKit API.

DEVELOPMENT  |  iOS • Swift • Tips

Adding a Document Viewer to a Mac Catalyst App

We discuss how a PDF document viewer can be added to a Mac Catalyst app using the PSPDFKit SDK.

DEVELOPMENT  |  Testing • Productivity • Insights

How We Make Our CI Fast

Principles we apply to improve our CI efficiency.

DEVELOPMENT  |  iOS • Insights • Xcode

Download Failures with Swift Package Manager Binary Targets

A tale of how reading an error message more carefully allowed us to work around an issue with our tooling.

DEVELOPMENT  |  CSS • Insights

Margin Collapsing in CSS

An overview of a particular margin collapsing scenario I discovered while working on headers and footers support for PDF Generation.

DEVELOPMENT  |  iOS • Swift • UI/UX • Insights

Replicating the iOS Text Magnifying Glass

A dive into details of how we replicated the system magnifying glass on iOS.

DEVELOPMENT  |  C++ • Office • Tips

Testing Subjective Office Conversion Results

How to test an Office to PDF conversion result that one would deem great and others would deem poor.

DEVELOPMENT  |  API • Elixir • Insights

Rate Limiting Server Requests in Elixir

A blog post explaining how we built rate limiting for test requests in PSPDFKit API.

DEVELOPMENT  |  iOS • Swift • SwiftUI • Insights

Our Attempt at Rewriting PSPDFKit Catalog in SwiftUI

We tried rewriting a part of our PSPDFKit Catalog example project in SwiftUI. Here's what we learned.

DEVELOPMENT  |  Machine Learning • NLP • PDF • Tips

Summarize a PDF Document Using Machine Learning and Natural Language Processing

In this blog post, I'll show the quickest possible way to summarize a PDF document using machine learning and a natural language processing model called BART.

DEVELOPMENT  |  Web • Elixir • Testing • Insights

How We Use Property Testing

Some real-life examples of how we use property testing in PSPDFKit Server testing.

DEVELOPMENT  |  Android • iOS • Cordova • Flutter • Ionic • React Native • Xamarin

Cross-Platform Mobile Frameworks — An iOS Engineer's Perspective

What I learned while working on cross-platform mobile frameworks.

DEVELOPMENT  |  Insights

Best Practices When Doing Code Reviews — Part 2

The second part of a series of posts about doing good code reviews, with tips from the code writer's side.

DEVELOPMENT  |  Android • Tips

How to Load OBJ Files with MTL in Android

Loading .obj files with .mtl using Three.js in Android.

DEVELOPMENT  |  Web • Products • Support

Scaling Sync Performance: A Customer Story

A short story about scaling performance based on a support ticket.

DEVELOPMENT  |  API • PDF Generation • Tips

The Six Best PDF Generator APIs

Learn how to evaluate and select the best PDF generator API for your use case.

DEVELOPMENT  |  API • Insights

A Peek at Our CD Pipeline

A short peek at the CD pipeline powering our PSPDFKit API product.

DEVELOPMENT  |  C++ • PDF

PDF vs. DOCX: How Textual Contents Can Be So Different

A dive into the PDF and DOCX formats to understand the advantages of each.

DEVELOPMENT  |  iOS • SwiftUI • Tips

Presenting Popovers on iPhone with SwiftUI

How to present the UI as popovers on iPhone when using SwiftUI.

DEVELOPMENT  |  Insights

Best Practices When Doing Code Reviews — Part 1

An article with tips about how to do effective code reviews that have an impact on the quality of a codebase.

DEVELOPMENT  |  Android • Kotlin • Jetpack Compose • Insights

How We Expose Jetpack Compose APIs

A few lessons we learned about API design for modern Android.

DEVELOPMENT  |  Web • JavaScript • Tips

How to Download Multiple Files with JavaScript

A step-by-step tutorial explaining how to download multiple files from a server with a single request.

DEVELOPMENT  |  Web • Server • Elixir • Tips

Using SSL for PostgreSQL Connections on Elixir

How to successfully establish and verify SSL connections against a PostgreSQL server from an Elixir application.

DEVELOPMENT  |  Android • Kotlin • Tips

Autosizing Fonts for Android EditTexts

Transfer Android's TextView autosizing capability to EditTexts

DEVELOPMENT  |  iOS • Insights

Understanding Fast-Math

What does the -ffast-math optimization really do, and when is it safe to use it?

DEVELOPMENT  |  Testing • Productivity • Insights

A Case for Fast CI

How slow build times lower your team’s productivity, and how to change this.

DEVELOPMENT  |  Web • TypeScript • Insights

Migrating Our Web Codebase from Flow to TypeScript

How we migrated our web codebase from Flow to TypeScript.

DEVELOPMENT  |  iOS • Swift • Tips

Fitting Text into a Bounding Frame on iOS

How to use a binary search algorithm to precisely fit multiline text into a bounding frame on iOS.

DEVELOPMENT  |  Productivity • Tips • git

How to Handle Stacked Pull Requests on GitHub

This blog post describes how to deal with dependent pull requests on GitHub, as well as the git concepts you need to master to understand them.

DEVELOPMENT  |  iOS • Insights • Xcode

What Is a Deprecated API on iOS?

A look at Apple's API evolution strategy and the effect of the deployment target and base SDK Xcode project settings.

DEVELOPMENT  |  Android • Kotlin • Jetpack Compose • UI/UX

Introducing Jetpack Compose Support

The Android PDF SDK you know and love now supports Jetpack Compose!

DEVELOPMENT  |  Web • JavaScript • Tips

Practical Uses of Object URLs

Showcasing different applications of JavaScript object URLs in the browser.

DEVELOPMENT  |  Web • JavaScript • Insights

HTTP Caching 101

...Or, how the cache works on your browser.

DEVELOPMENT  |  Android • Productivity • git

Refactoring Git Branches with Interactive Rebase and Autosquash in Android Studio

A primer on using Git's interactive rebase feature, and how to use it within Android Studio to housekeep commits.

DEVELOPMENT  |  PDF • C++

How to Save Custom Data in Image Files

Image files hold more than just images, and in this post, you'll learn how to save custom data in them.

DEVELOPMENT  |  PDF • UI/UX • Insights

What Is Text Shaping and Why Do We Do It?

Some text in some languages requires text shaping to render correctly. This will explain a little about what exactly that is.

DEVELOPMENT  |  Productivity • Testing • Insights

Managing CI Pipelines with Terraform

Learn about Terraform and how we use it to manage our Buildkite pipelines.

DEVELOPMENT  |  iOS • Swift • Testing • Tips

Swift Render Tests in Practice — Part III

How to automate regenerating and updating reference images for render tests.

DEVELOPMENT  |  iOS • Swift • Testing • Tips

Swift Render Tests in Practice - Part II

How to improve test failures with attachments and grouping related test output.

DEVELOPMENT  |  iOS • Swift • Testing • Tips

Swift Render Tests in Practice - Part I

How to pragmatically approach render testing for custom drawing code.

DEVELOPMENT  |  iOS • Objective-C • Debugging • Insights

Reverse Engineering UIKit to Fix Our Top Crash

This blog post describes the process of reverse engineering UIKit to identify and fix our top crash in PSPDFKit for iOS.

DEVELOPMENT  |  iOS • Testing • Xcode

Automating Test Retries

We walk through our experience of dealing with flaky tests by automatically retrying them.

DEVELOPMENT  |  iOS • Swift • Tips • Debugging

Debugging Image Loading and Cropping Performance on iOS

We talk about using the Image I/O and Core Graphics APIs to improve the image loading and cropping performance in the PSPDFKit iOS SDK.

DEVELOPMENT  |  Signing • PDF • Debugging • Support

How We Debugged a Customer Problem with a Signed PDF

This blog post details how the PDF expertise of the PSPDFKit team helped unblock a customer with a tricky PDF problem.

DEVELOPMENT  |  Server • JavaScript • Testing

Load Testing PSPDFKit Server

How we figured out what it takes to run PSPDFKit Server.

DEVELOPMENT  |  Flutter • Productivity • git • Insights

How We Maintain Our Public Flutter Project Using a Private Monorepo

We describe the process taken to speed up the maintenance, development, and release cycle of our public Flutter project.

DEVELOPMENT  |  Android • Kotlin

Avoiding Primitive Type Saturation in Kotlin

Enough of fun getString(string: String): String – let's make greater use of Kotlin's powerful type system.

DEVELOPMENT  |  C++ • Insights

CMake Presets in Practice

What CMake presets are and why PSPDFKit hopes to use them more.

DEVELOPMENT  |  iOS • Productivity • How To

Automating Mac Catalyst Distribution with fastlane

We recently automated PDF Viewer for Mac distribution via fastlane. Here’s how you can do the same for your Mac Catalyst app.

DEVELOPMENT  |  PDF • Insights

Optimizing PDFs for Printers

How to make sure your users get a good experience when your PDF is printed.

DEVELOPMENT  |  Android • Web • Testing • UI/UX • Insights

Why Should You Care about Manual Testing?

How to approach manual testing pragmatically for quality products you can be proud of.

DEVELOPMENT  |  PDF • Tips • Performance • Insights

How a B-Tree Helped Reduce Memory Usage in Our Framework

This blog post describes the approach we took to save around 15 percent of memory in our framework by first identifying bottlenecks, and then changing one of our dictionary implementations to use a specialized data structure known as a B-tree.

DEVELOPMENT  |  Web • Processor • Insights

A Brief Tour of Multipart Requests

...Or, how your files travel over the internet.

DEVELOPMENT  |  PDF • Components • Insights

Why PDF Uses Floats and Word Uses EMUs

This post explores and gives examples of the units of length in Word documents.

DEVELOPMENT  |  PDF

What Contributes to Slow PDF Rendering?

We briefly cover how PDF rendering works and some reasons why rendering a PDF can be slow.

DEVELOPMENT  |  SwiftUI • iOS

SwiftUI In Production

We recently shipped a major new feature in SwiftUI while still supporting iOS 12 in our SDK. Here's what we learned.

DEVELOPMENT  |  Web • Docker • Insights

Server Development on Apple Silicon

A short post about the experience of using an M1 MacBook for working on our Server product.

DEVELOPMENT  |  Web • Docker • Server • Insights

Our Journey to ARM

A recollection of the events that led to PSPDFKit supporting ARM for our server-based products.

DEVELOPMENT  |  Web • Tips • Debugging • Insights

How to Identify Browser Bugs

Strategies to adopt for identifying browser bugs, and what to do after spotting one.

DEVELOPMENT  |  PDF • C++ • PDFium

Tackling PDF Performance Issues

Digging into the internals of PSPDFKit to improve PDF performance.

DEVELOPMENT  |  Web • Server • Elixir • Tips

The Perils of Large Files in Elixir

A post about dealing with large files in Elixir applications.

DEVELOPMENT  |  iOS • Swift • Tips

Streams of Cocoa: Why It's Still Worth Knowing NSStream

In this post, we'll look at a piece of API that many people rarely touch, if ever: Stream. It’s neither new nor shiny, but it's a powerful tool when you know how to use it.

DEVELOPMENT  |  C++ • Tips • Insights

String Literals, Character Encodings, and Multiplatform C++

How string literals are encoded by Clang and MSVC.

DEVELOPMENT  |  Web • JavaScript • Performance

Frontend Performance Enhancements at PSPDFKit

A short article about the principles of performance improvements at PSPDFKit.

DEVELOPMENT  |  iOS • macOS • Insights

Advances in XCFrameworks

With Xcode 12, Apple improved the XCFramework format, which unlocks great new capabilities.

DEVELOPMENT  |  iOS • Swift • Objective-C • Xcode • Testing

Deflaking CI Tests with xcresults

We’re sharing some techniques for tracking down and fixing flaky Xcode tests on CI.

DEVELOPMENT  |  iOS • Swift • Tips • SwiftUI • UI/UX • Accessibility

Keyboard Navigation in SwiftUI

SwiftUI wasn’t built with keyboard support in mind, and it shows. Learn how you can rewrite keyboardShortcut to work with iOS 13 and access the underlying navigation controller to pop views on ⌘-Left Arrow.

DEVELOPMENT  |  iOS • Swift • SwiftUI • Tips

Using the SwiftUI ColorPicker on iOS and macOS

While macOS has offered a system-provided color picker since OS X 10.0 Cheetah, iOS developers had to wait a bit longer. Let's take a closer look at the new ColorPicker (SwiftUI) and UIColorPickerViewController (UIKit) controls.

DEVELOPMENT  |  iOS • Testing

Continuous Integration: From Jenkins to Buildkite

Learn why we moved from Jenkins to Buildkite, what the current most promising services are, and how we evaluated them.

DEVELOPMENT  |  iOS • Testing

Automating macOS Provisioning with Chef

Learn how to use Chef to automatically provision macOS machines for CI: infrastructure as code

DEVELOPMENT  |  Processor • Web • Server

A Primer on JSON Web Tokens

What JWTs are, how they work, and how we use them at PSPDFKit.

DEVELOPMENT  |  C++ • Tips • Debugging

Time Travel Debugging for C/C++

A quick look at reverse debugging/time travel debugging for C/C++.

DEVELOPMENT  |  Web • JavaScript • Insights

Keeping Up with JavaScript Pointer Events

Events on the web have changed a great deal since the days of the cursor and the mouse. We examine some differences that you should be aware of.

DEVELOPMENT  |  Android • Kotlin • Insights

How Updating to Kotlin 1.4 Broke Our Linter Rules

How the update to Android Gradle plugin 4.1 and Kotlin 1.4 can break custom linter rules, and how to fix it.

DEVELOPMENT  |  iOS • Testing

Managing macOS Hardware: Virtualization or Bare Metal?

We explore the different ways to run macOS in the cloud, comparing virtualization via VMware, Anka, and Orka with running a fleet of bare metal machines on Amazon or MacStadium.

DEVELOPMENT  |  iOS • Testing

Continuous Integration for Small iOS/macOS Teams

In this new series, we're sharing our approach to macOS continuous integration for smaller teams that can't dedicate an entire team to CI management or aren't willing to invest five-figure sums per year for their setup.

DEVELOPMENT  |  Python • Testing

Executable API Documentation with the LLVM Integration Tester and FileCheck

This post covers what executable documentation is and how you can use the LLVM Integration Tester to create it.

DEVELOPMENT  |  git • PDFium • Insights • Open Source

Updating Complex Forked Projects

This blog post explains all the steps we take to stay up to date with PDFium at all times.

DEVELOPMENT  |  iOS • Swift • Tips

Caching File Downloads with URLCache in Swift

Apple has a sophisticated caching system in iOS, which is enabled by default. However, documentation around URLCache is quite sparse. Today, we'll look at the behavior of caching when dealing with large files.

DEVELOPMENT  |  Tips • Productivity

Faster Compilation with Ccache 4.0

Ccache is a build cache to achieve faster compilation. With the 4.0 release, it now supports Modules, which makes it possible to accelerate projects that mix Objective-C and Swift.

DEVELOPMENT  |  iOS • Swift • Tips • SwiftUI • UI/UX

Presenting Popovers from SwiftUI

Is there a way to present UIKit popovers from toolbar buttons managed by SwiftUI?

DEVELOPMENT  |  Web • WebAssembly • Tips • Performance

Migrating to the New Emscripten LLVM Backend

We share the experience of migrating from the old Fastcomp backend to the new LLVM backend in Emscripten.

DEVELOPMENT  |  Web • Accessibility

How We're Improving Accessibility on PSPDFKit for Web

Better keyboard navigation and assistive technology support on the latest versions of our Web SDK.

DEVELOPMENT  |  Web • JavaScript • Performance • Insights

The Generalized CRUD API of PSPDFKit for Web

An introduction to why and how we designed the brand-new unified CRUD API in PSPDFKit for Web.

DEVELOPMENT  |  Swift • Tips • Debugging

An Introduction to LLDB Reproducers

An introduction to an experimental feature in LLDB, Reproducers, that helps reproduce bugs in the debugger itself.

DEVELOPMENT  |  Web • JavaScript • WebAssembly • Debugging • Insights

The State of Debugging in WebAssembly

We share our tips and tricks for debugging issues in WebAssembly and look to the future to see what's coming.

DEVELOPMENT  |  Server • Insights

Monitoring PSPDFKit Server with Metrics

Using data to draw insightful conclusions.

DEVELOPMENT  |  iOS • Swift • Insights

Binary Frameworks as Swift Packages

What we learned from experimenting with binary frameworks as Swift packages in Xcode 12.

DEVELOPMENT  |  PDF.js • PDF • Insights

Evaluating the Render Fidelity of PDF.js

We explore various issues with the render fidelity of PDF.js.

DEVELOPMENT  |  Docker • C++

Visual Studio Code, C++, and a Docker Container

Our journey of using Visual Studio Code to develop C++ in a remote container.

DEVELOPMENT  |  iOS • Swift • Performance

Using Metal to Apply Image Filters

An overview of how to use Metal to apply filters to images to perform a simple color inversion on the input image.

DEVELOPMENT  |  C++ • Insights

C++20 in 2020: Modules

An introduction to the C++20 modules feature: what they are, their potential advantages and disadvantages, and how they are used.

DEVELOPMENT  |  iOS • macOS • PDF • Insights

Why Is the PDF Format So Well Supported on Apple Platforms?

Apple has a rich history of supporting the PDF file format, but when and how did its relationship with the PDF format begin?

DEVELOPMENT  |  Tips • Productivity • git

A Better Way to Git Log to Understand Changes in a Big Codebase

How git log information may not be enough when developers need to understand changes in a codebase that has evolved over several years.

DEVELOPMENT  |  iOS • Swift • UI/UX • Insights

The Case for Lists in UICollectionView

Exploring the power and flexibility offered by creating lists using UICollectionView.

DEVELOPMENT  |  iOS • Swift • Debugging • Insights

The Hidden Trap in Selective Table View and Collection View Reloads

Learn how to properly update cells in a table view or collection view without crashing.

DEVELOPMENT  |  Web • PDF

How We Created a Real-Time Collaboration Tool Inside a PDF

This blog post takes a peek under the proverbial PDF hood to find out how we developed Instant Comments.

DEVELOPMENT  |  iOS • macOS • Objective-C • Performance • Insights

Direct Calls with Objective-C

Apple introduced the objc_direct attribute in Xcode 12. Learn what it does and how you can use it to your advantage.

DEVELOPMENT  |  Web • JavaScript • C++ • WebAssembly • How To • Performance

How to Use WebAssembly Modules in a Web Worker

A short tutorial showing the use of WebAssembly in a web worker.

DEVELOPMENT  |  iOS • macOS • Insights • Xcode

Supporting XCFrameworks

What we learned about XCFrameworks while migrating PSPDFKit to this new format.

DEVELOPMENT  |  iOS • Swift • Objective-C • Insights

NULL-Characters in Strings and Tales of Apple Radar

In iOS 11, Smart Punctuation caused data loss. Learn how we fixed the issue and how we are now cleaning up the OS-level workaround.

DEVELOPMENT  |  Web • JavaScript • TypeScript • Tips

Generate TypeScript Declarations from a Flow Codebase

A short guide on how to generate TypeScript declarations from a Flow codebase.

DEVELOPMENT  |  iOS • Swift • Tips • UI/UX

Level Up Your Trackpad Support Using UIInteraction

How to make your iOS app work well with scrolling, secondary clicking and dragging on a trackpad or mouse.

DEVELOPMENT  |  Web • Debugging • Insights

Text Selection Regression in Chrome 83

How we noticed a Chrome regression and shipped a workaround in a timely fashion.

DEVELOPMENT  |  Android • Kotlin • Tips • Productivity

Think First, Code Later

A case study on how we design features and APIs for PSPDFKit for Android.

DEVELOPMENT  |  C++ • Tips • Productivity

IDEs and Text Editors for Writing C++ Code on a Large Scale

This blog post compares different IDEs and text editors that can be used to write C++ in a big codebase.

DEVELOPMENT  |  iOS • macOS • Tips • Performance • Xcode

Automated Profiling Runs in Instruments

Learn how to automate measurement runs with Instruments.

DEVELOPMENT  |  C++ • Tips • Performance

How to Effectively Measure the Performance of Your Code

This blog post explains why software that performs well is important and how we measure code performance at PSPDFKit.

DEVELOPMENT  |  Android • Kotlin • Tips • Productivity • Testing

How to Reduce Flakiness in Automated UI Testing on Android

This blog post discusses tips and best practices on how to reduce flakiness in automated UI testing on Android.

DEVELOPMENT  |  iOS • Objective-C • Tips

Preventing Surprisingly Large Objective-C Type Encodings

Objective-C stores type encoding in the binary. These encodings can become surprisingly large.

DEVELOPMENT  |  iOS • Swift • Tips • UI/UX • Insights

Supporting Pointer Interactions

Apple introduced new pointer events in iOS 13.4 to better support trackpad and mouse devices.

DEVELOPMENT  |  C++ • Tips • Productivity

Effective Header Management in C++

How we can reduce build times and clean up our header dependencies with effective header management.

DEVELOPMENT  |  Android • Kotlin • Tips • UI/UX

Change Android Themes Instantly Using the Circular Reveal Animation

This blog post investigates how to achieve nice animations when changing themes.

DEVELOPMENT  |  PDF • Tips • Insights

Optimizing PDF File Size

When editing PDFs, they often grow in size, but that doesn't have to be the case. Here's how we optionally optimize for size.

DEVELOPMENT  |  C++ • Tips • Testing

Our Approach to Testing a Large-Scale C++ Codebase

This blog post outlines the frameworks and techniques PSPDFKit uses to test its large-scale C++ codebase.

DEVELOPMENT  |  C++ • Tips • Performance

Investigating the Performance Overhead of C++ Exceptions

C++ exceptions have their place, but using an alternative is recommended for general program flow control.

DEVELOPMENT  |  C++ • Tips • Performance

Compiler-Based Lock Checking in C++

A short introduction to compiler-based lock checking in C++ with Clang using Thread Safety Analysis

DEVELOPMENT  |  Web • PWA • Insights

The State of Progressive Web Apps in 2020

Examining new developments in the PWA landscape that affect mobile and desktop browsers.

DEVELOPMENT  |  C++ • Security • Insights

The C++ Lifetime Profile: How It Plans to Make C++ Code Safer

This blog post explains what the C++ Lifetime Profile is and how it intends to make the language safer and help avoid memory management problems.

DEVELOPMENT  |  Tips • Productivity • git

Moving a Git Repository into Its Submodule

How we improved our Git repository setup by moving our PDF Viewer for iOS repository into our PSPDFKit repository.

DEVELOPMENT  |  iOS • Swift • Objective-C • Tips • UI/UX

Adopting UIAppearance in Custom Views

Learn how to support styling your own custom views using UIAppearance.

DEVELOPMENT  |  Android • Java • Testing • Gradle

Filtering Tests in Android

A look at the android.support.test.filters library and what it provides you with.

DEVELOPMENT  |  C++ • Insights

The Functional Side of std::optional with C++20

std::optional is already really useful, and it's about to get better with C++20.

DEVELOPMENT  |  iOS • Tips • UI/UX

Open Links in Safari, Not Safari View Controller

Why we changed our default for opening web links from SFSafariViewController to the Safari app.

DEVELOPMENT  |  Android • Insights

Our Journey from Genymotion to the Android Emulator

How we migrated our Genymotion-based CI to an AVD.

DEVELOPMENT  |  Web • WebAssembly

WebAssembly and Emscripten Chat with Alon Zakai

A chat with Alon Zakai, co-creator of WebAssembly and creator of Emscripten.

DEVELOPMENT  |  Swift • C++ • Insights

Introduction to C++ for Swift Developers

An introduction to the C++ language for Swift developers, with an overview of reasons to use C++ and a look at differences and similarities between the languages.

DEVELOPMENT  |  iOS • Swift • Objective-C • UI/UX

Adopting Dark Mode on iOS and Ensuring Backward Compatibility

A comprehensive overview of adopting Dark Mode in an iOS app, along with a few tips to make the process of development easier.

DEVELOPMENT  |  Android • Kotlin • Tips • Accessibility • Insights

How We Improved Keyboard Navigation Accessibility in Our Android SDK

A look at the steps we took to start improving the accessibility of our Android SDK.

DEVELOPMENT  |  C++ • Python • Tips

Making C++ Talk to Other Languages with SWIG

Using SWIG to generate interfaces to talk to a C++ backend.

DEVELOPMENT  |  Web • Docker • Tips

Docker import/export vs. load/save

A blog post that explains the difference between the Docker import/export and load/save commands.

DEVELOPMENT  |  Android • Tips

The Android Drag-and-Drop Framework in Practice

Using the Android drag-and-drop framework — from theory to implementation.

DEVELOPMENT  |  Android • Java • Gradle • Insights

Understanding the Gradle Build System

In this article, we'll explore the Gradle build system, how it works, and why it is the new standard for building Android projects.

DEVELOPMENT  |  Android • iOS • macOS • Windows • C++ • Insights

Challenges of Using Emojis with C++

In this article, we discuss the challenges of implementing your own custom emoji support in a cross-platform way.

DEVELOPMENT  |  Android • Kotlin • Java • Insights

What Is an Intent?

An overview of intents, their uses, and pitfalls to consider.

DEVELOPMENT  |  Android • Tips

Dealing with Large Memory Requirements on Android

This article provides tips for optimizing memory usage of your apps.

DEVELOPMENT  |  Android • Debugging

NDK Debugging

A set of tips for debugging native NDK code in Android apps.

DEVELOPMENT  |  Android • Kotlin • Tips

How Do I Fix NetworkOnMainThreadException?

A post detailing what NetworkOnMainThreadException is and how to prevent it.

DEVELOPMENT  |  Android • iOS • Web • PDF

The Role of PSPDFKit as a PDF Processor

How we fit into the PDF landscape.

DEVELOPMENT  |  Android • Java • Tips

Performance Evaluation of Linked Lists

Today we'll delve into the performance evaluation of linked lists, a controversial topic among many experienced developers, and try to understand why they trigger a warning in the Error Prone report.

DEVELOPMENT  |  Web • React • JavaScript • Insights

React Redux's New Features

An overview of React Redux's seven new features in action.

DEVELOPMENT  |  Windows • Tips

How to Await an Async Event Handler Delegate in UWP

Asynchronous programming is hard, and the WinRT interface poses further issues. Learn how to implement a deferral to wait on a user action before completing additional work.

DEVELOPMENT  |  Web • JavaScript • Tips

Smoother Interactions on the Web: getCoalescedEvents()

How to use the getCoalescedEvents() method of the PointerEvent API to improve the precision of drawing apps or of any web application.

DEVELOPMENT  |  iOS • Swift • Tips

Making a Resource Thread-Safe with Locks

We discuss how to ensure thread safety and synchronization via locking.

DEVELOPMENT  |  C++ • Tips • Debugging

When C++ Doesn't Move

Move semantics in C++ make your code more efficient, but sometimes a move is not performed. In this blog post, we explore why.

DEVELOPMENT  |  Android • Tips

The Soft Keyboard on Android

Tips for working with the soft keyboard on Android.

DEVELOPMENT  |  iOS • Swift • Tips

Swizzling in Swift

A quick crash course on how to swizzle correctly, and how to do it in Swift 5.1

DEVELOPMENT  |  iOS • Swift • PDF • Tips

Working with PDF Metadata in Swift

How and what metadata can be stored in a PDF, and how to programmatically work with this information.

DEVELOPMENT  |  Android • Kotlin • Tips

Retaining Objects Using a Fragment

An overview of how to use a fragment to retain objects during a configuration change.

DEVELOPMENT  |  Android • Java • Tips • Insights

Problems with Nullability Annotations

A look at some issues with Android's nullability annotations and how to fix them.

DEVELOPMENT  |  Culture • Productivity • Insights

WWDC for First-Timers, 2019 Edition

Here's how to get the most out of Apple's Worldwide Developer Conference.

DEVELOPMENT  |  macOS • Tips • Insights

How Xcode Indexing Works and How You Can Fix IDE Problems with Your Projects

This post provides an overview of how the code assistance feature in Xcode works and how you can debug code assistance problems in your projects.

DEVELOPMENT  |  Android • Tips

Understanding Android Dimensions

A post about existing Android dimensions, their purpose, and common conversion rules.

DEVELOPMENT  |  Android • Gradle

Gradle Task Configuration Avoidance in Android Builds

An overview of Gradle's task configuration avoidance APIs and how they are used by the Android build system.

DEVELOPMENT  |  Windows • UWP • C# • C++ • Tips

How to Use Native C++ in UWP

How to include native C++ in your UWP app and call into it from C#.

DEVELOPMENT  |  Android • Tips

How to Use Android App Bundles

This blog post explains what Android App Bundles are and how to upload them to Google Play.

DEVELOPMENT  |  PDF • Insights

Understanding the Difference between Bookmarks and the Outline in a PDF

Bookmarks vs. outline elements: Not everything is what it seems.

DEVELOPMENT  |  Tips

The Many Benefits of Using a Monorepo

A monorepo? Isn't that just a weird Facebook and Google thing? Why is PSPDFKit using a monorepo?

DEVELOPMENT  |  Android • Kotlin • Insights

Kotlin Coroutines

A look at Kotlin coroutines and how they compare to other solutions for concurrency.

DEVELOPMENT  |  iOS • Insights

The Bittersweet iOS Document Browser

A quick look at both the benefits and downsides of using the iOS system document browser in your applications.

DEVELOPMENT  |  Web • Debugging

Debug Emscripten with the Tracing API

How to debug memory usage in an Emscripten app.

DEVELOPMENT  |  Web • Docker • PDF

Preparing My Tax Return with Apache PDFBox, Docker, and Make

How I combined Apache PDFBox, Docker, and Make to streamline my tax return workflow.

DEVELOPMENT  |  Android • Java

Java 8 in Android Apps

This article explains how to enable Java 8 features in an Android app and gives an overview of the available Java 8 features.

DEVELOPMENT  |  Android • Java • Tips

Handling Nullability in Your Code

A brief excursion into the Java type system, nullability, and remedies for the billion-dollar mistake.

DEVELOPMENT  |  iOS • Objective-C • Insights

Embracing the Limits of UIActivityViewController

We talk about our experience in implementing the new sharing flow.

DEVELOPMENT  |  Android • Kotlin • Tips • Jetpack Compose

Using ViewModels to Retain State on Android

How to use Android's ViewModel class to retain complex objects across configuration changes.

DEVELOPMENT  |  iOS • Swift • Insights

PSPDFKit and Swift

Will PSPDFKit for iOS move to Swift? In this post, we weigh the pros and cons.

DEVELOPMENT  |  iOS • Swift • Tips • Debugging

Adding Logging to Crash Reports

Understanding crash reports is often difficult without extra context. Learn how we attach application logs to crash reports via Google's Firebase Crashlytics in the free PDF Viewer for iOS app.

DEVELOPMENT  |  Android • Tips

What Are Configuration Changes?

An overview of configuration changes on Android.

DEVELOPMENT  |  Productivity • Tips

How Spaced Repetition Helps You Learn New Things

We present spaced repetition as a learning technique that can help you be more efficient at work.

DEVELOPMENT  |  Android • iOS • Windows • PDF • Tips • Insights

Incremental and Full Save in PDFs

This article goes into what's involved when incrementally or fully saving a PDF, and why it matters.

DEVELOPMENT  |  Android • Kotlin • JavaScript • React Native

Sharing Business Logic Using React Native

Not only can React Native be used to provide the UI for your application, but it is also a convenient way to share business logic.

DEVELOPMENT  |  Android • Debugging

Android Debug Bridge Tricks and Tips

An introduction to Android Debug Bridge (adb) and an overview of some tricks.

DEVELOPMENT  |  Android • Kotlin • Tips • Instant

How to Test REST API Clients in Android Apps

This article shows how we built simple and flexible integration tests for PSPDFKit Instant that are using a custom abstraction layer on top of an OkHttp mocked web server.

DEVELOPMENT  |  Tips

What Is Ninja Refactoring, and When Should You Consider Doing It?

Tips and best practices for code refactoring.

DEVELOPMENT  |  Android • Java • Tips

Saving the Activity State

An overview of how to make sure your activity state is saved.

DEVELOPMENT  |  iOS • macOS • Swift • Objective-C • Tips

Writing and Maintaining Good Code Documentation

Tips, tricks, and techniques for documenting your code the correct way.

DEVELOPMENT  |  iOS • Windows • UWP • C# • Insights

UWP for iOS Developers

A brief introduction to Universal Windows development for iOS developers.

DEVELOPMENT  |  Android • Kotlin • Tips

Using the Bottom Navigation View in Android

An introduction to implementing bottom navigation in your app with a simple example that incorporates synced page switching as well.

DEVELOPMENT  |  C++ • Tips • Insights

Visual Studio Code for C++

How to use Visual Studio Code for C++ development.

DEVELOPMENT  |  Android • Tips • Debugging

Inspecting APK Files

This article discusses the basics of Android reverse engineering using the Apktool, smali, and Java decompilers.

DEVELOPMENT  |  iOS • Swift • Objective-C • Insights

Self-Sizing Table View Cells in Practice

A look at self-sizing table view cells for apps supporting iOS 10, 11, and 12, covering three implementation approaches and some pitfalls I encountered supporting these across our UI in PSPDFKit.

DEVELOPMENT  |  Web • Ruby • PDF

Generating PDFs with Ruby: 2018 Edition

This post surveys the Ruby landscape in 2018 to evaluate the current state-of-the-art of generating PDFs with Ruby.

DEVELOPMENT  |  Android

External Storage Permissions on Android

An exploration of how permissions work, starting from a high level and working down to the lower lever managed by FUSE, the native Android module that interacts with the file system.

DEVELOPMENT  |  Android • Tips

How to Increase the Logcat Buffer Size

Don't lose your logs. Increase your logcat buffer!

DEVELOPMENT  |  PDF

Understanding Images in PDF

We take a look at how images are stored in a PDF and discuss some important things to know about them.

DEVELOPMENT  |  Elixir • How To • PDF

How to Generate PDFs with Elixir

In this blog post, we'll look at an example of how to generate PDFs with Elixir.

DEVELOPMENT  |  iOS • Swift • C++ • Open Source • Tips

Tips and Tricks for Contributing to the Swift Language

This post describes the process for contributing code to the Swift programming language, including how to propose changes to the language, write a pull request, address feedback, and make your code part of the next version of the language.

DEVELOPMENT  |  iOS • Swift • Objective-C • Performance

Using Signposts for Performance Tuning on iOS

A look at the different ways that we measure and try to improve performance at PSPDFKit.

DEVELOPMENT  |  iOS • Tips

Creating an Efficient App Store Screenshot Workflow

A look at how we generate our screenshots for the iOS App Store.

DEVELOPMENT  |  Productivity

Time Management

A discussion of how managing time by incorporating productivity techniques, making lists, planning your days, and finding ways to utilize downtime can help with your workflow.

DEVELOPMENT  |  iOS • Insights

iOS HEIC Performance

We evaluate the encoding and decoding performance of HEIC.

DEVELOPMENT  |  Android • Testing

Rendering Tests Using Robolectric

Rendering tests using Robolectric with a custom bitmap shadow.

DEVELOPMENT  |  PDF

PDF Syntax 101

An overview of the internal structure of a PDF.

DEVELOPMENT  |  iOS • Objective-C • Insights

Challenges of Adopting Drag and Drop

A recap of how we integrated drag-and-drop support into our Document Editor in iOS.

DEVELOPMENT  |  Android • Kotlin • Insights

What Are Kotlin Contracts and How Are They Useful?

An overview of the experimental Kotlin Contracts API.

DEVELOPMENT  |  PDF • Insights

What’s Hiding in Your PDF?

PDFs hold information you may not know about. Discover different forms of metadata and where to look for them.

DEVELOPMENT  |  Android • Tips

Using Paths to Draw Shapes with Borders

How to use a flexible path API to draw complex shapes with borders.

DEVELOPMENT  |  Tips

How to Use Docker Compose to Run Multiple Instances of a Service in Development

In this blog post, we’ll look at an example of how we can run multiple instances of a service with Docker Compose.

DEVELOPMENT  |  Productivity

Using Clang-Tidy and Integrating It in Jenkins

The benefits of using clang-tidy and how to get started setting it up in Jenkins.

DEVELOPMENT  |  iOS • Tips

Refactoring Large Codebases: Tips and Tricks

If you're going to fall down a rabbit hole anyway, you might as well enjoy it!

DEVELOPMENT  |  iOS • Tips

Improving Dynamic Type Support

How to improve Dynamic Type support in your app and bring it to the next level.

DEVELOPMENT  |  Web • React • Accessibility

Building Accessible Modals with React

In this blog post, we will look at some simple solutions that we use at PSPDFKit to make our modals more inclusive and accessible.

DEVELOPMENT  |  iOS • Debugging • Tips

How to Extend LLDB to Provide a Better Debugging Experience

Explore the extensibility capabilities of LLDB, a debugger for Swift, C, C++, and Objective-C code.

DEVELOPMENT  |  Web • PWA • Performance • Open Source

PWA — Progressive Web Applications

PSPDFKit for Web and Progressive Web Applications: an open source example and guide.

DEVELOPMENT  |  iOS • macOS • Insights

Marzipan: Porting iOS Apps to the Mac

With macOS Mojave, Apple is adding support to bring apps written in UIKit to macOS without the requirement of having to rewrite the UI in AppKit. This is not yet officially supported — this post will explore what we can expect in 2019 and how you can use Marzipan today.

DEVELOPMENT  |  iOS • Insights

The Challenges of Changelogs

How we handle changelogs at PSPDFKit and the tools we built to help us with this.

DEVELOPMENT  |  Tips

Naming Is Hard — Difficulties of Naming Variables

Is naming a variable so hard? According to Martin Fowler, it is. In this blog post, I'll try to shed some light on what naming entails and why it's a challenge.

DEVELOPMENT  |  Tips

Naming Classes — Why It Matters, and How to Do It Well

Tips for choosing good class names.

DEVELOPMENT  |  Elixir • Tips

How to Parse XML Documents in Elixir

A tutorial on how to parse XML documents in Elixir.

DEVELOPMENT  |  PDF • Signing • Security

Protecting PDF Documents

Password-based security for PDF documents.

DEVELOPMENT  |  UWP • Windows • Tips

Debugging WebView in UWP Apps with Edge DevTools

We show how a developer can use Edge DevTools to debug a WebView in a UWP app.

DEVELOPMENT  |  Android • RxJava • Kotlin • Tips

RxJava for Multi-Level Data Retrieval

RxJava can be useful for many things, and in this post, we’ll have a look at how to use it to add offline support to your app.

DEVELOPMENT  |  Productivity

Switching to a Standing Desk

We discuss some of the benefits of switching to a standing desk.

DEVELOPMENT  |  Elixir • Tips

Database Transactions with Ecto

How to use database transactions and Ecto.Multi in Elixir

DEVELOPMENT  |  Web • Tips

Immutable.js and Lazy Evaluation

A short introduction to Immutable.js and how lazy operations improve performance and readability of your code.

DEVELOPMENT  |  Tips

Modern CMake Tips

There are better ways to write CMake scripts.

DEVELOPMENT  |  Ruby • Testing

Adding Spellchecking to Your Tests

How we added simple spelling and grammar checks to our website build process to catch some common mistakes.

DEVELOPMENT  |  Flutter • Android • iOS • Insights

How I Got Started with Flutter

A short review of Flutter from a mobile developer’s standpoint.

DEVELOPMENT  |  Elixir • Tips

How to Build a Back-Pressure Queuing System in Elixir with sbroker

Tutorial on how to set up a back-pressure queuing system in Elixir with sbroker.

DEVELOPMENT  |  Web • JavaScript • Tips

An Introduction to Stimulus.js

In this article, we'll look at the Stimulus JavaScript framework and how it can help bring some order to a website's frontend codebase.

DEVELOPMENT  |  Android • Kotlin • Tips

Moving Your Gradle Build Scripts to Kotlin

Another take on writing your project's Gradle build files in pure Kotlin code.

DEVELOPMENT  |  Web • WebAssembly • Performance

A Real-World WebAssembly Benchmark

A WebAssembly Benchmark for browser vendors to test a real-world production application.

DEVELOPMENT  |  iOS • Swift • Insights

Smart Grid Sizing

How PSPDFKit is smart about choosing thumbnail sizes.

DEVELOPMENT  |  Android • Tips

Tips for Designing an Android Library

We take a look at some of the things you should keep in mind when designing an Android library.

DEVELOPMENT  |  Open Source

Reviewbot

Reviewbot posts GitHub pull requests that are ready to be reviewed into Slack. How does it know when a pull request is ready? We have a special label in our repositories, named `READY TO REVIEW`.

DEVELOPMENT  |  PDF • Annotations

Line Annotations in PDF

Line annotations are one of the most frequently used annotation types, and they are ideal for things like drawing attention to important areas of your document, diagramming the process flow, and decoration.

DEVELOPMENT  |  Android • Insights

Rendering PDF Previews

An overview of how to render PDF previews.

DEVELOPMENT  |  iOS • Insights

Advances in Auto Layout

An overview of how Auto Layout has changed in recent years and how to best use it.

DEVELOPMENT  |  Android • Java • Kotlin • Tips

Async Stacktraces in Android Studio

How to create asynchronous stacktraces in Android Studio and IntelliJ.

DEVELOPMENT  |  iOS • Insights

Smart Punctuation on iOS 11

We explain iOS 11's Smart Punctuation and discuss how it affects string handling in your app.

DEVELOPMENT  |  PDF • Insights

What Are Appearance Streams?

An explanation of what appearance streams actually are, along with their gotchas.

DEVELOPMENT  |  Android • RxJava • Kotlin • Insights

RxJava Is Async yet Blocking

An explanation of why RxJava is both asynchronous and blocking.

DEVELOPMENT  |  Tips

How to Manage Multiple System Configurations Using Docker Compose

This blog post is a short introduction to Docker Compose and will explain how we use it to manage different system configurations that are built off the same base configuration.

DEVELOPMENT  |  Android • Debugging • Productivity

The Subtle Art of Real-Time Debugging With Android Studio

Debugging in real time with Android Studio.

DEVELOPMENT  |  Android • Tips

Hints for Beginners Navigating Around New Code

We share some tips on how to navigate a new codebase.

DEVELOPMENT  |  iOS • Android • C++ • Objective-C

Failable Methods with Djinni

In this article, we have look at using result types to model failable computations in the Djinni IDL.

DEVELOPMENT  |  Tips

Using webpack with Middleman

We explain how to integrate Middleman and webpack to boost your frontend productivity.

DEVELOPMENT  |  iOS • Tips

Leveraging SQLite Full-Text Search on iOS

We look at SQLite’s FTS extension and how you can use it to add high performance search to your app.

DEVELOPMENT  |  PDF • Tips • Forms

Forms in PDF

Forms provide a simple yet flexible way to gather data from users.

DEVELOPMENT  |  iOS • Insights

UICollectionView All the Things!

`UICollectionView` is now at the heart of every document. This blog post talks about why and how we rewrote our view hierarchy.

DEVELOPMENT  |  Android • Kotlin • Insights

Using Kotlin to Make the PSPDFKit API Even Better

Kotlin provides the ability to extend any class with new functionality, and we can use this to expand the PSPDFKit API.

DEVELOPMENT  |  Android • Performance • UI/UX

Rendering PDFs on Android

How to handle rendering large amounts of bitmaps and maintain a slick UX while doing it.

DEVELOPMENT  |  Web • WebAssembly

Optimizing WebAssembly Startup Time

Four simple yet effective solutions we currently employ in PSPDFKit for Web to reduce WebAssembly startup time.

DEVELOPMENT  |  Elixir • Tips

How to Run Your Phoenix Application with Docker

We’re taking a look at how to run Elixir applications within a Docker container, and how that can simplify the setup of development and deployment environments.

DEVELOPMENT  |  Android • Productivity • Tips

Android Studio Shortcuts: How to Boost Your Productivity

The best shortcuts for Android Studio. The most famous and the most underrated.

DEVELOPMENT  |  iOS • Swift • Insights

Binary Frameworks in Swift

ABI? Module stability? What does binary stability mean, and how will it affect you?

DEVELOPMENT  |  Android • Kotlin • Insights

Simple Kotlin Tips for Beginners

Useful tricks for beginners to start writing better code with Kotlin.

DEVELOPMENT  |  PDF • Insights • Annotations

What Are Annotations?

Annotations allow users to add custom content on PDF pages.

DEVELOPMENT  |  PDF

Extracting Text from a PDF

The difficulties of extracting text from a PDF and how PSPDFKit can help.

DEVELOPMENT  |  iOS • UI/UX • Insights

Adopting Drag and Drop on iOS

Utilizing the new Drag and Drop feature in iOS 11, and how we integrated it to enhance the user experience.

DEVELOPMENT  |  Android • RxJava • Open Source

Make Android Animations Reactive with VanGogh

Android view animations powered by RxJava 2.

DEVELOPMENT  |  iOS • Insights

Challenges of Supporting iPhone X

Tips and tricks for adding support for the iPhone X in PSPDFKit.

DEVELOPMENT  |  iOS • Swift • Instant • Tips

How to Use iOS Data Protection

How apps can use iOS Data Protection to secure their files.

DEVELOPMENT  |  iOS • React Native • Swift • JavaScript

Native View Controllers and React Native - It Just Works™

DEVELOPMENT  |  Web • JavaScript • WebAssembly

WebAssembly: A New Hope

What is WebAssembly, and what does it mean for the web?

DEVELOPMENT  |  Android • Kotlin • Java • Security

Secure Media Playback on Android

Picking smart defaults with security in mind when playing videos on Android.

DEVELOPMENT  |  iOS • Debugging • Xcode

User Breakpoints in Xcode

User breakpoints are a not very well known feature in Xcode but they are very powerful and can improve your debugging experience and show issues more prominent.

DEVELOPMENT  |  iOS • Swift • Objective-C

Even Swiftier Objective-C

DEVELOPMENT  |  C++ • Objective-C • Java • JavaScript • Tips

Linting and Code Formatting at PSPDFKit

How we do code formatting in C++/Objective-C/Java/JavaScript

DEVELOPMENT  |  Android • Java • UI/UX

50 Shaders of Android: Drawing on Canvas

Low-level drawing and animation on Android using Canvas and powerful Shader classes.

DEVELOPMENT  |  iOS • Android • Tips • UI/UX

Creating Better User Experiences with Animations and Lottie

Improving an app’s User Experience made easy by adding animations powered by Lottie.

DEVELOPMENT  |  Web • Elixir • Testing

How We Test and Generate Interactive CSS Documentation

Automating CSS testing and documentation with Hound and Webdriver

DEVELOPMENT  |  iOS • Objective-C • Xcode

Internationalization - Right to Left Support for Mobile Apps

What Right to Left Support Actually Means and How We Implemented It

DEVELOPMENT  |  Android • Kotlin • RxJava • Tips

Writing Concise Code with Kotlin and RxJava

Tips and tricks how to write readable, concise, and beautiful code using the Kotlin language and RxJava.

DEVELOPMENT  |  Web • React • Tips

How to Build a Freehand Drawing Using React

We implement a simple vector-based freehand drawing with React using SVG.

DEVELOPMENT  |  Culture • UI/UX

Everybody Designs: An Agile Approach to Design

How PSPDFKit uses an agile approach for design work

DEVELOPMENT  |  Android • Tips • Debugging

How to Fix a Bug, Blindfolded.

This is a story about fixing a bug, even when all the tools go kaput.

DEVELOPMENT  |  iOS • Objective-C • Tips

The Struggle with Action Extensions

Pitfalls when developing a Share or an Action Extension

DEVELOPMENT  |  iOS • Swift • Objective-C • Insights

The Case for Deprecating UITableView

DEVELOPMENT  |  iOS • Insights

Creating a Compelling Today Widget

Best Practices on Developing a Today Widget

DEVELOPMENT  |  Android • iOS • Objective-C • C++

Super Fast Builds Using distcc

How to dramatically shorten your build times with distcc.

DEVELOPMENT  |  macOS • Insights

Chef on macOS

DEVELOPMENT  |  iOS • Tips

Hiding Your Action and Share Extensions In Your Own Apps

DEVELOPMENT  |  Android • Kotlin • Java • Tips

A clean status bar with Android System UI and QuickDemo

How to enable Android's demo mode using a quick setting tile

DEVELOPMENT  |  Android • Java • Kotlin

Restoring State in Android MVP Architecture

State restoration is an important part of the Android framework, but we might encounter problems with it when implementing MVP architecture.

DEVELOPMENT  |  iOS • Android • Testing

Running Tests with Clang's AddressSanitizer

Clang has powerful sanitizers that are incredibly useful, so we collected our experiences using them between iOS, Android, and our C++ core to help you through some gotchas.

DEVELOPMENT  |  Android • Kotlin • RxJava • Tips

Android animations powered by RxJava

The purpose of this post is to show you how to combine RxJava features with animations on Android to create a great user interface without a lot of nested code.

DEVELOPMENT  |  React Native • JavaScript

PSPDFKit 💖 React Native

DEVELOPMENT  |  iOS • Debugging • Tips

Debugging a specific instance with scripted breakpoints

When debugging an issue that is somewhere deep inside your code, you easily end up debugging a class that has lots of living instances. Sometimes, you are only interested in a very particular one. This can become very tedious work.

DEVELOPMENT  |  iOS • Debugging • Tips

Writing Good Bug Reports

At PSPDFKit, we work every day to read through developers' bug reports. In fact, we forward many of them to the engineers at Apple. While this post is Apple-centric, many details can be applied to any sort of bug reporting.

DEVELOPMENT  |  Insights

Real-time collaboration, Apple, and you

Apple recognizes that real-time collaboration is necessary and so do we. Here's how PSPDFKit is upgrading your ability to work with teams.

DEVELOPMENT  |  iOS • Objective-C • Tips • UI/UX

Spicing up status messages

At PSPDFKit, we likely spend just as much time polishing the UI as we do implementing PDF features or tweaking the performance. Here's a look at how one of our developers explored improving our status messages.

DEVELOPMENT  |  PDF • Debugging • Insights

Just a simple bookmark

When books became digital, bookmarks became more complicated. Instead of stuffing a piece of paper in a book, you now had to store a digital marker, which is not always as simple as it looks.

DEVELOPMENT  |  iOS • Testing

Converting Xcode Test Runs to JUnit, the Fast Way

DEVELOPMENT  |  iOS • Tips

Preventing Popovers on Popovers

DEVELOPMENT  |  iOS • Tips

Efficient iOS Version Checking

DEVELOPMENT  |  iOS • Debugging

Investigating Thread Safety of UIImage

DEVELOPMENT  |  Instant • Testing

End–to–End Testing: What, Why, and How?

DEVELOPMENT  |  Web • Instant • Elixir • Testing

Testing HTTP APIs in Elixir

DEVELOPMENT  |  iOS • Swift • Objective-C • Insights

Swifty Objective-C

DEVELOPMENT  |  Testing • Tips

Selective Pull Request Testing

DEVELOPMENT  |  iOS • Testing

Continuous iOS Code Coverage With Jenkins and Slather

DEVELOPMENT  |  Android • Java • UI/UX • Tips

Keyboard Handling on Android

DEVELOPMENT  |  iOS • Performance • Testing • UI/UX

Running UI Tests on iOS With Ludicrous Speed

DEVELOPMENT  |  iOS • Tips

Adding live search to Jazzy docs

DEVELOPMENT  |  Android • Kotlin

Kotlin-Ready Online Guides

Our Guides received a large update – now with Kotlin usage examples.

DEVELOPMENT  |  Insights

A Pragmatic Approach to Cross-Platform

DEVELOPMENT  |  iOS • Tips • Debugging

Debugging Rotation Issues

DEVELOPMENT  |  iOS • Swift • Objective-C • Insights

Surprises with Swift Extensions

DEVELOPMENT  |  Android • Insights

The curious case of Android premultiplied alpha

DEVELOPMENT  |  iOS • Insights

Presentation Controllers and Adaptive Presentations

DEVELOPMENT  |  iOS • Productivity • Insights

Using Ccache for Fun and Profit