The reason to reject my app is ipv6 network connectivity issues.
First, I am using AWS as my backend server. I use my domain name to connect with my server like http://ec2-XX-XXX-XXX-XXX.compute-1.amazonaws.com:80/parse where X is a number
Second, I tried to reproduce the issue by
a) Go to my iPhone setting -> Developer -> Status (Newwork link conditioner) -> create a profile that exactly same as LTE but the Protocol is IPv6
b) Do the same thing as Apple suggest. Use the thunderbolt ethernet to connect my MacBook and share wifi with my iPhone.
My app works in both cases.
Third, I take a look on AWS about supporting IPv6. Here is the link. http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html#AAAAFormat It seems nothing should be changed. I am not quite sure because I am not familiar with server.
Any suggestions? Thanks.
UPDATE
If you are using old apple's Rechability class and if you are using old AFNetworking's AFNetworkReachabilityManager class
Response - I did not implement any code for Reachability or AFNetworking. Should I worry about those classes are inside other sources' Frameworks like Parse?
If you are using hard coded IP addresses
Response: My domain name is http://ec2-XX-XXX-XXX-XXX.compute-1.amazonaws.com:80/parse where X is a number. So, I think this should be fine.
there are few points that frequently cause this issue.
If you are using old apple's Rechability class then replace it with latest one because old Rechability class is not compatible with `ipv6 only network.
Same for old AfNetworking library, if you are using old AFNetworking's AFNetworkReachabilityManager class then replace this class with latest AFNetworkReachabilityManager class or replace whole library with latest one
If you are using hard coded IP addresses as api then replace it with domain name. For example you should not use api like : http://192.168.1.11:4444/login. Your api should be like : http://api.example.com/login
As Apple document states,
Make sure you aren’t passing IPv4 address literals in dot notation to
APIs such as getaddrinfo and SCNetworkReachabilityCreateWithName.
Instead, use high-level network frameworks and address-agnostic
versions of APIs, such as getaddrinfo and getnameinfo, and pass them
hostnames or fully qualified domain names (FQDNs). See getaddrinfo(3)
Mac OS X Developer Tools Manual Page and getnameinfo(3) Mac OS X
Developer Tools Manual Page.
Note: In iOS 9 and OS X 10.11 and later, NSURLSession and CFNetwork
automatically synthesize IPv6 addresses from IPv4 literals locally on
devices operating on DNS64/NAT64 networks. However, you should still
work to rid your code of IP address literals
And your api hosting server should compatible with ipv6 (this is not major concern because almost server are compatible with ipv6)
You can refer Apple documentation for more details
You will come to know that how you can create ipv6 only network on your mac for testing also by above apple documentation!
My app is approved.
The only thing I change is
set the signing to "automatically managing signing" because my app fails to run when I change the build configuration to "Release" (I am not sure is this related to IPv6. I think it is kind of strange)
Reference for other people who use Google Map api, Parse hosting in AWS and Facebook login:
I think their frameworks are good to pass IPv6 requirement.
I am still questioning why Apple said my app fail to pass the IPv6 requirement in my last submission.
Related
My app is working fine on IPad and Iphone when i am testing.I am using AFNetworking 2.0 for API's Calling and apple app review is Rejecting My App Again & Again due to IPv6 Network,i am Using Hard coaded Ip address like http://192.230.66.71/XXXXXXXX/XX/
i am frustrated to this,Please Anybody help me what to do now.
You are not supposed to use hard code IP address according to the Apple's rule.
Don’t Use IP Address Literals
Make sure you aren’t passing IPv4 address literals in dot notation to APIs such as getaddrinfo and SCNetworkReachabilityCreateWithName. Instead, use high-level network frameworks and address-agnostic versions of APIs, such as getaddrinfo and getnameinfo, and pass them hostnames or fully qualified domain names (FQDNs). See getaddrinfo(3) Mac OS X Developer Tools Manual Page and getnameinfo(3) Mac OS X Developer Tools Manual Page.
Note: In iOS 9 and OS X 10.11 and later, NSURLSession and CFNetwork automatically synthesize IPv6 addresses from IPv4 literals locally on devices operating on DNS64/NAT64 networks. However, you should still work to rid your code of IP address literals.
There are two things you should notice in my opinion:
1. Hard code IP address is not recommended, but according to the note above and the search I did that some developers pass the review with IPv4 address literals in their app.
So try not to use IPv4 address literals in your app first, then make sure you notice the second thing I mentioned following.
2. Your app could crash in other network related problems. Like what I comment before.
I will paste it here to make things more clear to you.
Make sure you handle the received data safely. My app was rejected in same reason but I found the real problem is the received data could be server error under some circumstances, which is resulted in crashing the app. I pass the app review by fix that bug.
For example, the app works fine under your network, but it could failed in other place like connection too slow and resulted in timeout. In that case, you will get some server error data or empty data, then if you force unwrap data in your code, the app will crash. And In my case, Apple rejected my app with IPv6 issues, which is not the real problem.
Our update has been rejected many times for ipv6 network connectivity issues. Our networking code has not changed between the previous release and this current release.
once i have just changed the testing credential which we gives apple for testing purpose and my application goes live.so now i am very much fed up with the things.because sometime apple accept and sometime its rejected.but he give the same reason due to ipv6 compatibility issue.
i have refer the apple documentation as well.any one can help me for this..
i have also search lots op link of stack overflow.
thanks in advance.
I have faced similar issue previously.
Steps you need to take care:
No IP Address should be hard coded.
Example: let api = 54.32.55.88 is invalid, use let api = www.mydomain.com
If you are using any Pods make sure they are compatible with IPv6.
Update the Reachability if you are using older.
Check your server configuration if its configured properly. Removing the AAAA if not valid for your configuration
If using AWS, AWS doesn't support IPv6, nor IPv6-only DNS through Route53.
Check some other solutions here.
Yes. I too faced this issue before many times. Apple is now supporting only apps those are compatible with IPv6.
First I tested my application as per their description. I tested on IPv6 but I didn't get any error as they said. So first complete debugging after connecting to IPv6. If you feel, it's working fine then do this.
I found out the IPVersion of my network through different websites. I took screenshots of the network I connected to on mobile and sent those screen shots to apple for review(saying it's a proof of connecting to IPv6).
Here below are the couple of sites that help you in finding out which version you are using.
Test IPv6
Google IPv6 test
Now it's accepted
As of June 1st 2016, all apps submitted to apple must be ipv6 compatible.
Here is the link for the announcement.
Now this comes with a lot of caveat. Basically this would take time to implement and apple started rejecting apps since September end. Now new apps that was being submitted was caught first, but now slowly apple is checking for ipv6 compatibility in old apps that owners are updating too.
Basically what apple tests is they connect their test device into a ipv6 network(their ISP broadcasts ipv6 connectivity), now if your app has a backend server, it should support any device that hits that server with ipv6 connectivity.
You can check whether your backend server is ipv6 compatible from here. Just paste your backend URL in the following and you will be able to see if your backend supports any ping from an ipv6 network.
If it doesn't then you have to make your server ipv6 reachable.
same issue was for me, if you are using Network Reachability class then update it from apple doc here.
Now my app is live with this fix.
I had same type of problem. I made an app which has a screen which only comes when a notification come so they(Apple team) could not able to check my app and giving me IPv6 issue then i told him about my app briefly that how my app works. So point only that tell him(apple team) about your app your problem can be solve.
My app is contentiously rejected by reviewers.They gives me below reason.
Please revise your app and test it on a device while connected to an IPv6 network (all apps must support IPv6) to ensure it will launch without crashing.
I've used objective-c and the api which I used is in php. Also I have used NSURLSession and NSURLConnection for calling the API's.
I'm not using AFnetworking .I have done lots of RNDs from last two days.
Can anyone suggest me how can I solve this issue?
If you are using old Rechability class then replace it with latest one because apple's old Rechability class is not compatible with ipv6 only network. You can get latest Rechability class from here. I am not sure that this is only issue but in many cases ipv6 issue found because of old rechabilty class.
And you should refer this apple documentation also!
My app got rejected with message from Apple as "Your app crashes on iPad running iOS 10.0.2 connected to an IPv6 network.” and also did not get anything from the crash log attached. Please reply whoever resolved this issue.
Actually I am getting server not found error whenever trying to access the api server from ipv6 only network. My api server only supports ipv4 network. Do I need to change anything in api server? Can anyone post any sample code to access api server using NSUrlConnection object that support the ipv6 only network?
If you are using AFNetworking library or Apple's Reachability class, updating your classes, than problem solved.
Don't get confused by that message. I got that too but the problem is not necessarily caused by the IPv6 Network. My feeling is they just write this always even if the error is something else. I had this with an app myself last week but the error was just a completely different reason. Maybe you just look into your code where the problem occurred. They probably wrote at which point in your app it crashed.
App is now approved by the apple review team after increasing the target version to 9.2 previously it was 8.1.
A lot of server environments have not started supporting IPV6 (Think Azure in some configurations). This causes the scenario where the api being used by the app are not useable. Do handle such scenarios in your code.
Apple's own reachability class and some other third party frameworks use low level apis/sockets for their own purpose. These are the problematic areas.
Most of the High level code using NSURLConnection is ok, but if you are using any third party libraries or older versions of AFNetworking, you'll need to check if they are using any sockets. If they are, then look for options/upgrades.
We faced the same issue recently, ended up with lots of fixes to server and third party libs in the app.
My app has to connect to a server which can redistribute a new IP Address for the iOS client device.
How to change the IP Address on iPhone by using code in my app?
The app will not be published on the app store and the iOS devices may be jailbroken if necessary.
Anyone can give some suggestion on coding?
You cannot change ip address with the non-private frameworks that you are allowed to use.
You have to find a different architecture for your server-client communication if you want your app to be published on the app store.
From Apple Documentation : iOS is using DHCP(Dynamic Host Configuration Protocol) protocol. So As per DHCP manual IP settings are not allowed by coding.
To learn more about DHCP read This.