We integrate NFT minting directly into mobile apps for iOS and Android. This involves uploading media to IPFS, generating correct ERC-721 metadata, and calling a smart contract — all while handling connectivity drops and memory constraints on the phone. We have delivered over 15 projects with NFT integration, including connections to major marketplaces, and have accumulated practical solutions to these problems.
Our experience spans Ethereum, Polygon, and Solana networks, working with IPFS via Pinata and NFT.Storage, as well as setting up push notifications for transaction statuses. Lazy minting lets you postpone gas payment until the moment of sale, saving up to 90% of costs compared to regular minting — that's 10 times more profitable for the creator. In this article we will break down the technical details of each stage so you can avoid typical mistakes and make minting convenient for the user.
How to Mint NFT from a Mobile Device?
Minting in a mobile app goes through three stages: selecting and uploading the media file, generating ERC-721 metadata, and sending the transaction to the blockchain. Each stage has its own pitfalls.
Uploading Media to IPFS
For storing media we use the decentralized storage IPFS. On iOS we use PHPickerViewController (available since iOS 14), on Android — PhotoPicker (Android 13) with a fallback to GetContent. The file is sent to the Pinata or NFT.Storage API. Here's an example upload in Swift:
Example upload on iOS Swift
// iOS — upload file to Pinata IPFS func pinFileToIPFS(fileURL: URL, fileName: String) async throws -> String { var request = URLRequest(url: URL(string: "https://api.pinata.cloud/pinning/pinFileToIPFS")!) request.httpMethod = "POST" request.setValue("Bearer \(pinataJWT)", forHTTPHeaderField: "Authorization") let boundary = UUID().uuidString request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") var body = Data() body.append("--\(boundary)\r\nContent-Disposition: form-data; name=\"file\"; filename=\"\(fileName)\"\r\n") body.append("Content-Type: image/jpeg\r\n\r\n") body.append(try Data(contentsOf: fileURL)) body.append("\r\n--\(boundary)--\r\n") request.httpBody = body let (data, _) = try await URLSession.shared.data(for: request) let response = try JSONDecoder().decode(PinataResponse.self, from: data) return "ipfs://\(response.ipfsHash)" } For large files (video from 100 MB) we configure background upload via URLSession with background configuration on iOS and WorkManager with setExpedited on Android. We display progress as a bar and notifications. Average gas fee for minting on Ethereum 0.05 ETH ($100 at current rates), on Polygon — less than $0.01, which makes Polygon 10,000 times cheaper.
Generating ERC-721 Metadata
After uploading the media, you need to generate JSON metadata according to the OpenSea standard. Example in Kotlin:
// Android — forming NFT metadata JSON data class NftMetadata( val name: String, val description: String, val image: String, // ipfs://QmXxx... (CID of uploaded file) val externalUrl: String?, val attributes: List<NftAttribute> ) data class NftAttribute( val traitType: String, val value: String ) // Example result val metadata = NftMetadata( name = "My NFT #1", description = "Created via mobile app", image = "ipfs://QmImageHash...", attributes = listOf( NftAttribute("Background", "Blue"), NftAttribute("Rarity", "Rare") ) ) This JSON is uploaded to IPFS, and the resulting URI is passed to the mint function of the smart contract. We automate attribute generation — the user can add key-value pairs in the interface.
Minting UI Form
The form includes fields: name, description, media, attributes. Real-time NFT preview. The process is broken into three steps with indicators:
- Upload media to IPFS
- Upload metadata
- Minting transaction
Progress is shown at each step. Errors (e.g., insufficient gas) are handled with clear messages.
Why Lazy Minting is Beneficial for Creators?
High gas fees are the main barrier for creators. Lazy minting allows postponing writing the token to the blockchain until the first sale. Instead of an immediate transaction, the creator signs an EIP-712 voucher containing the price and metadata URI. The buyer activates minting at purchase and pays the gas. Lazy minting is 10 times more cost-effective than regular minting for creators.
Comparison of the two approaches:
| Characteristic | Regular Minting | Lazy Minting |
|---|---|---|
| Gas payment | Creator pays (upfront) | Buyer pays at purchase |
| Risk for creator | Gas may cost more than revenue | Minimal — gas only at sale |
| Time to appear on blockchain | Immediately | Only after purchase |
| Integration complexity | Basic | Requires voucher generation and verification (EIP-712) |
We recommend lazy minting for marketplaces and collections with low sales volume. Gas savings can reach 90%.
Our Work Process for Minting Integration
- Analysis — define NFT requirements: standard (ERC-721/1155), network (Ethereum, Polygon, Solana), gas payment methods.
- Design — develop architecture: choose IPFS provider, metadata schema, wallet integration (WalletConnect or embedded).
- Implementation — write minting module: media selection, IPFS upload, metadata generation, contract call. For lazy minting add signing and voucher verification.
- Testing — check on testnet (Goerli, Mumbai), simulate connection drops, test with different file sizes.
- Deployment — publish to App Store and Google Play, integrate with backend if needed.
Stages and timelines:
| Stage | Duration |
|---|---|
| Analysis | 1 day |
| Design | 1-2 days |
| Implementation | 3-5 days |
| Testing | 1-2 days |
| Deployment | 1 day |
What Is Included in the Deliverable
- Source code of the minting module (iOS Swift, Android Kotlin)
- Integration with IPFS (Pinata or NFT.Storage)
- Documentation for smart contract and API
- Push notification setup for transaction status
- Administration guide (provider change, contract update)
- 30-day support after delivery
- Training session for your team (up to 2 hours)
Timeline
The project takes from 5 to 10 working days depending on complexity: basic minting — 5 days, with lazy minting — up to 8 days, with multi-network support — up to 10 days. Contact us for an accurate estimate of your case.
We guarantee compatibility with App Store and Google Play rules, as well as full documentation for independent further development. Order minting development — get a ready-made module in 5-10 days.







