One approach to your 2nd option could be for the app to register the current device with your service upon first launch. If (and when) that device had been registered previously, deny access to cloud functionality. UIDevices identifierForVendor
will be sufficient for the task.
This would still allow the user to use the free month a second time on another device he owns though, or if he switches to a new device.
As an alternative, you could require the user to set up an account with your service, but of course there would be no way to prevent a user from creating multiple accounts.
A combination of both approaches may be able to reduce missuse, but it is unlikely you'd be able to completely suppress such attempts.
If you need to rule missuse out as far as possible, you probably need to stick to your first approach. For your second option you might want to try to factor potential losses from fake accounts / secondary devices into your pricing scheme.
The bottom line answer to your question however is: You can't know for certain if a user has reinstalled your app on a device other than the one he fist installed your app on.
Edit:
Turns out I missed the fact that the value returned by identifierforVendor
won't persist. Unfortunately, that means you'll either need to stick to your first approach or rely on an account system to which the user needs to register. On second thought that may be the better approach - depending on the kind of content the user will be able to store in he cloud, the user might be reluctant to use several accounts anyway since the data in the cloud is tied to the account. Thus, multiple accounts may actually be a non-issue (just like it is impractical to keep multiple dropbox accounts).
So the answer to your question is actually: You can't tell if the user is re-installing your app.