{ "id": "149404", "key": "TIMOB-19149", "fields": { "issuetype": { "id": "4", "description": "An improvement or enhancement to an existing feature or task.", "name": "Improvement", "subtask": false }, "project": { "id": "10153", "key": "TIMOB", "name": "Titanium SDK/CLI", "projectCategory": { "id": "10100", "description": "Titanium and related SDKs used in application development", "name": "Client" } }, "fixVersions": [], "resolution": { "id": "10100", "description": "This issue won't be actioned.", "name": "Won't Do" }, "resolutiondate": "2015-08-24T03:15:06.000+0000", "created": "2015-07-02T20:24:28.000+0000", "epic": { "id": 149396, "key": "TIMOB-19145", "name": "iOS: iOS 9 Updates", "summary": "iOS: iOS9 Updates", "color": { "key": "color_1" }, "done": false }, "priority": { "name": "Critical", "id": "1" }, "labels": [], "versions": [], "issuelinks": [ { "id": "48457", "type": { "id": "10003", "name": "Relates", "inward": "relates to", "outward": "relates to" }, "outwardIssue": { "id": "149888", "key": "TIDOC-2259", "fields": { "summary": "iOS9: Guidelines to adopt IPv6 network requirement for app store submission", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "None", "id": "6" }, "issuetype": { "id": "2", "description": "A new feature of the product, which has yet to be developed.", "name": "New Feature", "subtask": false } } } }, { "id": "48294", "type": { "id": "10003", "name": "Relates", "inward": "relates to", "outward": "relates to" }, "inwardIssue": { "id": "149427", "key": "TIMOB-19154", "fields": { "summary": "iOS9: Replace NSURLConnection in Ti.Network.HTTPClient with NSURLSession", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "Critical", "id": "1" }, "issuetype": { "id": "4", "description": "An improvement or enhancement to an existing feature or task.", "name": "Improvement", "subtask": false } } } } ], "assignee": { "name": "cng", "key": "cng", "displayName": "Chee Kiat Ng", "active": false, "timeZone": "America/Los_Angeles" }, "updated": "2015-08-24T03:15:10.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "10206", "name": "iOS", "description": "iOS Platform" } ], "description": "“Because IPv6 support is so critical to ensuring your applications work across the world for every customer, we are making it an AppStore submission requirement, starting with iOS 9.”\r\n\r\nhttp://www.internetsociety.org/deploy360/blog/2015/06/apple-will-require-ipv6-support-for-all-ios-9-apps/\r\n\r\nh4. Quote from link\r\n{quote}\r\nThree steps all developers can take to make sure their applications work over IPv6 networks:\r\n- Use the networking frameworks (for example, “NSURLSession”)\r\n- Avoid use of IPv4-specific APIs\r\n- Avoid hard-coded IP addresses\r\n\r\nEssentially, if app developers are using the higher level APIs and frameworks and aren’t hacking around at the IP layer, their apps should probably “just work” on top of either IPv4 or IPv6.\r\nThis is an important point – most iOS developers probably do not need to do anything on the development side. Assuming they have followed best practices in coding and are using the iOS networking frameworks, they should be all set. Some developers, though, may be using lower level APIs that may involve direct usage of IPv4 addresses. Some developers may also be using the user’s IPv4 address as an identifier or for logging or configuration purposes.\r\nBut again, most iOS developers probably don’t need to change their code to support IPv6.\r\n{quote}\r\n\r\nApple Guide: [here|https://developer.apple.com/library/prerelease/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1]", "attachment": [ { "id": "56077", "filename": "Screen Shot 2015-07-03 at 11.27.23 am.png", "author": { "name": "cng", "key": "cng", "displayName": "Chee Kiat Ng", "active": false, "timeZone": "America/Los_Angeles" }, "created": "2015-07-03T03:38:30.000+0000", "size": 214872, "mimeType": "image/png" }, { "id": "56076", "filename": "Screen Shot 2015-07-03 at 11.28.08 am.png", "author": { "name": "cng", "key": "cng", "displayName": "Chee Kiat Ng", "active": false, "timeZone": "America/Los_Angeles" }, "created": "2015-07-03T03:38:31.000+0000", "size": 194223, "mimeType": "image/png" }, { "id": "56075", "filename": "Screen Shot 2015-07-03 at 11.29.59 am.png", "author": { "name": "cng", "key": "cng", "displayName": "Chee Kiat Ng", "active": false, "timeZone": "America/Los_Angeles" }, "created": "2015-07-03T03:38:30.000+0000", "size": 85342, "mimeType": "image/png" }, { "id": "56074", "filename": "Screen Shot 2015-07-03 at 11.31.52 am.png", "author": { "name": "cng", "key": "cng", "displayName": "Chee Kiat Ng", "active": false, "timeZone": "America/Los_Angeles" }, "created": "2015-07-03T03:38:30.000+0000", "size": 59803, "mimeType": "image/png" } ], "flagged": false, "summary": "iOS9: Adopt IPv6 requirement for App Store Submissions", "creator": { "name": "ingo", "key": "ingo", "displayName": "Ingo Muschenetz", "active": true, "timeZone": "America/Los_Angeles" }, "subtasks": [], "reporter": { "name": "ingo", "key": "ingo", "displayName": "Ingo Muschenetz", "active": true, "timeZone": "America/Los_Angeles" }, "environment": null, "closedSprints": [ { "id": 445, "state": "closed", "name": "2015 Sprint 15 SDK", "startDate": "2015-07-18T00:30:28.848Z", "endDate": "2015-08-01T00:30:00.000Z", "completeDate": "2015-08-03T01:49:18.234Z", "originBoardId": 114 } ], "comment": { "comments": [ { "id": "356857", "author": { "name": "cng", "key": "cng", "displayName": "Chee Kiat Ng", "active": false, "timeZone": "America/Los_Angeles" }, "body": "h4. To test:\r\nSet up a NAT64 + DNS64 hotspot on El Capitan as instructed on WWDC link. And using any built titanium app, call all methods that access the net to test for this IPv6 Requirement.\r\n\r\nh4. Possible breaking points in Titanium:\r\n- APSHTTPClient\r\n- AsyncSocket.m, AsyncUDPSocket.m\r\n- TiNetworkTCPSocketProxy.m\r\n- Platform.Module.m\r\n- Reachability.m\r\n\r\n", "updateAuthor": { "name": "cng", "key": "cng", "displayName": "Chee Kiat Ng", "active": false, "timeZone": "America/Los_Angeles" }, "created": "2015-07-03T04:16:25.000+0000", "updated": "2015-07-03T04:16:25.000+0000" }, { "id": "357540", "author": { "name": "cng", "key": "cng", "displayName": "Chee Kiat Ng", "active": false, "timeZone": "America/Los_Angeles" }, "body": "h4. Note\r\nPrimarily, app submitted for App Store has to address these:\r\n1. IP address literals embedded in protocols. Many communications protocols, such as Session Initiation Protocol (SIP), File Transfer Protocol (FTP), WebSockets, and Peer-to-Peer Protocol (P2PP), include IP address literals in protocol messages. For example, the FTP parameter commands DATA PORT and PASSIVE exchange information that includes IP address literals. Similarly, IP address literals may appear in the values of SIP header fields, such as To, From, Contact, Record-Route, and Via.\r\n2. IP address literals embedded in configuration files. Configuration files often include IP address literals.\r\n3. Network preflighting. Many apps attempt to proactively check for an Internet connection or an active Wi-Fi connection by passing IP address literals to network reachability APIs.\r\n4. Using raw networking APIs. Some apps work directly with sockets and other raw network APIs such as gethostbyname, gethostbyname2, and inet_aton. These APIs are prone to misuse or only support IPv4—for example, resolving hostnames for the AF_INET address family, rather than the AF_UNSPEC address family.\r\n5. Using small address family storage containers. Some apps and networking libraries use address storage containers—such as uint32_t, in_addr, and sockaddr_in—that are 32-bit in size or smaller.\r\n\r\nh4. How Titanium is affected\r\n1. no IP address literals embedded in SDK. Should write in documents to inform Titanium developers to avoid using IP address literals.\r\n2. Similarly, none embedded in SDK.\r\n3. In this case, possible breaking spot is in Reachability.m., the method *reachabilityWithAddress*. Yet to find exposed titanium methods that access this method. Quoting Apple Reference:\r\n{quote} avoid calling the SCNetworkReachabilityCreateWithAddress method. Call the SCNetworkReachabilityCreateWithName method and pass it a hostname instead.{quote}\r\n4. The SDK has these api exposed for titanium developers, under Ti.Network.Socket, which supports both ipv4 and ipv6. Should document here that they need to use ipv6 when calling these methods for iOS9. However, if Apple is really strict to reject app submissions because we have these in code, even if we don't call them, then we have to think of some solution. This should be unlikely.\r\n5. Titanium SDK has ipv6 storages.\r\n\r\nh4. Conclusion\r\nOther than spending more time to research on (3.), we probably have nothing much to change but advice our titanium developers to avoid using ipv4 or IP address literals. But we have to be prepared for related issues to this when iOS9 is officially out and people start submitting titanium apps in the App Store and getting failed reviews because of this.\r\n", "updateAuthor": { "name": "cng", "key": "cng", "displayName": "Chee Kiat Ng", "active": false, "timeZone": "America/Los_Angeles" }, "created": "2015-07-13T06:58:19.000+0000", "updated": "2015-07-13T06:58:19.000+0000" }, { "id": "358281", "author": { "name": "cng", "key": "cng", "displayName": "Chee Kiat Ng", "active": false, "timeZone": "America/Los_Angeles" }, "updateAuthor": { "name": "cng", "key": "cng", "displayName": "Chee Kiat Ng", "active": false, "timeZone": "America/Los_Angeles" }, "created": "2015-07-24T22:37:05.000+0000", "updated": "2015-07-24T22:37:05.000+0000" }, { "id": "359701", "author": { "name": "emerriman", "key": "emerriman", "displayName": "Eric Merriman ", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Closing in favor of the doc ticket", "updateAuthor": { "name": "emerriman", "key": "emerriman", "displayName": "Eric Merriman ", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2015-08-12T17:50:11.000+0000", "updated": "2015-08-12T17:50:11.000+0000" } ], "maxResults": 4, "total": 4, "startAt": 0 } } }