generally any AVR microcontroller, needs a separated bootloader program at the BLS, where you receive data and program the AppSection.. YOU CAN'T PROGRAM the App Section FROM the same AppSection!!! the SPM instruction doesn't work from other section than the BLS....
If you want to use the SPM interrupt (enabling SPMIE) your bootloader code should be in the BLS, and move your interrupts to the BLS, (change IVSEL) don't forget to restore IVSEL when your bootlader ends...
a common way is ALWAYS starts at the bootloader section (BOOTRST=0) and check some condition, if the condition is false, then restore IVSEL and jump to the APPSection, if you need to start the bootloader from the app section, just force the condition,and jump to the BLS, this way, if your main application gets corrupted, the bootloader will always works... (of course if you corrupt the BLS, there is nothing left to do... but what are the boot locking bits for?)