Unfortunately Safary is blocking 3rd party cookies and this is a big problem for us facebook app developers. The only solution that will work for sure, even with new updates on safari is the one I'll describe above.
I don't know how's your app designed but every app I do has a landing page with a button for users to enter the page.
This buttons has two main purposes, the first one is to request permissions in case de user hasn't granted yet and the other one is to open a new window with the url where my app is located. Because the user is visiting your domain outside the iframe you can create a session, so basically this new window visits my url creates a session and then closes by itself.
You can read more about this, in the question above. Although most of the answers are outdated you'll get an idea of what works and what doesn't
Safari 3rd party cookie iframe trick no longer working?
EDIt
What I have done is after the user presses the button, the app goes to the next page and I open a new window with some javascript (like a pop-up).
So on the landing page you just put a listener to your button (note I'm using jquery)
$(document).on("click", ".bt-landing", function(){
window.open('<?=site_url("app/create_session")?>', '_blank', 'toolbar=0,location=0,menubar=0');
});
This is the code for the controller method "create_session"
public function create_session(){
setcookie("safari_test", "1");
$this->load->view('create_session');
}
And the view that is loaded is this one:
<html>
<head>
<meta charset="utf-8">
<title>App title</title>
<script type="text/javascript" src="<?=base_url('public/js/jquery-1.9.1.min.js')?>"></script>
</head>
<body>
<script type="text/javascript">
$(document).ready(function(){
setTimeout(function(){window.close()},1000);
})
</script>
</body>
</html>