How do you read several tags in one iOS session?
Keep the session alive and let it poll again after each tag. An NDEF session created with invalidateAfterFirstRead set to false reads tag after tag until it times out or is cancelled; with tag objects, the app calls restartPolling after each one. Tags detected before a restart become invalid, and the app should drop them.
Reading messages in a row
An NDEF session created with invalidateAfterFirstRead set to false reads several tags. Apple's documentation of the initializer says each successful read reaches the delegate through readerSession(_:didDetectNDEFs:), until the session times out or is cancelled by the app or the user.
That delegate method needs no help to continue. Its reference says the session restarts polling once the detected tags are out of range, so reading a series takes nothing beyond the delegate.
The series still ends with the session. A timeout invalidates it with readerSessionInvalidationErrorSessionTimeout, and the documentation gives no duration, so an app reading a long series should expect to start a new session.
Restarting polling with tag objects
A delegate that implements readerSession(_:didDetect:) receives tag objects instead, and asks for the next tag itself with restartPolling(). A tag session works the same way.
A restart has a cost. Apple's note on restartPolling() says tags detected before it are invalid and the app should discard its references to them, and the call has no effect on a session already invalidated.
In an NDEF session whose delegate lacks readerSession(_:didDetect:), the call is pointless: the session reports messages and restarts polling by itself. From iOS 26.4, a tag session can restart with a new Configuration, changing its polling options or identifiers between two tags.
Two tags at once
A session can see more than one tag in the same pass. Apple's tag reader sample handles it before writing: it counts the tags, asks the user to remove all of them, and restarts polling after half a second.
The same rule suits reading. Two tags in the field during a series usually means two tags stacked or placed too close together, which the spacing page covers.
Telling the user what happened
alertMessage is where the user looks during a scan. Its documentation says a session reading several tags can update it after each one, from any thread, while the session remains valid.
Use it to count, tag three of ten read, next one. A series without feedback between tags leaves the user guessing whether the last tap counted.
Frequently asked questions
Why does my session stop after the first tag?
invalidateAfterFirstRead is true. Create the session with false to keep reading.
Do I have to call restartPolling after each tag?
Only when the delegate receives tag objects through readerSession(_:didDetect:). With messages only, the session restarts polling by itself once the tags are out of range.
How long does a session last?
Apple documents a timeout error but no duration. Expect the session to end, and start a new one for a long series.
Can I keep using a tag object after restarting polling?
No. Tags detected before a restart are invalid, and Apple asks apps to drop their references to them.